use of org.apache.mesos.v1.Protos.FrameworkInfo in project Singularity by HubSpot.
the class SingularityMesosSchedulerClient method subscribe.
/**
* The first call to mesos, needed to setup connection properly and identify
* a framework.
*
* @throws URISyntaxException if the URL provided was not a syntactically correct URL.
*/
public void subscribe(String mesosMasterURI, SingularityMesosScheduler scheduler) throws URISyntaxException {
FrameworkInfo frameworkInfo = buildFrameworkInfo();
if (mesosMasterURI == null || mesosMasterURI.contains("zk:")) {
throw new IllegalArgumentException(String.format("Must use master address for http api (e.g. http://localhost:5050/api/v1/scheduler) was %s", mesosMasterURI));
}
if (openStream == null || openStream.isUnsubscribed()) {
// Do we get here ever?
if (subscriberThread != null) {
subscriberThread.interrupt();
}
subscriberThread = new Thread() {
public void run() {
try {
connect(URI.create(mesosMasterURI), frameworkInfo, scheduler);
} catch (RuntimeException | URISyntaxException e) {
LOG.error("Could not connect: ", e);
scheduler.onConnectException(e);
}
}
};
subscriberThread.start();
}
}
use of org.apache.mesos.v1.Protos.FrameworkInfo in project Singularity by HubSpot.
the class SingularityMesosSchedulerClient method connect.
/**
* Sets up the connection and is blocking in wait for calls from mesos
* master.
*/
private void connect(URI mesosMasterURI, FrameworkInfo frameworkInfo, SingularityMesosScheduler scheduler) throws URISyntaxException {
MesosClientBuilder<Call, Event> clientBuilder = ProtobufMesosClientBuilder.schedulerUsingProtos().mesosUri(mesosMasterURI).applicationUserAgentEntry(UserAgentEntries.userAgentEntryForMavenArtifact("com.hubspot.singularity", "SingularityService")).onSendEventBackpressureBuffer().onSendErrorRetry().onBackpressureBuffer(scheduler.getEventBufferSize(), () -> {
String message = String.format("Overflow of event buffer (%s), singularity could not keep up!", scheduler.getEventBufferSize());
scheduler.onUncaughtException(new EventBufferOverflowException(message));
}, BackpressureOverflow.ON_OVERFLOW_ERROR);
Call subscribeCall = Call.newBuilder().setType(Call.Type.SUBSCRIBE).setFrameworkId(frameworkInfo.getId()).setSubscribe(Call.Subscribe.newBuilder().setFrameworkInfo(frameworkInfo).build()).build();
MesosClientBuilder<Call, Event> subscribe = clientBuilder.subscribe(subscribeCall);
this.scheduler = scheduler;
subscribe.processStream(unicastEvents -> {
final Observable<Event> events = unicastEvents.share();
events.filter(event -> event.getType() == Event.Type.ERROR).map(event -> event.getError().getMessage()).subscribe(scheduler::error, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.FAILURE).map(Event::getFailure).subscribe(scheduler::failure, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.HEARTBEAT).subscribe(scheduler::heartbeat, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.INVERSE_OFFERS).map(event -> event.getInverseOffers().getInverseOffersList()).subscribe(scheduler::inverseOffers, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.MESSAGE).map(Event::getMessage).subscribe(scheduler::message, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.OFFERS).map(event -> event.getOffers().getOffersList()).subscribe(scheduler::resourceOffers, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.RESCIND).map(event -> event.getRescind().getOfferId()).subscribe(scheduler::rescind, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.RESCIND_INVERSE_OFFER).map(event -> event.getRescindInverseOffer().getInverseOfferId()).subscribe(scheduler::rescindInverseOffer, scheduler::onUncaughtException);
events.filter(event -> event.getType() == Event.Type.SUBSCRIBED).map(Event::getSubscribed).subscribe(subscribed -> {
this.frameworkId = subscribed.getFrameworkId();
scheduler.subscribed(subscribed);
}, scheduler::onSubscribeException);
events.filter(event -> event.getType() == Event.Type.UPDATE).map(event -> event.getUpdate().getStatus()).filter(status -> {
if (!status.hasAgentId() || !status.getAgentId().hasValue()) {
LOG.warn("Filtering out status update without agentId {}", status);
return false;
} else {
return true;
}
}).subscribe(scheduler::statusUpdate, scheduler::onUncaughtException);
// This is the observable that is responsible for sending calls to mesos master.
PublishSubject<Optional<SinkOperation<Call>>> p = PublishSubject.create();
// toSerialised handles the fact that we can add calls on different threads.
publisher = p.toSerialized();
return publisher.onBackpressureBuffer();
});
MesosClient<Call, Event> client = clientBuilder.build();
openStream = client.openStream();
try {
openStream.await();
} catch (Throwable t) {
if (Throwables.getCausalChain(t).stream().anyMatch(throwable -> throwable instanceof InterruptedException)) {
LOG.warn("Observable interrupted, closed stream from mesos");
} else {
LOG.error("Observable was unexpectedly closed", t);
scheduler.onUncaughtException(t);
}
}
}
use of org.apache.mesos.v1.Protos.FrameworkInfo in project Singularity by HubSpot.
the class SingularityMesosSchedulerClient method subscribe.
/**
* The first call to mesos, needed to setup connection properly and identify
* a framework.
*
* @throws URISyntaxException if the URL provided was not a syntactically correct URL.
*/
public void subscribe(URI mesosMasterURI, SingularityMesosScheduler scheduler) throws URISyntaxException {
FrameworkInfo frameworkInfo = buildFrameworkInfo();
if (mesosMasterURI == null || mesosMasterURI.getScheme().contains("zk")) {
throw new IllegalArgumentException(String.format("Must use master address for http api (e.g. http://localhost:5050/api/v1/scheduler) was %s", mesosMasterURI));
}
if (openStream == null || openStream.isUnsubscribed()) {
// Do we get here ever?
if (subscriberThread != null) {
subscriberThread.interrupt();
}
subscriberThread = new Thread() {
public void run() {
try {
connect(mesosMasterURI, frameworkInfo, scheduler);
} catch (RuntimeException | URISyntaxException e) {
if (!Throwables.getCausalChain(e).stream().anyMatch(t -> t instanceof InterruptedException)) {
LOG.error("Could not connect: ", e);
scheduler.onSubscribeException(e);
} else {
LOG.warn("Interruped stream from mesos on subscriber thread, closing");
}
}
}
};
subscriberThread.start();
}
}
Aggregations