예제 #1
0
        /// <inheritdoc />
        public override void GlobalBeforeEnteringState <Key, Value>(SystemState next, FasterKV <Key, Value> faster)
        {
            switch (next.Phase)
            {
            case Phase.PREPARE:
                faster._hybridLogCheckpoint = faster._lastSnapshotCheckpoint;
                base.GlobalBeforeEnteringState(next, faster);
                faster._hybridLogCheckpoint.info.startLogicalAddress = faster.hlog.FlushedUntilAddress;
                faster._hybridLogCheckpoint.prevVersion = next.Version;
                break;

            case Phase.WAIT_FLUSH:
                base.GlobalBeforeEnteringState(next, faster);
                faster._hybridLogCheckpoint.info.finalLogicalAddress = 0;
                faster.ObtainCurrentTailAddress(ref faster._hybridLogCheckpoint.info.finalLogicalAddress);

                if (faster._hybridLogCheckpoint.deltaLog == null)
                {
                    faster._hybridLogCheckpoint.deltaFileDevice = faster.checkpointManager.GetDeltaLogDevice(faster._hybridLogCheckpointToken);
                    faster._hybridLogCheckpoint.deltaFileDevice.Initialize(-1);
                    faster._hybridLogCheckpoint.deltaLog = new DeltaLog(faster._hybridLogCheckpoint.deltaFileDevice, faster.hlog.LogPageSizeBits, -1);
                    faster._hybridLogCheckpoint.deltaLog.InitializeForWrites(faster.hlog.bufferPool);
                }

                faster.hlog.AsyncFlushDeltaToDevice(
                    faster._hybridLogCheckpoint.info.startLogicalAddress,
                    faster._hybridLogCheckpoint.info.finalLogicalAddress,
                    faster._lastSnapshotCheckpoint.info.finalLogicalAddress,
                    faster._hybridLogCheckpoint.prevVersion,
                    faster._hybridLogCheckpoint.deltaLog);
                break;

            case Phase.PERSISTENCE_CALLBACK:
                faster._hybridLogCheckpoint.info.flushedLogicalAddress = faster.hlog.FlushedUntilAddress;
                CollectMetadata(next, faster);
                faster.WriteHybridLogIncrementalMetaInfo(faster._hybridLogCheckpoint.deltaLog);
                faster._hybridLogCheckpoint.info.deltaTailAddress = faster._hybridLogCheckpoint.deltaLog.TailAddress;
                faster._lastSnapshotCheckpoint = faster._hybridLogCheckpoint.Transfer();
                faster._hybridLogCheckpoint.Dispose();
                break;
            }
        }