Пример #1
0
 /// <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)));
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 /// <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)));
 }
Пример #5
0
 /// <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)));
 }