/// <inheritdoc /> public byte[] GetLogCheckpointMetadata(Guid logToken, DeltaLog deltaLog) { byte[] metadata = null; if (deltaLog != null) { // Try to get latest valid metadata from delta-log deltaLog.Reset(); while (deltaLog.GetNext(out long physicalAddress, out int entryLength, out int type)) { if (type != 1) { continue; // consider only metadata records } long endAddress = physicalAddress + entryLength; metadata = new byte[entryLength]; unsafe { fixed(byte *m = metadata) Buffer.MemoryCopy((void *)physicalAddress, m, entryLength, entryLength); } } if (metadata != null) { return(metadata); } } var device = deviceFactory.Get(checkpointNamingScheme.LogCheckpointMetadata(logToken)); ReadInto(device, 0, out byte[] writePad, sizeof(int)); int size = BitConverter.ToInt32(writePad, 0); byte[] body; if (writePad.Length >= size + sizeof(int)) { body = writePad; } else { ReadInto(device, 0, out body, size + sizeof(int)); } device.Dispose(); return(new Span <byte>(body).Slice(sizeof(int)).ToArray()); }
/// <summary> /// Retrieve commit metadata for specified log checkpoint /// </summary> /// <param name="logToken">Token</param> /// <param name="deltaLog">Delta log</param> /// <returns>Metadata, or null if invalid</returns> public byte[] GetLogCheckpointMetadata(Guid logToken, DeltaLog deltaLog) { byte[] metadata = null; if (deltaLog != null) { // Get latest valid metadata from delta-log deltaLog.Reset(); while (deltaLog.GetNext(out long physicalAddress, out int entryLength, out int type)) { if (type != 1) { continue; // consider only metadata records } long endAddress = physicalAddress + entryLength; metadata = new byte[entryLength]; unsafe { fixed(byte *m = metadata) { Buffer.MemoryCopy((void *)physicalAddress, m, entryLength, entryLength); } } } if (metadata != null) { return(metadata); } } var dir = new DirectoryInfo(directoryConfiguration.GetHybridLogCheckpointFolder(logToken)); if (!File.Exists(dir.FullName + Path.DirectorySeparatorChar + "completed.dat")) { return(null); } string checkpointInfoFile = directoryConfiguration.GetHybridLogCheckpointMetaFileName(logToken); using (var reader = new BinaryReader(new FileStream(checkpointInfoFile, FileMode.Open))) { var len = reader.ReadInt32(); return(reader.ReadBytes(len)); } }
/// <summary> /// Retrieve commit metadata for specified log checkpoint /// </summary> /// <param name="logToken">Token</param> /// <param name="deltaLog">Delta log</param> /// <param name="scanDelta"> whether or not to scan through the delta log to acquire latest entry</param> /// <param name="recoverTo"> version upper bound to scan for in the delta log. Function will return the largest version metadata no greater than the given version.</param> /// <returns>Metadata, or null if invalid</returns> public byte[] GetLogCheckpointMetadata(Guid logToken, DeltaLog deltaLog, bool scanDelta, long recoverTo) { byte[] metadata = null; if (scanDelta && deltaLog != null) { // Get latest valid metadata from delta-log deltaLog.Reset(); while (deltaLog.GetNext(out long physicalAddress, out int entryLength, out DeltaLogEntryType type)) { switch (type) { case DeltaLogEntryType.DELTA: // consider only metadata records continue; case DeltaLogEntryType.CHECKPOINT_METADATA: metadata = new byte[entryLength]; unsafe { fixed(byte *m = metadata) { Buffer.MemoryCopy((void *)physicalAddress, m, entryLength, entryLength); } } HybridLogRecoveryInfo recoveryInfo = new(); using (StreamReader s = new(new MemoryStream(metadata))) { recoveryInfo.Initialize(s); // Finish recovery if only specific versions are requested if (recoveryInfo.version == recoverTo || recoveryInfo.version < recoverTo && recoveryInfo.nextVersion > recoverTo) { goto LoopEnd; } } continue; default: throw new FasterException("Unexpected entry type"); } LoopEnd: break; } if (metadata != null) { return(metadata); } } DirectoryInfo dir = new(directoryConfiguration.GetHybridLogCheckpointFolder(logToken)); if (!File.Exists(dir.FullName + Path.DirectorySeparatorChar + "completed.dat")) { return(null); } string checkpointInfoFile = directoryConfiguration.GetHybridLogCheckpointMetaFileName(logToken); using BinaryReader reader = new(new FileStream(checkpointInfoFile, FileMode.Open)); var len = reader.ReadInt32(); return(reader.ReadBytes(len)); }
/// <inheritdoc /> public byte[] GetLogCheckpointMetadata(Guid logToken, DeltaLog deltaLog, bool scanDelta, long recoverTo) { byte[] metadata = null; if (deltaLog != null && scanDelta) { // Try to get latest valid metadata from delta-log deltaLog.Reset(); while (deltaLog.GetNext(out long physicalAddress, out int entryLength, out var type)) { switch (type) { case DeltaLogEntryType.DELTA: // consider only metadata records continue; case DeltaLogEntryType.CHECKPOINT_METADATA: metadata = new byte[entryLength]; unsafe { fixed(byte *m = metadata) Buffer.MemoryCopy((void *)physicalAddress, m, entryLength, entryLength); } HybridLogRecoveryInfo recoveryInfo = new(); using (StreamReader s = new(new MemoryStream(metadata))) { recoveryInfo.Initialize(s); // Finish recovery if only specific versions are requested if (recoveryInfo.version == recoverTo || recoveryInfo.version < recoverTo && recoveryInfo.nextVersion > recoverTo) { goto LoopEnd; } } continue; default: throw new FasterException("Unexpected entry type"); } LoopEnd: break; } if (metadata != null) { return(metadata); } } var device = deviceFactory.Get(checkpointNamingScheme.LogCheckpointMetadata(logToken)); ReadInto(device, 0, out byte[] writePad, sizeof(int)); int size = BitConverter.ToInt32(writePad, 0); byte[] body; if (writePad.Length >= size + sizeof(int)) { body = writePad; } else { ReadInto(device, 0, out body, size + sizeof(int)); } device.Dispose(); return(body.AsSpan().Slice(sizeof(int), size).ToArray()); }