use of com.groupon.mesos.util.UPID in project jesos by groupon.
the class InternalSchedulerDriver method sendMessage.
//
// Remote message delivery
//
@Subscribe
public void sendMessage(final RemoteMessageEnvelope envelope) throws Exception {
final Message message = envelope.getMessage();
final UPID recipient = envelope.getRecipient();
checkState(!recipient.equals(context.getDriverUPID()), "Received a message with local recipient! (%s)", message);
sender.sendHttpMessage(recipient, message);
}
use of com.groupon.mesos.util.UPID in project jesos by groupon.
the class InternalSchedulerDriver method sendFrameworkMessage.
@Override
public Status sendFrameworkMessage(final ExecutorID executorId, final SlaveID slaveId, final byte[] data) {
checkNotNull(executorId, "executorId is null");
checkNotNull(slaveId, "slaveId is null");
checkNotNull(data, "data is null");
if (!context.isStateMachine(DRIVER_RUNNING)) {
return context.getStateMachine();
}
final FrameworkToExecutorMessage message = FrameworkToExecutorMessage.newBuilder().setFrameworkId(context.getFrameworkId()).setExecutorId(executorId).setSlaveId(slaveId).setData(ByteString.copyFrom(data)).build();
// directly to the slave, otherwise to the master and let the master sort it out.
if (context.containsSlave(message.getSlaveId())) {
final UPID slave = context.getSlaveUPID(message.getSlaveId());
eventBus.post(new RemoteMessageEnvelope(context.getDriverUPID(), slave, message));
} else {
eventBus.post(new RemoteMessageEnvelope(context.getDriverUPID(), context.getMasterUPID(), message));
}
return context.getStateMachine();
}
use of com.groupon.mesos.util.UPID in project jesos by groupon.
the class LocalSchedulerMessageProcessor method driverIsConnected.
private boolean driverIsConnected(final UPID messageSender) {
final MasterInfo master = context.connectedMaster();
if (master == null) {
LOG.warn("Received message from %s, but no master is leading, ignoring!", messageSender);
return false;
}
// Master PID may have changed in the context in the meantime. Don't rely on the context
// to be up to date but resolve the MasterInfo that was retrieved earlier.
final UPID masterUpid = UPID.create(master.getPid());
if (!masterUpid.equals(messageSender)) {
LOG.warn("Received message from %s, leading master is %s, ignoring!", messageSender, masterUpid);
return false;
}
return true;
}
use of com.groupon.mesos.util.UPID in project jesos by groupon.
the class LocalSchedulerMessageProcessor method frameworkError.
@Subscribe
public void frameworkError(final FrameworkErrorMessageEnvelope envelope) {
checkState(envelope.getRecipient().equals(context.getDriverUPID()), "Received a remote message for local delivery");
final UPID sender = envelope.getSender();
if (!driverIsConnected(sender)) {
return;
}
final FrameworkErrorMessage frameworkErrorMessage = envelope.getMessage();
eventBus.post(new SchedulerCallback() {
@Override
public Runnable getCallback(final Scheduler scheduler, final SchedulerDriver schedulerDriver) {
return new Runnable() {
@Override
public void run() {
schedulerDriver.abort();
scheduler.error(schedulerDriver, frameworkErrorMessage.getMessage());
}
};
}
});
}
use of com.groupon.mesos.util.UPID in project jesos by groupon.
the class LocalSchedulerMessageProcessor method frameworkStatusUpdate.
@Subscribe
public void frameworkStatusUpdate(final StatusUpdateMessageEnvelope envelope) throws IOException {
checkState(envelope.getRecipient().equals(context.getDriverUPID()), "Received a remote message for local delivery");
final UPID sender = envelope.getSender();
if (!driverIsConnected(sender)) {
return;
}
final StatusUpdateMessage statusUpdateMessage = envelope.getMessage();
final FrameworkID frameworkId = context.getFrameworkId();
final FrameworkID messageFrameworkId = statusUpdateMessage.getUpdate().getFrameworkId();
checkState(frameworkId.equals(messageFrameworkId), "Received Message for framework %s, but local id is %s", messageFrameworkId, frameworkId);
final TaskStatus.Builder taskStatusBuilder = TaskStatus.newBuilder(statusUpdateMessage.getUpdate().getStatus());
final TaskStatus taskStatus;
// If the update is driver-generated or master-generated, it does not require acknowledgement (from Mesos source code, sched.cpp).
final Optional<UPID> pid = statusUpdateMessage.hasPid() ? Optional.of(UPID.create(statusUpdateMessage.getPid())) : Optional.<UPID>absent();
final boolean noAckRequired = envelope.getSender().equals(context.getDriverUPID()) || pid.isPresent() && pid.get().equals(context.getDriverUPID());
if (noAckRequired) {
taskStatus = taskStatusBuilder.clearUuid().build();
} else {
taskStatus = taskStatusBuilder.setUuid(statusUpdateMessage.getUpdate().getUuid()).build();
}
eventBus.post(new SchedulerCallback() {
@Override
public Runnable getCallback(final Scheduler scheduler, final SchedulerDriver schedulerDriver) {
return new Runnable() {
@Override
public void run() {
scheduler.statusUpdate(schedulerDriver, taskStatus);
}
};
}
});
if (implicitAcknowledgements && !noAckRequired) {
final StatusUpdateAcknowledgementMessage statusUpdateAcknowledgementMessage = StatusUpdateAcknowledgementMessage.newBuilder().setFrameworkId(frameworkId).setSlaveId(statusUpdateMessage.getUpdate().getSlaveId()).setTaskId(taskStatus.getTaskId()).setUuid(statusUpdateMessage.getUpdate().getUuid()).build();
eventBus.post(new RemoteMessageEnvelope(context.getDriverUPID(), context.getMasterUPID(), statusUpdateAcknowledgementMessage));
}
}
Aggregations