internal ClusteredServiceAgent(ClusteredServiceContainer.Context ctx) { this.ctx = ctx; archiveCtx = ctx.ArchiveContext(); aeron = ctx.Aeron(); service = ctx.ClusteredService(); idleStrategy = ctx.IdleStrategy(); serviceId = ctx.ServiceId(); epochClock = ctx.EpochClock(); markFile = ctx.MarkFile(); var channel = ctx.ServiceControlChannel(); _consensusModuleProxy = new ConsensusModuleProxy(aeron.AddPublication(channel, ctx.ConsensusModuleStreamId())); _serviceAdapter = new ServiceAdapter(aeron.AddSubscription(channel, ctx.ServiceStreamId()), this); UnsafeBuffer headerBuffer = new UnsafeBuffer(new byte[SESSION_HEADER_LENGTH]); _egressMessageHeaderEncoder.WrapAndApplyHeader(headerBuffer, 0, new MessageHeaderEncoder()); _vectors[0] = new DirectBufferVector(headerBuffer, 0, SESSION_HEADER_LENGTH); _vectors[1] = _messageVector; }
internal ClusteredServiceAgent(ClusteredServiceContainer.Context ctx) { this.ctx = ctx; headerVector = new DirectBufferVector(headerBuffer, 0, headerBuffer.Capacity); abortHandler = Abort; archiveCtx = ctx.ArchiveContext(); aeron = ctx.Aeron(); aeronAgentInvoker = ctx.Aeron().ConductorAgentInvoker; service = ctx.ClusteredService(); idleStrategy = ctx.IdleStrategy(); serviceId = ctx.ServiceId(); epochClock = ctx.EpochClock(); markFile = ctx.MarkFile(); var channel = ctx.ServiceControlChannel(); _consensusModuleProxy = new ConsensusModuleProxy(aeron.AddPublication(channel, ctx.ConsensusModuleStreamId())); _serviceAdapter = new ServiceAdapter(aeron.AddSubscription(channel, ctx.ServiceStreamId()), this); _sessionMessageHeaderEncoder.WrapAndApplyHeader(headerBuffer, 0, new MessageHeaderEncoder()); aeron.AddCloseHandler(abortHandler); }
internal ClusteredServiceAgent(ClusteredServiceContainer.Context ctx) { this.ctx = ctx; archiveCtx = ctx.ArchiveContext(); aeron = ctx.Aeron(); service = ctx.ClusteredService(); idleStrategy = ctx.IdleStrategy(); serviceId = ctx.ServiceId(); epochClock = ctx.EpochClock(); markFile = ctx.MarkFile(); var channel = ctx.ServiceControlChannel(); _consensusModuleProxy = new ConsensusModuleProxy(aeron.AddPublication(channel, ctx.ConsensusModuleStreamId())); _serviceAdapter = new ServiceAdapter(aeron.AddSubscription(channel, ctx.ServiceStreamId()), this); }
internal ClusteredServiceAgent(ClusteredServiceContainer.Context ctx) { this.ctx = ctx; archiveCtx = ctx.ArchiveContext(); aeron = ctx.Aeron(); shouldCloseResources = ctx.OwnsAeronClient(); service = ctx.ClusteredService(); recordingLog = ctx.RecordingLog(); idleStrategy = ctx.IdleStrategy(); serviceId = ctx.ServiceId(); epochClock = ctx.EpochClock(); markFile = ctx.MarkFile(); var channel = ctx.ServiceControlChannel(); var streamId = ctx.ServiceControlStreamId(); serviceControlPublisher = new ServiceControlPublisher(aeron.AddPublication(channel, streamId)); serviceControlAdapter = new ServiceControlAdapter(aeron.AddSubscription(channel, streamId), this); }
/// <summary> /// Set the <seealso cref="AeronArchive.Context"/> that should be used for communicating with the local Archive. /// </summary> /// <param name="archiveContext"> that should be used for communicating with the local Archive. </param> /// <returns> this for a fluent API. </returns> public Context ArchiveContext(AeronArchive.Context archiveContext) { this.archiveContext = archiveContext; return(this); }
public void Conclude() { if (null == threadFactory) { threadFactory = new DefaultThreadFactory(); } if (null == idleStrategySupplier) { idleStrategySupplier = Configuration.IdleStrategySupplier(null); } if (null == epochClock) { epochClock = new SystemEpochClock(); } if (null == errorHandler) { throw new InvalidOperationException("Error handler must be supplied"); } if (null == aeron) { aeron = Adaptive.Aeron.Aeron.Connect( new Aeron.Aeron.Context() .AeronDirectoryName(aeronDirectoryName) .ErrorHandler(countedErrorHandler.OnError) .EpochClock(epochClock)); if (null == errorCounter) { errorCounter = aeron.AddCounter(SYSTEM_COUNTER_TYPE_ID, "Cluster errors - service " + serviceId); } ownsAeronClient = true; } if (null == errorCounter) { throw new InvalidOperationException("Error counter must be supplied"); } if (null == countedErrorHandler) { countedErrorHandler = new CountedErrorHandler(errorHandler, errorCounter); if (ownsAeronClient) { aeron.Ctx().ErrorHandler(countedErrorHandler.OnError); } } if (null == archiveContext) { archiveContext = new AeronArchive.Context() .ControlRequestChannel(AeronArchive.Configuration.LocalControlChannel()) .ControlResponseChannel(AeronArchive.Configuration.LocalControlChannel()) .ControlRequestStreamId(AeronArchive.Configuration.LocalControlStreamId()); } archiveContext .AeronClient(aeron) .OwnsAeronClient(false) .Lock(new NoOpLock()); if (deleteDirOnStart) { if (null != clusteredServiceDir) { IoUtil.Delete(clusteredServiceDir, true); } else { IoUtil.Delete(new DirectoryInfo(Configuration.ClusteredServiceDirName()), true); } } if (null == clusteredServiceDir) { clusteredServiceDir = new DirectoryInfo(clusteredServiceDirectoryName); } if (!clusteredServiceDir.Exists) { Directory.CreateDirectory(clusteredServiceDir.FullName); } if (null == recordingLog) { recordingLog = new RecordingLog(clusteredServiceDir); } if (null == shutdownSignalBarrier) { shutdownSignalBarrier = new ShutdownSignalBarrier(); } if (null == terminationHook) { terminationHook = () => shutdownSignalBarrier.Signal(); } if (null == clusteredService) { string className = Config.GetProperty(Configuration.SERVICE_CLASS_NAME_PROP_NAME); if (null == className) { throw new InvalidOperationException("Either a ClusteredService instance or class name for the service must be provided"); } clusteredService = (IClusteredService)Activator.CreateInstance(Type.GetType(className)); } ConcludeMarkFile(); }
public void Conclude() { if (serviceId < 0) { throw new ConfigurationException("service id must be not be negative: " + serviceId); } if (null == threadFactory) { threadFactory = new DefaultThreadFactory(); } if (null == idleStrategySupplier) { idleStrategySupplier = Configuration.IdleStrategySupplier(null); } if (null == epochClock) { epochClock = new SystemEpochClock(); } if (null == clusterDir) { clusterDir = new DirectoryInfo(clusteredServiceDirectoryName); } if (!clusterDir.Exists) { Directory.CreateDirectory(clusterDir.FullName); } if (null == markFile) { markFile = new ClusterMarkFile( new FileInfo(Path.Combine(clusterDir.FullName, ClusterMarkFile.MarkFilenameForService(serviceId))), ClusterComponentType.CONTAINER, errorBufferLength, epochClock, 0); } if (null == errorLog) { errorLog = new DistinctErrorLog(markFile.ErrorBuffer, epochClock); } if (null == errorHandler) { errorHandler = new LoggingErrorHandler(errorLog).OnError; // TODO Use interface } if (null == aeron) { aeron = Adaptive.Aeron.Aeron.Connect( new Aeron.Aeron.Context() .AeronDirectoryName(aeronDirectoryName) .ErrorHandler(errorHandler) .EpochClock(epochClock)); ownsAeronClient = true; } if (null == errorCounter) { errorCounter = aeron.AddCounter(SYSTEM_COUNTER_TYPE_ID, "Cluster errors - service " + serviceId); } if (null == countedErrorHandler) { countedErrorHandler = new CountedErrorHandler(errorHandler, errorCounter); if (ownsAeronClient) { aeron.Ctx().ErrorHandler(countedErrorHandler.OnError); } } if (null == archiveContext) { archiveContext = new AeronArchive.Context() .ControlRequestChannel(AeronArchive.Configuration.LocalControlChannel()) .ControlResponseChannel(AeronArchive.Configuration.LocalControlChannel()) .ControlRequestStreamId(AeronArchive.Configuration.LocalControlStreamId()); } archiveContext .AeronClient(aeron) .OwnsAeronClient(false) .Lock(new NoOpLock()); if (null == shutdownSignalBarrier) { shutdownSignalBarrier = new ShutdownSignalBarrier(); } if (null == terminationHook) { terminationHook = () => shutdownSignalBarrier.Signal(); } if (null == clusteredService) { string className = Config.GetProperty(Configuration.SERVICE_CLASS_NAME_PROP_NAME); if (null == className) { throw new ClusterException("either a ClusteredService instance or class name for the service must be provided"); } clusteredService = (IClusteredService)Activator.CreateInstance(Type.GetType(className)); } ConcludeMarkFile(); }