コード例 #1
0
 public void SignalCommit()
 {
     lock (_sync)
     {
         signal = TransactionSignal.Commit;
         if (!inPoint.IsSet)
         {
             inPoint.Set();
         }
     }
 }
コード例 #2
0
 public void SignalRollback()
 {
     lock (_sync)
     {
         signal = TransactionSignal.Rollback;
         if (!inPoint.IsSet)
         {
             inPoint.Set();
         }
     }
 }
コード例 #3
0
        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;
                }
            }
        }