Reformat / cleanup
This commit is contained in:
@@ -1,36 +1,36 @@
|
||||
using ZB.MOM.WW.CBDD.Core.Transactions;
|
||||
|
||||
namespace ZB.MOM.WW.CBDD.Core.Storage;
|
||||
|
||||
using ZB.MOM.WW.CBDD.Core.Transactions;
|
||||
|
||||
namespace ZB.MOM.WW.CBDD.Core.Storage;
|
||||
|
||||
public sealed partial class StorageEngine
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the current size of the WAL file.
|
||||
/// </summary>
|
||||
public long GetWalSize()
|
||||
{
|
||||
return _wal.GetCurrentSize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Truncates the WAL file.
|
||||
/// Should only be called after a successful checkpoint.
|
||||
/// </summary>
|
||||
public void TruncateWal()
|
||||
{
|
||||
_wal.Truncate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flushes the WAL to disk.
|
||||
/// </summary>
|
||||
public void FlushWal()
|
||||
{
|
||||
_wal.Flush();
|
||||
/// <summary>
|
||||
/// Gets the current size of the WAL file.
|
||||
/// </summary>
|
||||
public long GetWalSize()
|
||||
{
|
||||
return _wal.GetCurrentSize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a truncate checkpoint by default.
|
||||
/// Truncates the WAL file.
|
||||
/// Should only be called after a successful checkpoint.
|
||||
/// </summary>
|
||||
public void TruncateWal()
|
||||
{
|
||||
_wal.Truncate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flushes the WAL to disk.
|
||||
/// </summary>
|
||||
public void FlushWal()
|
||||
{
|
||||
_wal.Flush();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a truncate checkpoint by default.
|
||||
/// </summary>
|
||||
public void Checkpoint()
|
||||
{
|
||||
@@ -38,7 +38,7 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a checkpoint using the requested mode.
|
||||
/// Performs a checkpoint using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <returns>The checkpoint execution result.</returns>
|
||||
@@ -50,7 +50,7 @@ public sealed partial class StorageEngine
|
||||
lockAcquired = _commitLock.Wait(0);
|
||||
if (!lockAcquired)
|
||||
{
|
||||
var walSize = _wal.GetCurrentSize();
|
||||
long walSize = _wal.GetCurrentSize();
|
||||
return new CheckpointResult(mode, false, 0, walSize, walSize, false, false);
|
||||
}
|
||||
}
|
||||
@@ -66,19 +66,18 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lockAcquired)
|
||||
{
|
||||
_commitLock.Release();
|
||||
}
|
||||
if (lockAcquired) _commitLock.Release();
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckpointInternal()
|
||||
=> _ = CheckpointInternal(CheckpointMode.Truncate);
|
||||
{
|
||||
_ = CheckpointInternal(CheckpointMode.Truncate);
|
||||
}
|
||||
|
||||
private CheckpointResult CheckpointInternal(CheckpointMode mode)
|
||||
{
|
||||
var walBytesBefore = _wal.GetCurrentSize();
|
||||
long walBytesBefore = _wal.GetCurrentSize();
|
||||
var appliedPages = 0;
|
||||
var truncated = false;
|
||||
var restarted = false;
|
||||
@@ -91,10 +90,7 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
|
||||
// 2. Flush PageFile to ensure durability.
|
||||
if (appliedPages > 0)
|
||||
{
|
||||
_pageFile.Flush();
|
||||
}
|
||||
if (appliedPages > 0) _pageFile.Flush();
|
||||
|
||||
// 3. Clear in-memory WAL index (now persisted).
|
||||
_walIndex.Clear();
|
||||
@@ -109,6 +105,7 @@ public sealed partial class StorageEngine
|
||||
_wal.WriteCheckpointRecord();
|
||||
_wal.Flush();
|
||||
}
|
||||
|
||||
break;
|
||||
case CheckpointMode.Truncate:
|
||||
if (walBytesBefore > 0)
|
||||
@@ -116,6 +113,7 @@ public sealed partial class StorageEngine
|
||||
_wal.Truncate();
|
||||
truncated = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case CheckpointMode.Restart:
|
||||
_wal.Restart();
|
||||
@@ -126,12 +124,12 @@ public sealed partial class StorageEngine
|
||||
throw new ArgumentOutOfRangeException(nameof(mode), mode, "Unsupported checkpoint mode.");
|
||||
}
|
||||
|
||||
var walBytesAfter = _wal.GetCurrentSize();
|
||||
long walBytesAfter = _wal.GetCurrentSize();
|
||||
return new CheckpointResult(mode, true, appliedPages, walBytesBefore, walBytesAfter, truncated, restarted);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a truncate checkpoint asynchronously by default.
|
||||
/// Performs a truncate checkpoint asynchronously by default.
|
||||
/// </summary>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
public async Task CheckpointAsync(CancellationToken ct = default)
|
||||
@@ -140,7 +138,7 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a checkpoint asynchronously using the requested mode.
|
||||
/// Performs a checkpoint asynchronously using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
@@ -153,7 +151,7 @@ public sealed partial class StorageEngine
|
||||
lockAcquired = await _commitLock.WaitAsync(0, ct);
|
||||
if (!lockAcquired)
|
||||
{
|
||||
var walSize = _wal.GetCurrentSize();
|
||||
long walSize = _wal.GetCurrentSize();
|
||||
return new CheckpointResult(mode, false, 0, walSize, walSize, false, false);
|
||||
}
|
||||
}
|
||||
@@ -170,16 +168,13 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lockAcquired)
|
||||
{
|
||||
_commitLock.Release();
|
||||
}
|
||||
if (lockAcquired) _commitLock.Release();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recovers from crash by replaying WAL.
|
||||
/// Applies committed transactions to PageFile in deterministic WAL order, then truncates WAL.
|
||||
/// Recovers from crash by replaying WAL.
|
||||
/// Applies committed transactions to PageFile in deterministic WAL order, then truncates WAL.
|
||||
/// </summary>
|
||||
public void Recover()
|
||||
{
|
||||
@@ -189,35 +184,28 @@ public sealed partial class StorageEngine
|
||||
// 1. Read WAL and locate the latest checkpoint boundary.
|
||||
var records = _wal.ReadAll();
|
||||
var startIndex = 0;
|
||||
for (var i = records.Count - 1; i >= 0; i--)
|
||||
{
|
||||
for (int i = records.Count - 1; i >= 0; i--)
|
||||
if (records[i].Type == WalRecordType.Checkpoint)
|
||||
{
|
||||
startIndex = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Replay WAL in source order with deterministic commit application.
|
||||
var pendingWrites = new Dictionary<ulong, List<(uint pageId, byte[] data)>>();
|
||||
var appliedAny = false;
|
||||
|
||||
for (var i = startIndex; i < records.Count; i++)
|
||||
for (int i = startIndex; i < records.Count; i++)
|
||||
{
|
||||
var record = records[i];
|
||||
switch (record.Type)
|
||||
{
|
||||
case WalRecordType.Begin:
|
||||
if (!pendingWrites.ContainsKey(record.TransactionId))
|
||||
{
|
||||
pendingWrites[record.TransactionId] = new List<(uint, byte[])>();
|
||||
}
|
||||
break;
|
||||
case WalRecordType.Write:
|
||||
if (record.AfterImage == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (record.AfterImage == null) break;
|
||||
|
||||
if (!pendingWrites.TryGetValue(record.TransactionId, out var writes))
|
||||
{
|
||||
@@ -228,12 +216,9 @@ public sealed partial class StorageEngine
|
||||
writes.Add((record.PageId, record.AfterImage));
|
||||
break;
|
||||
case WalRecordType.Commit:
|
||||
if (!pendingWrites.TryGetValue(record.TransactionId, out var committedWrites))
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (!pendingWrites.TryGetValue(record.TransactionId, out var committedWrites)) break;
|
||||
|
||||
foreach (var (pageId, data) in committedWrites)
|
||||
foreach ((uint pageId, byte[] data) in committedWrites)
|
||||
{
|
||||
_pageFile.WritePage(pageId, data);
|
||||
appliedAny = true;
|
||||
@@ -251,23 +236,17 @@ public sealed partial class StorageEngine
|
||||
}
|
||||
|
||||
// 3. Flush PageFile to ensure durability.
|
||||
if (appliedAny)
|
||||
{
|
||||
_pageFile.Flush();
|
||||
}
|
||||
if (appliedAny) _pageFile.Flush();
|
||||
|
||||
// 4. Clear in-memory WAL index (redundant since we just recovered).
|
||||
_walIndex.Clear();
|
||||
|
||||
// 5. Truncate WAL (all changes now in PageFile).
|
||||
if (_wal.GetCurrentSize() > 0)
|
||||
{
|
||||
_wal.Truncate();
|
||||
}
|
||||
if (_wal.GetCurrentSize() > 0) _wal.Truncate();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_commitLock.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
_commitLock.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user