/// accept and notify only Active producers. private bool IsActiveProducer(IStreamProducerExtension producer) { var grainRef = producer as GrainReference; if (grainRef != null && grainRef.GrainId.IsSystemTarget && grainRef.IsInitializedSystemTarget) { return(siloStatusOracle.GetApproximateSiloStatus(grainRef.SystemTargetSilo) == SiloStatus.Active); } return(true); }
private async Task ExecuteProducerTask(PubSubPublisherState producer, Task producerTask) { try { await producerTask; } catch (GrainExtensionNotInstalledException) { RemoveProducer(producer); } catch (ClientNotAvailableException) { RemoveProducer(producer); } catch (OrleansMessageRejectionException) { var grainRef = producer.Producer as GrainReference; // if producer is a system target on and unavailable silo, remove it. if (grainRef == null || grainRef.GrainId.IsSystemTarget && siloStatusOracle.GetApproximateSiloStatus(grainRef.SystemTargetSilo).IsUnavailable()) { RemoveProducer(producer); } else // otherwise, throw { throw; } } }