コード例 #1
0
        /// <summary>
        /// Asynchronously loads snapshot with the highest sequence number for a persistent actor/view matching specified criteria.
        /// </summary>
        protected async override Task <SelectedSnapshot> LoadAsync(string persistenceId, SnapshotSelectionCriteria criteria)
        {
            ServiceEventSource.Current.Message($"Entering ServiceFabricSnapshotStore.{nameof(LoadAsync)} PersistenceId: {persistenceId} ");

            SnapshotEntry snapshot = null;

            if (criteria.MaxSequenceNr > 0 && criteria.MaxSequenceNr < long.MaxValue)
            {
                var MaxNumberkey = $"{persistenceId}_{criteria.MaxSequenceNr}";
                using (var tx = this.StateManager.CreateTransaction())
                {
                    ServiceEventSource.Current.Message($"{persistenceId} ");

                    var snapshots = await this.StateManager.GetOrAddAsync <IReliableDictionary <string, SnapshotEntry> >(persistenceId);

                    var snapshotStorageCurrentHighSequenceNumber = await this.StateManager.GetOrAddAsync <IReliableDictionary <string, long> >("SnapshotStorageCurrentHighSequenceNumber");

                    var maxSequenceNumberConditional = await snapshotStorageCurrentHighSequenceNumber.TryGetValueAsync(tx, persistenceId);

                    if (maxSequenceNumberConditional.HasValue)
                    {
                        var MaxSequenceNumber = maxSequenceNumberConditional.Value;
                        var ret = await snapshots.TryGetValueAsync(tx, $"{persistenceId}_{MaxSequenceNumber}");

                        snapshot = ret.HasValue ? ret.Value : null;
                        await tx.CommitAsync();

                        SelectedSnapshot ss = new SelectedSnapshot(new SnapshotMetadata(persistenceId, snapshot.SequenceNr), snapshot);
                        return(ss);
                    }
                }
            }

            return(null);
        }
コード例 #2
0
        public SelectedSnapshot Map(SnapshotEntry e)
        {
            if (e == null)
            {
                return(null);
            }
            var persistenceId = e.PersistenceId;
            var sequenceNr    = e.SequenceNr;
            var timestamp     = e.Timestamp;

            var metadata = new SnapshotMetadata(persistenceId, sequenceNr, timestamp);

            var type       = Type.GetType(e.SnapshotType, true);
            var serializer = _serialization.FindSerializerForType(type);
            var binary     = e.Snapshot;

            var snapshot = serializer.FromBinary(binary, type);


            return(new SelectedSnapshot(metadata, snapshot));
        }
コード例 #3
0
        /// <summary>
        /// Asynchronously stores a snapshot with metadata as object in the reliable dictionary, saves the highest Sequence number
        /// separatly to allow the last one to be found by sequence number.
        /// </summary>
        protected async override Task SaveAsync(SnapshotMetadata metadata, object snapshot)
        {
            ServiceEventSource.Current.Message($"Entering ServiceFabricSnapshotStore.{nameof(SaveAsync)} PersistenceId: {metadata.PersistenceId} SequencNumer: {metadata.SequenceNr}");

            var snapshotEntry = new SnapshotEntry
            {
                Id            = metadata.PersistenceId + "_" + metadata.SequenceNr,
                PersistenceId = metadata.PersistenceId,
                SequenceNr    = metadata.SequenceNr,
                Snapshot      = snapshot,
                Timestamp     = metadata.Timestamp.Ticks
            };

            var snapshotEntryId = metadata.PersistenceId + "_" + metadata.SequenceNr;

            using (var tx = this.StateManager.CreateTransaction())
            {
                var snapshotStorageCurrentHighSequenceNumber = await this.StateManager.GetOrAddAsync <IReliableDictionary <string, long> >("SnapshotStorageCurrentHighSequenceNumber");

                var resultCurrentHighSquenceNumber = await snapshotStorageCurrentHighSequenceNumber.AddOrUpdateAsync(tx, metadata.PersistenceId, metadata.SequenceNr, (ssschsn, lng) => metadata.SequenceNr);

                ServiceEventSource.Current.Message($"resultCurrentHighSquenceNumber: {resultCurrentHighSquenceNumber}");

                var snapshots = await this.StateManager.GetOrAddAsync <IReliableDictionary <string, SnapshotEntry> >(metadata.PersistenceId);

                var resultSnapshotAdd = await snapshots.GetOrAddAsync(tx, snapshotEntry.Id, ssid => snapshotEntry);

                ServiceEventSource.Current.Message($"resultSnapshotAdd: {resultSnapshotAdd}");

                await tx.CommitAsync();

                ServiceEventSource.Current.Message($"Leaving {nameof(SaveAsync)} PersistenceId: {metadata.PersistenceId} SequencNumer: {metadata.SequenceNr}");
            }

            return;
        }