/// <summary> /// Queues an event to be logged asynchronously. /// </summary> /// <param name="snapshot">The snapshot immediately following the event.</param> public void Log(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot) { Task.Run(async() => { try { await LogAsyncImpl(snapshot); } catch (Exception e) { _onLogException(e, snapshot); } }); }
/// <summary> /// Actual implementation for logging. Must be provided by inheriting classes. /// </summary> static int CompareLogs(OverridesSnapshot <TSubApp, TTier, TDataCenter> a, OverridesSnapshot <TSubApp, TTier, TDataCenter> b) { if (a.LastEvent.Timestamp > b.LastEvent.Timestamp) { return(1); } if (a.LastEvent.Timestamp == b.LastEvent.Timestamp) { return(0); } return(-1); }
/// <summary> /// Logging implementation. /// </summary> protected override Task LogAsyncImpl(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot) { lock (_history) { var needsResort = _history.Count > 0 && snapshot.LastEvent.Timestamp < _history[_history.Count - 1].LastEvent.Timestamp; _history.Add(snapshot); if (needsResort) { _history.Sort(CompareLogs); } } return(Task.FromResult(0)); }
public static TSettings GetSettings <TSettings>( this SettingsFactory <TSettings, SubApp, Tier, DataCenter> factory, OverridesSnapshot <SubApp, Tier, DataCenter> snapshot = null) where TSettings : class, INFigSettings <SubApp, Tier, DataCenter>, new() { if (snapshot == null) { snapshot = CreateSnapshot(factory.GlobalAppName); } TSettings settings; var ex = factory.TryGetSettingsForGlobalApp(out settings, snapshot); if (ex != null) { throw ex; } return(settings); }
/// <summary> /// Actual implementation for logging. Must be provided by inheriting classes. /// </summary> protected abstract Task LogAsyncImpl(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot);
protected override void DeleteOrphanedOverrides(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot) { // there's never going to be orphaned overrides for an in-memory store }
protected override Task DeleteOrphanedOverridesAsync(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot) { // there's never going to be orphaned overrides for an in-memory store return(Task.FromResult(0)); }
protected override OverridesSnapshot <TSubApp, TTier, TDataCenter> RestoreSnapshotImpl(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot, string user) { var data = _appData; lock (data) { data.Commit = NewCommit(); var log = new NFigLogEvent <TDataCenter>( type: NFigLogEventType.RestoreSnapshot, globalAppName: snapshot.GlobalAppName, commit: data.Commit, timestamp: DateTime.UtcNow, settingName: null, settingValue: null, restoredCommit: snapshot.Commit, dataCenter: default(TDataCenter), user: user); data.LastEvent = log.BinarySerialize(); data.Overrides.Clear(); foreach (var o in snapshot.Overrides) { var key = GetOverrideKey(o.Name, o.SubApp, o.DataCenter); data.Overrides.Add(key, o.Value); } return(CreateSnapshot(data)); } }
protected override Task <OverridesSnapshot <TSubApp, TTier, TDataCenter> > RestoreSnapshotAsyncImpl(OverridesSnapshot <TSubApp, TTier, TDataCenter> snapshot, string user) { return(Task.FromResult(RestoreSnapshot(snapshot, user))); }