/// <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; } }