/// <summary> /// /// </summary> /// <param name="_segmentId"></param> /// <returns></returns> // Can be used to pre-load handles, e.g., after a checkpoint protected SafeFileHandle GetOrAddHandle(int _segmentId) { if (logHandles.TryGetValue(_segmentId, out SafeFileHandle h)) { return(h); } return(logHandles.GetOrAdd(_segmentId, segmentId => CreateHandle(segmentId))); }
/// <summary> /// /// </summary> /// <param name="_segmentId"></param> /// <returns></returns> // Can be used to pre-load handles, e.g., after a checkpoint protected SafeFileHandle GetOrAddHandle(int _segmentId) { if (logHandles.TryGetValue(_segmentId, out SafeFileHandle h)) { return(h); } if (_disposed) { return(null); } var result = logHandles.GetOrAdd(_segmentId, segmentId => CreateHandle(segmentId)); if (_disposed) { foreach (var logHandle in logHandles.Values) { logHandle.Dispose(); } return(null); } return(result); }
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); } }
/// <summary> /// Get cached instance of buffer pool for specified params /// </summary> /// <param name="recordSize">Record size</param> /// <param name="sectorSize">Sector size</param> /// <returns></returns> public static SectorAlignedBufferPool GetPool(int recordSize, int sectorSize) { return (_instances.GetOrAdd(new Tuple <int, int>(recordSize, sectorSize), t => new SectorAlignedBufferPool(t.Item1, t.Item2))); }
/// <summary> /// /// </summary> /// <param name="_segmentId"></param> /// <returns></returns> // Can be used to pre-load handles, e.g., after a checkpoint protected SafeFileHandle GetOrAddHandle(int _segmentId) { return(logHandles.GetOrAdd(_segmentId, segmentId => CreateHandle(segmentId))); }