Ejemplo n.º 1
0
        private EpochRecord WriteEpochRecordWithRetry(int epochNumber, Guid epochId, long lastEpochPosition,
                                                      Guid instanceId)
        {
            long pos   = _writer.Checkpoint.ReadNonFlushed();
            var  epoch = new EpochRecord(pos, epochNumber, epochId, lastEpochPosition, DateTime.UtcNow, instanceId);
            var  rec   = _recordFactory.CreateEpoch(epoch);

            Log.Debug(
                "=== Writing E{epochNumber}@{epochPosition}:{epochId:B} (previous epoch at {lastEpochPosition}). L={leaderId:B}.",
                epochNumber, epoch.EpochPosition, epochId, lastEpochPosition, epoch.LeaderInstanceId);
            if (!_writer.Write(rec, out pos))
            {
                epoch = new EpochRecord(pos, epochNumber, epochId, lastEpochPosition, DateTime.UtcNow, instanceId);
                rec   = _recordFactory.CreateEpoch(epoch);

                if (!_writer.Write(rec, out pos))
                {
                    throw new Exception($"Second write try failed at {epoch.EpochPosition}.");
                }
            }
            _partitionManager.Initialize();
            WriteEpochInformationWithRetry(epoch);
            _writer.Flush();
            _bus.Publish(new ReplicationTrackingMessage.WriterCheckpointFlushed());
            _bus.Publish(new SystemMessage.EpochWritten(epoch));
            return(epoch);
        }
        private EpochRecord WriteEpoch(int epochNumber, long lastPos, Guid instanceId)
        {
            long pos   = _writer.Checkpoint.ReadNonFlushed();
            var  epoch = new EpochRecord(pos, epochNumber, Guid.NewGuid(), lastPos, DateTime.UtcNow, instanceId);
            var  rec   = _recordFactory.CreateEpoch(epoch);

            _writer.Write(rec, out _);
            _writer.Flush();
            return(epoch);
        }