private void GetRecoveryInfoFromLatestCheckpoints(out HybridLogCheckpointInfo recoveredHLCInfo, out IndexCheckpointInfo recoveredICInfo) { Debug.WriteLine("********* Primary Recovery Information ********"); recoveredHLCInfo = default; foreach (var hybridLogToken in checkpointManager.GetLogCheckpointTokens()) { try { recoveredHLCInfo = new HybridLogCheckpointInfo(); recoveredHLCInfo.Recover(hybridLogToken, checkpointManager, hlog.LogPageSizeBits); } catch { continue; } Debug.WriteLine("HybridLog Checkpoint: {0}", hybridLogToken); break; } if (recoveredHLCInfo.IsDefault()) { throw new FasterException("Unable to find valid index token"); } recoveredHLCInfo.info.DebugPrint(); recoveredICInfo = default; foreach (var indexToken in checkpointManager.GetIndexCheckpointTokens()) { try { // Recovery appropriate context information recoveredICInfo = new IndexCheckpointInfo(); recoveredICInfo.Recover(indexToken, checkpointManager); } catch { continue; } if (!IsCompatible(recoveredICInfo.info, recoveredHLCInfo.info)) { recoveredICInfo = default; continue; } Debug.WriteLine("Index Checkpoint: {0}", indexToken); recoveredICInfo.info.DebugPrint(); break; } if (recoveredICInfo.IsDefault()) { Debug.WriteLine("No index checkpoint found, recovering from beginning of log"); } }
private void InternalRecover(Guid indexToken, Guid hybridLogToken) { Debug.WriteLine("********* Primary Recovery Information ********"); Debug.WriteLine("Index Checkpoint: {0}", indexToken); Debug.WriteLine("HybridLog Checkpoint: {0}", hybridLogToken); // Recovery appropriate context information var recoveredICInfo = new IndexCheckpointInfo(); recoveredICInfo.Recover(indexToken, checkpointManager); recoveredICInfo.info.DebugPrint(); var recoveredHLCInfo = new HybridLogCheckpointInfo(); recoveredHLCInfo.Recover(hybridLogToken, checkpointManager); recoveredHLCInfo.info.DebugPrint(); // Check if the two checkpoints are compatible for recovery if (!IsCompatible(recoveredICInfo.info, recoveredHLCInfo.info)) { throw new Exception("Cannot recover from (" + indexToken.ToString() + "," + hybridLogToken.ToString() + ") checkpoint pair!\n"); } // Set new system state after recovery var v = recoveredHLCInfo.info.version; _systemState.phase = Phase.REST; _systemState.version = (v + 1); // Recover fuzzy index from checkpoint RecoverFuzzyIndex(recoveredICInfo); // Recover segment offsets for object log if (recoveredHLCInfo.info.objectLogSegmentOffsets != null) { Array.Copy(recoveredHLCInfo.info.objectLogSegmentOffsets, hlog.GetSegmentOffsets(), recoveredHLCInfo.info.objectLogSegmentOffsets.Length); } // Make index consistent for version v if (FoldOverSnapshot) { RecoverHybridLog(recoveredICInfo.info, recoveredHLCInfo.info); } else { RecoverHybridLogFromSnapshotFile(recoveredICInfo.info, recoveredHLCInfo.info); } // Read appropriate hybrid log pages into memory RestoreHybridLog(recoveredHLCInfo.info.finalLogicalAddress, recoveredHLCInfo.info.headAddress, recoveredHLCInfo.info.beginAddress); // Recover session information _recoveredSessions = recoveredHLCInfo.info.continueTokens; }
private void InternalRecover(Guid indexToken, Guid hybridLogToken) { Debug.WriteLine("********* Primary Recovery Information ********"); Debug.WriteLine("Index Checkpoint: {0}", indexToken); Debug.WriteLine("HybridLog Checkpoint: {0}", hybridLogToken); // Assert corresponding checkpoints are safe to recover from Debug.Assert(IsCheckpointSafe(indexToken, CheckpointType.INDEX_ONLY), "Cannot recover from incomplete index checkpoint " + indexToken.ToString()); Debug.Assert(IsCheckpointSafe(hybridLogToken, CheckpointType.HYBRID_LOG_ONLY), "Cannot recover from incomplete hybrid log checkpoint " + hybridLogToken.ToString()); // Recovery appropriate context information var recoveredICInfo = new IndexCheckpointInfo(); recoveredICInfo.Recover(indexToken, directoryConfiguration); recoveredICInfo.info.DebugPrint(); var recoveredHLCInfo = new HybridLogCheckpointInfo(); recoveredHLCInfo.Recover(hybridLogToken, directoryConfiguration); recoveredHLCInfo.info.DebugPrint(); // Check if the two checkpoints are compatible for recovery if (!IsCompatible(recoveredICInfo.info, recoveredHLCInfo.info)) { throw new Exception("Cannot recover from (" + indexToken.ToString() + "," + hybridLogToken.ToString() + ") checkpoint pair!\n"); } // Set new system state after recovery var v = recoveredHLCInfo.info.version; _systemState.phase = Phase.REST; _systemState.version = (v + 1); // Recover fuzzy index from checkpoint RecoverFuzzyIndex(recoveredICInfo); // Recover segment offsets for object log if (recoveredHLCInfo.info.objectLogSegmentOffsets != null) { Array.Copy(recoveredHLCInfo.info.objectLogSegmentOffsets, hlog.GetSegmentOffsets(), recoveredHLCInfo.info.objectLogSegmentOffsets.Length); } // Make index consistent for version v if (FoldOverSnapshot) { RecoverHybridLog(recoveredICInfo.info, recoveredHLCInfo.info); } else { RecoverHybridLogFromSnapshotFile(recoveredICInfo.info, recoveredHLCInfo.info); } // Read appropriate hybrid log pages into memory RestoreHybridLog(recoveredHLCInfo.info.finalLogicalAddress); // Recover session information _recoveredSessions = new SafeConcurrentDictionary <Guid, long>(); foreach (var sessionInfo in recoveredHLCInfo.info.continueTokens) { _recoveredSessions.GetOrAdd(sessionInfo.Key, sessionInfo.Value); } }
private void InternalRecoverFromLatestCheckpoints(int numPagesToPreload, bool undoFutureVersions) { Debug.WriteLine("********* Primary Recovery Information ********"); HybridLogCheckpointInfo recoveredHLCInfo = default; foreach (var hybridLogToken in checkpointManager.GetLogCheckpointTokens()) { try { recoveredHLCInfo = new HybridLogCheckpointInfo(); recoveredHLCInfo.Recover(hybridLogToken, checkpointManager); } catch { continue; } Debug.WriteLine("HybridLog Checkpoint: {0}", hybridLogToken); break; } if (recoveredHLCInfo.IsDefault()) { throw new FasterException("Unable to find valid index token"); } recoveredHLCInfo.info.DebugPrint(); IndexCheckpointInfo recoveredICInfo = default; foreach (var indexToken in checkpointManager.GetIndexCheckpointTokens()) { try { // Recovery appropriate context information recoveredICInfo = new IndexCheckpointInfo(); recoveredICInfo.Recover(indexToken, checkpointManager); } catch { continue; } if (!IsCompatible(recoveredICInfo.info, recoveredHLCInfo.info)) { recoveredICInfo = default; continue; } Debug.WriteLine("Index Checkpoint: {0}", indexToken); recoveredICInfo.info.DebugPrint(); break; } if (recoveredICInfo.IsDefault()) { Debug.WriteLine("No index checkpoint found, recovering from beginning of log"); } InternalRecover(recoveredICInfo, recoveredHLCInfo, numPagesToPreload, undoFutureVersions); }