public void SignalCommit() { lock (_sync) { signal = TransactionSignal.Commit; if (!inPoint.IsSet) { inPoint.Set(); } } }
public void SignalRollback() { lock (_sync) { signal = TransactionSignal.Rollback; if (!inPoint.IsSet) { inPoint.Set(); } } }
private void persistTask() { while (true) { long operationId; opsTime.Reset(); opsTime.Start(); while (!opsToPersist.IsEmpty) { if (opsToPersist.TryDequeue(out operationId)) { foreach (var bPlusPersister in persisters) { if (bPlusPersister.IsDisposed) { disposedList.Add(bPlusPersister); continue; } bPlusPersister.PersistOperation(operationId); } } } opsTime.Stop(); if (LoggerManager.Instance.IndexLogger != null && persisters.Count > 0) { LoggerManager.Instance.IndexLogger.Debug("BPlusPersister", "Index Ops Persisted, Time Taken: " + opsTime.ElapsedMilliseconds + " (ms)"); } switch (signal) { case TransactionSignal.Commit: commitRollbackTime.Reset(); commitRollbackTime.Start(); foreach (var bPlusPersister in persisters) { if (bPlusPersister.IsDisposed) { disposedList.Add(bPlusPersister); continue; } try { if (bPlusPersister != null) { bPlusPersister.Commit(); } } catch (Exception ex) { disposedList.Add(bPlusPersister); bPlusPersister.Parent.RecreateIndex(bPlusPersister.Configuration); if (LoggerManager.Instance.IndexLogger != null) { LoggerManager.Instance.IndexLogger.Error("BPlusPersister", "Index corruption detected on commit, " + ex.Message + ", Regenerating index..."); } } } commitRollbackTime.Stop(); signal = TransactionSignal.Idle; outPoint.Set(); if (LoggerManager.Instance.IndexLogger != null && persisters.Count > 0) { LoggerManager.Instance.IndexLogger.Debug("BPlusPersister", "Commit Executed, " + "Time Taken: " + commitRollbackTime.ElapsedMilliseconds + "(ms)" + ", InSync:" + inPoint.IsSet + ", OutSync:" + outPoint.IsSet); } break; case TransactionSignal.Rollback: commitRollbackTime.Reset(); commitRollbackTime.Start(); foreach (var bPlusPersister in persisters) { if (bPlusPersister.IsDisposed) { disposedList.Add(bPlusPersister); continue; } try { bPlusPersister.Rollback(); } catch (Exception ex) { disposedList.Add(bPlusPersister); bPlusPersister.Parent.RecreateIndex(bPlusPersister.Configuration); if (LoggerManager.Instance.IndexLogger != null) { LoggerManager.Instance.IndexLogger.Error("BPlusPersister", "Index corruption detected on rollback, " + ex.Message + ", Regenerating index..."); } } } commitRollbackTime.Stop(); signal = TransactionSignal.Idle; outPoint.Set(); if (LoggerManager.Instance.IndexLogger != null && persisters.Count > 0) { LoggerManager.Instance.IndexLogger.Debug("BPlusPersister", "Rollback Executed" + "Time Taken: " + commitRollbackTime.ElapsedMilliseconds + "(ms)" + ", InSync:" + inPoint.IsSet + ", OutSync:" + outPoint.IsSet); } break; } foreach (var bPlusPersister in disposedList) { persisters.Remove(bPlusPersister); } if (opsToPersist.IsEmpty) { inPoint.Reset(); } inSyncTime.Reset(); inSyncTime.Start(); inPoint.Wait(); inSyncTime.Stop(); if (stop) { return; } } }