FASTER icon indicating copy to clipboard operation
FASTER copied to clipboard

Error AccessViolationException ClientSession.Read on snapshot

Open cschuchardt88 opened this issue 11 months ago • 0 comments

Example

_store.TryInitiateFullCheckpoint(out var snapshotId, CheckpointType.Snapshot);
_store.CompleteCheckpointAsync().AsTask().GetAwaiter().GetResult();
_store.Log.FlushAndEvict(true);
return new FasterDbSnapshot(this, _checkpointSettings, snapshotId);
//....
_snapshot = NullStorageDevice.Create(_checkpointSettings, out _logSettings);

_snapshot.Recover(_snapshotId);

_sessionPool = new(
    _logSettings.LogDevice.ThrottleLimit,
    () => _snapshot.For(new ByteArrayFunctions()).NewSession<ByteArrayFunctions>());
//...
public byte[]? TryGet(byte[] key)
{
    if (_sessionPool.TryGet(out var session) == false)
        session = _sessionPool.Get();

    var (status, output) = session.Read(key);  // <--- Throws Here, status is "FOUND", "output" is exception
    byte[]? value = null;

    if (status.Found)
        value = output;
    if (status.IsPending && session.CompletePendingWithOutputs(out var iter, true, true))
    {
        using (iter)
        {
            while (iter.Next())
            {
                if (iter.Current.Key.AsSpan().SequenceEqual(key))
                {
                    value = iter.Current.Output;
                    break;
                }
            }
        }
    }

    _sessionPool.Return(session);

    return value;
}

Exception

System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'

CallStack

 	FASTER.core.dll!FASTER.core.ByteArrayFasterEqualityComparer.Equals(ref byte[] k1, ref byte[] k2)	Unknown
 	FASTER.core.dll!FASTER.core.FasterKV<byte[], byte[]>.TraceBackForKeyMatch(ref byte[] key, ref FASTER.core.RecordSource<byte[], byte[]> recSrc, long minAddress)	Unknown
 	FASTER.core.dll!FASTER.core.FasterKV<byte[], byte[]>.InternalRead<byte[], byte[], FASTER.core.Empty, FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.InternalFasterSession>(ref byte[] key, long keyHash, ref byte[] input, ref byte[] output, long startAddress, ref FASTER.core.Empty userContext, ref FASTER.core.FasterKV<byte[], byte[]>.PendingContext<byte[], byte[], FASTER.core.Empty> pendingContext, FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.InternalFasterSession fasterSession, long lsn)	Unknown
 	FASTER.core.dll!FASTER.core.FasterKV<byte[], byte[]>.ContextRead<byte[], byte[], FASTER.core.Empty, FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.InternalFasterSession>(ref byte[] key, ref byte[] input, ref byte[] output, FASTER.core.Empty context, FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.InternalFasterSession fasterSession, long serialNo)	Unknown
 	FASTER.core.dll!FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.Read(ref byte[] key, ref byte[] input, ref byte[] output, FASTER.core.Empty userContext, long serialNo)	Unknown
 	FASTER.core.dll!FASTER.core.ClientSession<byte[], byte[], byte[], byte[], FASTER.core.Empty, Neo.Build.Core.Storage.ByteArrayFunctions>.Read(byte[] key, FASTER.core.Empty userContext, long serialNo)	Unknown
>	Neo.Build.Core.dll!Neo.Build.Core.Storage.FasterDbSnapshot.TryGet(byte[] key) Line 114	C#

cschuchardt88 avatar Mar 07 '25 03:03 cschuchardt88