public static byte[]? TryGet(this TrackingMap trackingMap, IReadOnlyStore store, byte[]?key) { key ??= Array.Empty <byte>(); if (trackingMap.TryGetValue(key, out var mapValue)) { return(mapValue.Match <byte[]?>(v => v.ToArray(), _ => null)); } return(store.TryGet(key)); }
void CommitSnapshot(TrackingMap writeBatchMap) { var priorCollection = Volatile.Read(ref trackingMap); do { var updatedCollection = Volatile.Read(ref trackingMap); foreach (var change in writeBatchMap) { updatedCollection = updatedCollection.SetItem(change.Key, change.Value); } var interlockedResult = Interlocked.CompareExchange(ref trackingMap, updatedCollection, priorCollection); if (object.ReferenceEquals(priorCollection, interlockedResult)) { break; } priorCollection = interlockedResult; }while (true); }
static void AtomicUpdate(ref TrackingMap trackingMap, byte[]?key, OneOf <byte[]?, None> value) { key = key == null?Array.Empty <byte>() : key.AsSpan().ToArray(); var _value = value.Match <OneOf <ReadOnlyMemory <byte>, None> >( v => v == null ? default(ReadOnlyMemory <byte>) : v.AsSpan().ToArray(), n => n); var priorCollection = Volatile.Read(ref trackingMap); do { var updatedCollection = priorCollection.SetItem(key, _value); var interlockedResult = Interlocked.CompareExchange(ref trackingMap, updatedCollection, priorCollection); if (object.ReferenceEquals(priorCollection, interlockedResult)) { break; } priorCollection = interlockedResult; }while (true); }
public static IEnumerable <(byte[] Key, byte[] Value)> Seek(this TrackingMap trackingMap, IReadOnlyStore store, byte[]?key, SeekDirection direction) { key ??= Array.Empty <byte>(); if (key.Length == 0 && direction == SeekDirection.Backward) { return(Enumerable.Empty <(byte[] key, byte[] value)>()); } var comparer = direction == SeekDirection.Forward ? ReadOnlyMemoryComparer.Default : ReadOnlyMemoryComparer.Reverse; var memoryItems = trackingMap .Where(kvp => kvp.Value.IsT0) .Where(kvp => key.Length == 0 || comparer.Compare(kvp.Key, key) >= 0) .Select(kvp => (Key: kvp.Key.ToArray(), Value: kvp.Value.AsT0.ToArray())); var storeItems = store .Seek(key, direction) .Where <(byte[] Key, byte[] Value)>(kvp => !trackingMap.ContainsKey(kvp.Key)); return(memoryItems.Concat(storeItems).OrderBy(kvp => kvp.Key, comparer)); }
/// <summary> /// Edits the specified tracking map id. /// </summary> /// <param name="trackingMapId">The tracking map id.</param> /// <param name="trackingMap">The tracking map.</param> /// <returns>TrackingMap.</returns> public TrackingMap Edit(int trackingMapId, TrackingMap trackingMap) { return(_trackingMapRepository.Edit(trackingMapId, trackingMap)); }
/// <summary> /// Creates the specified tracking map. /// </summary> /// <param name="trackingMap">The tracking map.</param> /// <returns><c>true</c> if save success, <c>false</c> otherwise</returns> public TrackingMap Create(TrackingMap trackingMap) { return(_trackingMapRepository.Create(trackingMap)); }
public Snapshot(IReadOnlyStore store, TrackingMap trackingMap, Action <TrackingMap> commitAction) { this.store = store; this.trackingMap = trackingMap; this.commitAction = commitAction; }