public static async Task <T> Apply <T>(this ICumulativeUpdate <T> update, Snapshot <T> snapshot) where T : ICloneable <T>, new() { var state = await snapshot.GetStateAsync(); update.Apply(state); return(state); }
protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update) { if (newVersionNumber <= VersionNumber) { throw new InvalidVersionException($"Can't apply update #{newVersionNumber} with base #{update.BaseVersionNumber} - current object version is already #{VersionNumber}"); } return(new UnconfirmedSnapshot <T>(newVersionNumber, this, update)); }
protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update) { if (newVersionNumber == VersionNumber) { return(new ReliableSnapshot <T>(newVersionNumber, GetStateAsync())); } return(new UnconfirmedSnapshot <T>(newVersionNumber, _snapshot.ApplyUpdate(newVersionNumber, update), update)); }
public async Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> cumulativeUpdate) { _log.LogInformation($"Begin apply update for base #{cumulativeUpdate.BaseVersionNumber} of type {cumulativeUpdate.GetType().Name}"); var versionTuple = await _vendor.PromoteNewVersion(_bus, cumulativeUpdate.BaseVersionNumber); _log.LogVerbose($"Vendor promoted new version #{versionTuple.Item1} for base #{cumulativeUpdate.BaseVersionNumber}"); await _bus.PublishMessageAsync(new VersionCumulativeUpdateNotification <T>(FactoryId, FactoryInstanceId, versionTuple.Item1, cumulativeUpdate)); _log.LogVerbose($"Wait for initial verision #{versionTuple.Item1} to be confirmed or moved by other guys"); return(await versionTuple.Item2); }
public async Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> update) { using (_log.BeginScope($"{update.GetType().Name}:{update.BaseVersionNumber}")) { _log.LogInformation($"Start apply update for base #{update.BaseVersionNumber} of type {update.GetType().Name}"); var versionNumberTask = _trollActor.ApplyUpdateAsync(update); if (await Task.WhenAny(versionNumberTask, Task.Delay(TimeSpan.FromSeconds(15))) != versionNumberTask) { _log.LogError($"Version update confirmation for base #{update.BaseVersionNumber} has not been received during 15 seconds."); throw new TimeoutException($"Version update confirmation for #{update.BaseVersionNumber} has not been received during 15 seconds."); } _log.LogInformation($"Finished apply update for base #{update.BaseVersionNumber} - new object version #{versionNumberTask.Result}"); return(versionNumberTask.Result); } }
public Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> update) { throw new NotImplementedException(); //if (_isInitialized == 0) //{ // throw new InvalidOperationException($"FrontEnt actor #{FactoryInstanceId} of factory '{FactoryId}' not initialized"); //} //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' apply update of type {update.GetType()} for base #{update.BaseVersionNumber}"); //var snapshot = _librarian.ApplyUpdate(update); //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' generated new verion #{snapshot.VersionNumber} for base #{update.BaseVersionNumber} using internal Vendor actor"); //VersionAccumulator current; //_versions.Update( // snapshot.VersionNumber, // a => a.ConfirmVersion(FactoryInstanceId, update.BaseVersionNumber), // out current); //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' confirmed verion #{snapshot.VersionNumber} for base #{update.BaseVersionNumber}"); //await _busEntity.PublishMessageAsync(new VersionCumulativeUpdateNotification<T>(this, snapshot.VersionNumber, update)); //return snapshot.VersionNumber; }
public VersionCumulativeUpdateNotification(Guid factoryId, long factoryInstanceId, long versionNumber, ICumulativeUpdate <T> update) : base(factoryId, factoryInstanceId, versionNumber) { CumulativeUpdate = update; }
protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update) { throw new InvalidVersionException($"Can't apply update #{newVersionNumber} on object instance #{VersionNumber} - object outdated"); }
protected abstract Snapshot ApplyUpdateInternal(long versionNumber, ICumulativeUpdate update);
public virtual Snapshot <T> UpdateSnapshot(ICumulativeUpdate <T> update, long newVersionNumber, out Snapshot <T> current) { return(_snapshots.AddOrUpdate(update.BaseVersionNumber, LoadSnapshot, s => s.ApplyUpdate(newVersionNumber, update), out current)); }
public UnconfirmedSnapshot(long versionNumber, Snapshot <T> snapshot, ICumulativeUpdate <T> update) : base(versionNumber) { _update = update; _snapshot = snapshot; }