override public Task PersistTransactions(PartitionChange change)
 {
     if (this.acceptChange)
     {
         return(base.PersistTransactions(change));
     }
     return(Task.FromException(new Exception("Network error")));
 }
        virtual async public Task PersistTransactions(PartitionChange partitionChange)
        {
            if (partitionChange.PartitionId != this.Id)
            {
                var message = $"Got wrong PartitionChange {partitionChange.PartitionId} data in ServiceFabricPersistentCollector {this.Id}";
                this.healthStore.WriteError(message);
                throw new InvalidOperationException(message);
            }

            foreach (var transactionToApply in partitionChange.Transactions)
            {
                var deserializedData = messageConverter.Deserialize <NotifyTransactionAppliedEvent>(transactionToApply.Data);

                using (var tx = this.stateManager.CreateTransaction())
                {
                    // Find which Dictionary is this change for.
                    foreach (var change in deserializedData.Changes)
                    {
                        // assume all collections are dictionary.
                        var dictName      = change.CollectionName;
                        var eventArgsType = change.EventArgs.GetType();
                        if (eventArgsType.GetGenericArguments().Length != 2)
                        {
                            var msg = $"Dictionary : {dictName} : Got an eventArgs {transactionToApply.Data} with less than 2 GenericArguments.";
                            this.healthStore.WriteError(msg);
                            throw new InvalidOperationException(msg);
                        }

                        var keyType   = eventArgsType.GetGenericArguments()[0];
                        var valueType = eventArgsType.GetGenericArguments()[1];

                        await this.ApplyEventToDictionary(tx, keyType, valueType, dictName, change.EventArgs);
                    }

                    await tx.CommitAsync();
                }
            }
        }
Ejemplo n.º 3
0
 virtual public Task PersistTransactions(PartitionChange change)
 {
     this.changes.Add(change);
     return(Task.CompletedTask);
 }