microsoft/garnet · error · NotImplementedException
GetRMWModifiedFieldInfo is not supported in this ISessionFun
Error message
GetRMWModifiedFieldInfo is not supported in this ISessionFunctions implementation
What it means
GetRMWModifiedFieldInfo returns RecordFieldInfo (key/value sizes, object flags) for RMW (Read-Modify-Write) copy-update operations. NoOpSessionFunctions throws NotImplementedException because compaction never performs RMW — it only copies existing log records. The class doc explicitly states only the record-copy overloads (GetUpsertFieldInfo with ISourceLogRecord, InitialWriter with ISourceLogRecord, InPlaceWriter with ISourceLogRecord) are implemented.
Source
Thrown at libs/storage/Tsavorite/cs/src/core/ClientSession/NoOpSessionFunctions.cs:76
public readonly bool NeedInitialUpdate<TKey>(TKey key, ref TInput input, ref TOutput output, ref RMWInfo rmwInfo)
where TKey : IKey
#if NET9_0_OR_GREATER
, allows ref struct
#endif
=> true;
public readonly bool NeedCopyUpdate<TSourceLogRecord>(in TSourceLogRecord srcLogRecord, ref TInput input, ref TOutput output, ref RMWInfo rmwInfo)
where TSourceLogRecord : ISourceLogRecord
=> true;
public readonly void ReadCompletionCallback(ref DiskLogRecord diskLogRecord, ref TInput input, ref TOutput output, TContext ctx, Status status, RecordMetadata recordMetadata) { }
public readonly void RMWCompletionCallback(ref DiskLogRecord diskLogRecord, ref TInput input, ref TOutput output, TContext ctx, Status status, RecordMetadata recordMetadata) { }
public readonly RecordFieldInfo GetRMWModifiedFieldInfo<TSourceLogRecord>(in TSourceLogRecord srcLogRecord, ref TInput input)
where TSourceLogRecord : ISourceLogRecord
=> throw new NotImplementedException("GetRMWModifiedFieldInfo is not supported in this ISessionFunctions implementation");
public readonly RecordFieldInfo GetRMWInitialFieldInfo<TKey>(TKey key, ref TInput input)
where TKey : IKey
#if NET9_0_OR_GREATER
, allows ref struct
#endif
=> throw new NotImplementedException("GetRMWInitialFieldInfo is not supported in this ISessionFunctions implementation");
public readonly RecordFieldInfo GetUpsertFieldInfo<TKey>(TKey key, ReadOnlySpan<byte> value, ref TInput input)
where TKey : IKey
#if NET9_0_OR_GREATER
, allows ref struct
#endif
=> throw new NotImplementedException("GetUpsertFieldInfo(ReadOnlySpan<byte> value) is not supported in this ISessionFunctions implementation");
public readonly RecordFieldInfo GetUpsertFieldInfo<TKey>(TKey key, IHeapObject value, ref TInput input)
where TKey : IKey
#if NET9_0_OR_GREATER
, allows ref struct
#endif
=> throw new NotImplementedException("IHeapObject value) is not supported in this ISessionFunctions implementation");View on GitHub (pinned to 951b0fc683)
Solutions
- Report as a Tsavorite framework bug — compaction should not invoke RMW operations through NoOpSessionFunctions.
- If implementing custom ISessionFunctions, implement GetRMWModifiedFieldInfo to return proper RecordFieldInfo for your value types.
- Review whether any custom hooks or callbacks registered during compaction could be triggering RMW.
Defensive patterns
Strategy: try-catch
Try / catch
try
{
store.TakeHybridLogCheckpoint();
}
catch (NotImplementedException ex) when (ex.Message.Contains("GetRMWModifiedFieldInfo"))
{
logger.LogCritical("Compaction/checkpoint hit unsupported RMW path on NoOp session: {Message}", ex.Message);
throw;
} Prevention
- This indicates compaction incorrectly entered an RMW path — report as a framework bug.
- Implement GetRMWModifiedFieldInfo in custom ISessionFunctions implementations.
- Verify checkpoint and compaction workflows with integration tests.
When it happens
Trigger: Tsavorite's internal code calls GetRMWModifiedFieldInfo on a NoOpSessionFunctions instance during compaction or iteration, which means an RMW code path was incorrectly entered during a context that uses NoOpSessionFunctions. Since NoOpSessionFunctions is internal, this surfaces from within the framework.
Common situations: A framework bug where compaction logic enters an RMW path; a custom compaction or checkpoint callback that triggers RMW operations through an internal session; a version regression in RMW dispatch logic.
Related errors
- GetRMWInitialFieldInfo is not supported in this ISessionFunc
- GetUpsertFieldInfo(ReadOnlySpan<byte> value) is not supporte
- IHeapObject value) is not supported in this ISessionFunction
- InPlaceWriter(ReadOnlySpan<byte> value) is not supported in
- InPlaceWriter(IHeapObject value) is not supported in this IS
AI-assisted analysis of microsoft/garnet@951b0fc683 (2026-08-13).
Data as JSON: /api/errors/1fa8878dac27d85e.
Report an issue: GitHub.