Exemple #1
0
        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));
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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));
        }
Exemple #5
0
 /// <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));
 }
Exemple #6
0
 /// <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;
 }