Exemplo n.º 1
0
 public void RecoverScannedImages(Action<IScannedImage> imageCallback)
 {
     var op = new RecoveryOperation(formFactory, scannedImageFactory, userConfigManager, threadFactory);
     var progressForm = formFactory.Create<FProgress>();
     progressForm.Operation = op;
     if (op.Start(imageCallback))
     {
         progressForm.ShowDialog();
     }
 }
Exemplo n.º 2
0
 public void RecoverScannedImages(Action<ScannedImage> imageCallback)
 {
     var op = new RecoveryOperation(formFactory, threadFactory, thumbnailRenderer);
     var progressForm = formFactory.Create<FProgress>();
     progressForm.Operation = op;
     if (op.Start(imageCallback))
     {
         progressForm.ShowDialog();
     }
 }
 public RecoveryOperationViewModel(RecoveryOperation recoveryOperationInfo, NotificationApplicationCompletionProgress progress)
 {
     NotificationId = recoveryOperationInfo.NotificationId;
     NotificationType = recoveryOperationInfo.NotificationType;
     IsPreconsentStatusChosen = progress.HasPreconsentedInformation;
     AreOperationCodesChosen = progress.HasOperationCodes;
     IsTechnologyEmployedCompleted = progress.HasTechnologyEmployed;
     IsReasonForExportCompleted = progress.HasReasonForExport;
     PreconstedAnswer = recoveryOperationInfo.PreconstedAnswer;
     OperationCodes = recoveryOperationInfo.OperationCodes.OrderBy(c => c).Select(EnumHelper.GetDisplayName).ToList();
     TechnologyEmployed = recoveryOperationInfo.TechnologyEmployed;
     ReasonForExport = recoveryOperationInfo.ReasonForExport;
 }
        public void correct_recovery_operation_is_invoked()
        {
            RecoveryResult result;

            LiveProducer.SetLastTimestampBeforeDisconnect(DateTime.MinValue);
            var operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, false);

            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));

            LiveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(10));

            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), It.IsAny <DateTime>(), 0), Times.Once);
            _recoveryRequestIssuerMock.Verify(x => x.RequestFullOddsRecoveryAsync(It.IsAny <IProducer>(), 0), Times.Once);

            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));
        }
        public void starting_recovery_with_after_to_far_in_past_throws()
        {
            var producer = LiveProducer;

            producer.SetLastTimestampBeforeDisconnect(_timeProvider.Now - (producer.MaxAfterAge() + TimeSpan.FromSeconds(30)));
            var operation = new RecoveryOperation(producer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, true);

            try
            {
                operation.Start();
            }
            catch (Exception)
            {
                _recoveryRequestIssuerMock.Verify(x => x.RequestFullOddsRecoveryAsync(It.IsAny <IProducer>(), 0), Times.Never);
                _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), It.IsAny <DateTime>(), 0), Times.Never);
                producer.SetLastTimestampBeforeDisconnect(DateTime.MinValue);
                throw;
            }
        }
Exemplo n.º 6
0
        public void RecoveryIsCalledWithCorrectAdjustedAfter()
        {
            var operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, true);

            _liveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(321));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), _liveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));

            _liveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(90));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), _liveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));

            _liveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(10));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), _liveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));
        }
Exemplo n.º 7
0
        public void FirstInterruptTimeIsRecorded()
        {
            var operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);

            operation.Start();

            _timeProvider.AddSeconds(60);
            var interruptTime = _timeProvider.Now;

            operation.Interrupt(interruptTime);


            _timeProvider.AddSeconds(60);
            operation.Interrupt(_timeProvider.Now);

            operation.TryComplete(MessageInterest.AllMessages, out var result);
            Assert.IsNotNull(result);
            Assert.AreEqual(result.InterruptedAt, interruptTime);
        }
        public void recovery_is_called_with_correct_after()
        {
            RecoveryResult result;
            var            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, false);

            LiveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(10));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), LiveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));

            LiveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(90));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), LiveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));

            LiveProducer.SetLastTimestampBeforeDisconnect(TimeProviderAccessor.Current.Now - TimeSpan.FromMinutes(321));
            operation.Start();
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(It.IsAny <IProducer>(), LiveProducer.LastTimestampBeforeDisconnect, 0), Times.Once);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));
        }
        public void values_after_time_out_are_correct()
        {
            var operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);

            operation.Start();
            var startTime = _timeProvider.Now;

            _timeProvider.AddSeconds(LiveProducer.MaxRecoveryTime + 1);
            Assert.IsTrue(operation.HasTimedOut());
            var result = operation.CompleteTimedOut();

            Assert.IsNotNull(result);
            Assert.IsFalse(result.Success);
            Assert.AreEqual(result.RequestId, 1);
            Assert.AreEqual(result.InterruptedAt, null);
            Assert.AreEqual(result.StartTime, startTime);
            Assert.IsTrue(result.TimedOut);
            Assert.IsFalse(operation.IsRunning);
            Assert.IsNull(operation.RequestId);
        }
Exemplo n.º 10
0
        private RecoveryOperationStatus ResumeRecoveryJob(RecoveryOperation opContext)
        {
            RecoveryOperationStatus status = new RecoveryOperationStatus(RecoveryStatus.Failure);

            status.JobIdentifier = opContext.JobIdentifer;
            if (opContext != null)
            {
                if (_databaseJobMap.ContainsKey(opContext.JobIdentifer))
                {
                    List <RecoveryJobBase> _jobList = _databaseJobMap[opContext.JobIdentifer].JobList;
                    if (_jobList.Count == 1)
                    {
                        _jobList[0].Resume();
                    }
                    else
                    {
                        // M_TODO: complete sharded backup
                    }
                }
            }
            return(status);
        }
Exemplo n.º 11
0
        public void OperationCanBeReused()
        {
            var operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, false);

            operation.Start();
            _timeProvider.AddSeconds(60);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));

            _timeProvider.AddSeconds(1800);
            operation.Start();
            _timeProvider.AddSeconds(120);
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));

            operation.Start();
            _timeProvider.AddSeconds(_liveProducer.MaxRecoveryTime + 1);
            Assert.IsTrue(operation.HasTimedOut());
            Assert.IsNotNull(operation.CompleteTimedOut());

            _timeProvider.AddSeconds(10);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));
        }
        public void works_correct_with_only_one_session()
        {
            RecoveryResult    result;
            RecoveryOperation operation;

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.AllMessages, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.PrematchMessagesOnly }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.PrematchMessagesOnly, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.VirtualSportMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.VirtualSportMessages, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.HighPriorityMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.HighPriorityMessages, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LowPriorityMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LowPriorityMessages, out result));

            operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);
            operation.Start();
            Assert.IsFalse(operation.TryComplete(MessageInterest.LiveMessagesOnly, out result));
            Assert.IsFalse(operation.TryComplete(MessageInterest.PrematchMessagesOnly, out result));
            Assert.IsFalse(operation.TryComplete(MessageInterest.VirtualSportMessages, out result));
            Assert.IsFalse(operation.TryComplete(MessageInterest.HighPriorityMessages, out result));
            Assert.IsFalse(operation.TryComplete(MessageInterest.LowPriorityMessages, out result));
            Assert.IsTrue(operation.TryComplete(MessageInterest.AllMessages, out result));
        }
Exemplo n.º 13
0
        public void ValuesAfterCompletionAreCorrect()
        {
            var operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);

            operation.Start();
            var startTime = _timeProvider.Now;

            _timeProvider.AddSeconds(60);

            var completed = operation.TryComplete(MessageInterest.AllMessages, out var result);

            Assert.IsTrue(completed);
            Assert.IsNotNull(result);

            Assert.IsTrue(result.Success);
            Assert.AreEqual(1, result.RequestId);
            Assert.AreEqual(startTime, result.StartTime);
            Assert.IsNull(result.InterruptedAt);
            Assert.IsFalse(result.TimedOut);

            Assert.IsFalse(operation.IsRunning);
            Assert.IsNull(operation.RequestId);
        }
Exemplo n.º 14
0
        private RecoveryOperationStatus GetJobStatistics(RecoveryOperation opContext)
        {
            RecoveryOperationStatus status = new RecoveryOperationStatus(RecoveryStatus.Success);

            status.JobIdentifier = opContext.JobIdentifer;
            if (opContext != null)
            {
                try
                {
                    if (_databaseJobMap.ContainsKey(opContext.JobIdentifer))
                    {
                        foreach (RecoveryJobBase job in _databaseJobMap[opContext.JobIdentifer].JobList)
                        {
                            // query latest job status
                            _databaseJobMap[opContext.JobIdentifer].ExecutionState.UpdateEntityState((RecoveryJobStateBase)job.JobStatistics());// job statistics returning mechanism
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                    {
                        LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.GetStatistics()", opContext.JobIdentifer + "_" + _databaseJobMap[opContext.JobIdentifer].ExecutionState.JobType + " : " + ex.ToString());
                    }
                    if (_databaseJobMap.ContainsKey(opContext.JobIdentifer))
                    {
                        _databaseJobMap[opContext.JobIdentifer].ExecutionState.Status  = RecoveryStatus.Failure;
                        _databaseJobMap[opContext.JobIdentifer].ExecutionState.Message = "Failure during get statistics call";
                    }
                }
                finally
                {
                    CheckJobState(opContext.JobIdentifer, true);
                }
            }
            return(status);
        }
Exemplo n.º 15
0
        public void WorksCorrectWithOnlyOneSession()
        {
            var operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);

            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.AllMessages, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LiveMessagesOnly }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.PrematchMessagesOnly }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.PrematchMessagesOnly, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.VirtualSportMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.VirtualSportMessages, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.HighPriorityMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.HighPriorityMessages, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.LowPriorityMessages }, 0, false);
            operation.Start();
            Assert.IsTrue(operation.TryComplete(MessageInterest.LowPriorityMessages, out _));

            operation = new RecoveryOperation(_liveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);
            operation.Start();
            Assert.IsFalse(operation.TryComplete(MessageInterest.LiveMessagesOnly, out _));
            Assert.IsFalse(operation.TryComplete(MessageInterest.PrematchMessagesOnly, out _));
            Assert.IsFalse(operation.TryComplete(MessageInterest.VirtualSportMessages, out _));
            Assert.IsFalse(operation.TryComplete(MessageInterest.HighPriorityMessages, out _));
            Assert.IsFalse(operation.TryComplete(MessageInterest.LowPriorityMessages, out _));
            Assert.IsTrue(operation.TryComplete(MessageInterest.AllMessages, out _));
        }
Exemplo n.º 16
0
        public void recovery_is_started_after_connection_is_shutdown()
        {
            _timeProvider.Now = new DateTime(2000, 1, 1, 12, 0, 0);
            var disconnectedTime = _timeProvider.Now - TimeSpan.FromHours(2);

            _producer.SetLastTimestampBeforeDisconnect(disconnectedTime);

            var recoveryOperation = new RecoveryOperation(_producer, _recoveryRequestIssuerMock.Object, new[] { DefaultInterest }, 0, false);
            var recoveryManager   = new ProducerRecoveryManager(_producer, recoveryOperation, _timestampTracker);

            recoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(_producer, disconnectedTime, 0), Times.Once);
            Assert.AreEqual(ProducerRecoveryStatus.Started, recoveryManager.Status);
            Debug.Assert(recoveryOperation.RequestId != null, "recoveryOperation.RequestId != null");
            recoveryManager.ProcessUserMessage(_messageBuilder.BuildSnapshotComplete(recoveryOperation.RequestId.Value), DefaultInterest);
            Assert.AreEqual(ProducerRecoveryStatus.Completed, recoveryManager.Status);
            recoveryManager.ProcessUserMessage(_messageBuilder.BuildAlive(_producer.Id, _timeProvider.Now), DefaultInterest);

            recoveryManager.ConnectionShutdown();
            Assert.AreEqual(ProducerRecoveryStatus.Error, recoveryManager.Status);
            recoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            Assert.AreEqual(ProducerRecoveryStatus.Started, recoveryManager.Status);
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(_producer, _timeProvider.Now, 0));
        }
Exemplo n.º 17
0
        //M_TODO: must Specify DB name in case of shard job, so a separate job is created, for now this will run multiple times and override job if more
        //than one db is specified.
        private JobInfoObject CreateRestoreJob(RecoveryOperation opContext)
        {
            JobInfoObject   infoObject = null;
            RecoveryJobBase dataJob    = null;


            #region RestoreJob
            SubmitRestoreOpParams resParam = (SubmitRestoreOpParams)opContext.Parameter;

            foreach (string db in resParam.PersistenceConfiguration.DbCollectionMap.Keys)
            {
                // create handler object
                // Note: this is kept inside the loop with the assumption that a seperate info object is to be kept for each database in complete cluster job
                infoObject = new JobInfoObject(opContext.JobIdentifer, _context.LocalShardName, _context.LocalAddress.ip, _context.ClusterName,
                                               RecoveryJobType.DataRestore, resParam.PersistenceConfiguration.FilePath);

                string destination = resParam.PersistenceConfiguration.DbCollectionMap[db].Keys.First();

                // create DataJob
                dataJob = new DatabaseRestoreJob(opContext.JobIdentifer, _context, destination, resParam.PersistenceConfiguration.DbCollectionMap[db][destination].ToList <string>(), infoObject.RecoveryPersistenceManager, _context.ClusterName);
                dataJob.RegisterProgressHandler(this);
                infoObject.AddJob(dataJob);

                // set persistence configuration
                if (resParam.PersistenceConfiguration.FileName == null)
                {
                    resParam.PersistenceConfiguration.FileName = new List <string>();
                    resParam.PersistenceConfiguration.FileName.Add(db);//add name of all databases for shard level job
                }

                infoObject.RecoveryPersistenceManager.SetJobConfiguration(RecoveryJobType.DataRestore, resParam.PersistenceConfiguration, db, 1);
            }
            #endregion

            return(infoObject);
        }
Exemplo n.º 18
0
 public RecoveryOperationStatus SubmitDataRecoveryJob(string cluster, string shard, RecoveryOperation opContext)
 {
     try
     {
         return(dbMgtServer.OnRecoveryOperationReceived(cluster, shard, opContext));
     }
     catch (System.Exception ex)
     {
         throw ex;
     }
 }
Exemplo n.º 19
0
 internal override bool Initialize(RecoveryOperation operation)
 {
     return(base.Initialize(operation));
 }
Exemplo n.º 20
0
        internal RecoveryOperationStatus RecoveryOperationReceived(RecoveryOperation opContext)
        {
            RecoveryOperationStatus status = new RecoveryOperationStatus(RecoveryStatus.Failure);

            status.JobIdentifier = opContext.JobIdentifer;
            try
            {
                switch (opContext.OpCode)
                {
                case RecoveryOpCodes.SubmitBackupJob:
                case RecoveryOpCodes.SubmitRestoreJob:

                    if (ValidatePrequisites(opContext).Status == RecoveryStatus.Success)
                    {
                        status.Status  = RecoveryStatus.Submitted;
                        status.Message = "Submitted successfuly";
                        SubmitRecoveryJob(opContext);
                    }
                    else
                    {
                        status.Message = "Failed to submit task on node";
                    }
                    break;

                case RecoveryOpCodes.StartJob:
                    status = StartRecoveryJob(opContext);
                    break;

                case RecoveryOpCodes.EndJob:
                case RecoveryOpCodes.CancelJob:
                    status = CancelRecoveryJob(opContext);
                    break;

                case RecoveryOpCodes.PauseJob:
                    status = PauseRecoveryJob(opContext);
                    break;

                case RecoveryOpCodes.ResumeJob:
                    status = ResumeRecoveryJob(opContext);
                    break;

                case RecoveryOpCodes.CancelAllJobs:
                    status = CancelAllJobs();
                    break;

                case RecoveryOpCodes.SubmitShardBackupJob:
                case RecoveryOpCodes.SubmitShardRecoveryJob:
                    if (ValidatePrequisites(opContext).Status == RecoveryStatus.Success)
                    {
                        status.Status  = RecoveryStatus.Submitted;
                        status.Message = "Submitted successfuly";
                        SubmitShardRecoveryJob(opContext);
                    }
                    else
                    {
                        status.Message = "Failed to submit task on node";
                    }
                    break;

                case RecoveryOpCodes.GetJobStatistics:
                    status = GetJobStatistics(opContext);
                    break;
                }
            }
            catch (Exception exp)
            {
                if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                {
                    LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.Receive()", exp.ToString());
                }
            }
            return(status);
        }
Exemplo n.º 21
0
        private RecoveryOperationStatus ValidatePrequisites(RecoveryOperation opContext)
        {
            RecoveryOperationStatus state = new RecoveryOperationStatus(RecoveryStatus.Success);

            state.JobIdentifier = opContext.JobIdentifer;
            try
            {
                // must check state transfer
                //if (_context.StatusLatch.IsAnyBitsSet(BucketStatus.UnderStateTxfr))
                //{
                //    state.Status = RecoveryStatus.Success;//M_TODO: change this to false, once this state transfer code is complete
                //    if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsInfoEnabled)
                //        LoggerManager.Instance.RecoveryLogger.Info("ShardRecoveryManager.Validate()", opContext.JobIdentifer + "  failed because node is in state transfer");
                //}

                if (state.Status == RecoveryStatus.Success)
                {
                    string path     = string.Empty;
                    string username = "";
                    string password = "";
                    Dictionary <string, Dictionary <string, string[]> > dbMap = new Dictionary <string, Dictionary <string, string[]> >();
                    switch (opContext.OpCode)
                    {
                    case RecoveryOpCodes.SubmitBackupJob:
                        SubmitBackupOpParams _bckpParam = (SubmitBackupOpParams)opContext.Parameter;
                        path     = _bckpParam.PersistenceConfiguration.FilePath;
                        dbMap    = _bckpParam.PersistenceConfiguration.DbCollectionMap;
                        username = _bckpParam.PersistenceConfiguration.UserName;
                        password = _bckpParam.PersistenceConfiguration.Password;
                        break;

                    case RecoveryOpCodes.SubmitRestoreJob:
                        SubmitRestoreOpParams _resParam = (SubmitRestoreOpParams)opContext.Parameter;

                        path     = Path.Combine(_resParam.PersistenceConfiguration.FilePath);
                        username = _resParam.PersistenceConfiguration.UserName;
                        password = _resParam.PersistenceConfiguration.Password;
                        dbMap    = _resParam.PersistenceConfiguration.DbCollectionMap;
                        List <string> shardNameList = new List <string>();
                        shardNameList.Add(_context.LocalShardName);
                        Impersonation impersonation = null;
                        bool          isSharedPath  = RecoveryFolderStructure.PathIsNetworkPath(path);
                        if (isSharedPath)
                        {
                            impersonation = new Impersonation(username, password);
                        }

                        state = RecoveryFolderStructure.ValidateFolderStructure(path, RecoveryJobType.DataRestore, false, shardNameList);

                        if (isSharedPath)
                        {
                            impersonation.Dispose();
                        }

                        if (state.Status == RecoveryStatus.Failure)
                        {
                            if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                            {
                                LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.Validate()", state.Message);
                            }
                            return(state);
                        }
                        else
                        {
                            #region validate files
                            string folderName = string.Empty;
                            string fileName   = dbMap.First().Key;
                            string folderPath = Path.Combine(path, folderName);
                            string filePath   = Path.Combine(folderPath, fileName);

                            isSharedPath = RecoveryFolderStructure.PathIsNetworkPath(folderPath);
                            bool fileExists = false;
                            if (isSharedPath)
                            {
                                BackupFile file = new BackupFile(fileName, folderPath, null, null);
                                impersonation = new Impersonation(username, password);
                                fileExists    = File.Exists(filePath);
                                impersonation.Dispose();
                            }
                            else
                            {
                                fileExists = File.Exists(filePath);
                            }

                            if (fileExists)
                            {
                                BackupFile file = new BackupFile(fileName, folderPath, username, password);


                                Alachisoft.NosDB.Core.Recovery.Persistence.BackupFile.Header header = file.ReadFileHeader();

                                if (!header.Database.ToLower().Equals(dbMap.First().Key))
                                {
                                    state.Status  = RecoveryStatus.Failure;
                                    state.Message = "Provided file does not contain the source database " + fileName;
                                    file.Close();
                                    return(state);
                                }
                                file.Close();
                            }
                            else
                            {
                                state.Status  = RecoveryStatus.Failure;
                                state.Message = "No file exists in the given folder";
                                return(state);
                            }

                            #endregion
                        }

                        break;
                    }

                    // this will only be false for backup
                    if (!Directory.Exists(path))
                    {
                        try
                        {
                            Impersonation impersonation = null;
                            if (RecoveryFolderStructure.PathIsNetworkPath(path))
                            {
                                impersonation = new Impersonation(username, password);
                            }

                            Directory.CreateDirectory(path);

                            if (dbMap.Count > 0)
                            {
                                // check space for backup job
                                long size = 0;
                                foreach (string db in dbMap.Keys)
                                {
                                    DatabaseStore database = _context.DatabasesManager.GetDatabase(db) as DatabaseStore;
                                    size = database.Size;
                                }

                                ulong availableFreeSpace = Util.DirectoryUtil.GetDiskFreeSpace(path);
                                ulong requiredSize       = (ulong)size;
                                if (availableFreeSpace > requiredSize)
                                {
                                    state.Status = RecoveryStatus.Success;
                                }
                                else
                                {
                                    state.Status  = RecoveryStatus.Failure;
                                    state.Message = "Available memory is less than the required memory for backup";
                                    return(state);
                                }
                            }
                            if (impersonation != null)
                            {
                                impersonation.Dispose();
                            }
                        }
                        catch (Exception ex)
                        {
                            state.Status  = RecoveryStatus.Failure;
                            state.Message = ex.Message;
                            if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                            {
                                LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.Validate()", ex.ToString());
                            }
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                state.Status  = RecoveryStatus.Failure;
                state.Message = exp.ToString();
                if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                {
                    LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.Validate()", opContext.JobIdentifer + " : " + exp.ToString());
                }
            }
            return(state);
        }
        public void setting_interrupt_on_not_running_instance_throws()
        {
            var operation = new RecoveryOperation(LiveProducer, _recoveryRequestIssuerMock.Object, new[] { MessageInterest.AllMessages }, 0, false);

            operation.Interrupt(_timeProvider.Now);
        }
Exemplo n.º 23
0
 public RecoveryOperationStatus SubmitRecoveryJob(string cluster, string shard, RecoveryOperation opContext)
 {
     return(_communicationHandler.SubmitRecoveryJob(cluster, shard, opContext));
 }
Exemplo n.º 24
0
        private RecoveryOperationStatus CancelRecoveryJob(RecoveryOperation opContext)
        {
            RecoveryOperationStatus status = new RecoveryOperationStatus(RecoveryStatus.Success);

            status.JobIdentifier = opContext.JobIdentifer;

            if (opContext != null)
            {
                try
                {
                    #region End/Cancel job
                    if (_databaseJobMap.ContainsKey(opContext.JobIdentifer))
                    {
                        List <RecoveryJobBase> jobList = _databaseJobMap[opContext.JobIdentifer].JobList;

                        foreach (RecoveryJobBase job in jobList)
                        {
                            if (opContext.OpCode == RecoveryOpCodes.CancelJob)
                            {
                                switch (job.JobType)
                                {
                                case RecoveryJobType.DataBackup:
                                    _databaseJobMap[opContext.JobIdentifer].RecoveryPersistenceManager.CloseBackupFile(job.Database, RecoveryFileState.Cancelled);
                                    break;

                                    //NOTE: diffbackup job is ignored under the assumption oplog file will close the file for it
                                }
                            }
                            //if (job.JobType != RecoveryJobType.DifferentialRestore)
                            {
                                try
                                {
                                    if (job.State != ThreadState.Unstarted && job.State != ThreadState.Stopped && job.State != ThreadState.WaitSleepJoin)
                                    {
                                        job.Stop();
                                    }
                                }
                                catch (ThreadAbortException)
                                {
                                    Thread.ResetAbort();
                                }
                                catch (Exception exp)
                                { }

                                try
                                {
                                    job.Dispose();
                                }
                                catch (ThreadAbortException)
                                {
                                    Thread.ResetAbort();
                                }
                                catch (Exception exp)
                                { }
                            }
                            //else
                            //{
                            //    _databaseJobMap[opContext.JobIdentifer].RecoveryPersistenceManager.IsJobActive = false;
                            //    _databaseJobMap[opContext.JobIdentifer].RecoveryPersistenceManager.Dispose();
                            //}
                        }
                        #region rename folder
                        JobInfoObject infoObj = _databaseJobMap[opContext.JobIdentifer];
                        if (infoObj.JobType == RecoveryJobType.DataBackup)
                        {
                            switch (opContext.OpCode)
                            {
                            case RecoveryOpCodes.CancelJob:
                                infoObj.RenameRootFolder(RecoveryFileState.Cancelled);
                                break;
                            }
                        }
                        #endregion
                        // removing job from databaseJobMap
                        _databaseJobMap[opContext.JobIdentifer].RecoveryPersistenceManager.IsJobActive = false;
                        _databaseJobMap[opContext.JobIdentifer].Dispose();
                        _databaseJobMap.Remove(opContext.JobIdentifer);
                    }
                    #endregion
                }
                catch (Exception exp)
                {
                    if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                    {
                        LoggerManager.Instance.RecoveryLogger.Error("ShardRecoveryManager.CancelRecoveryJob()", opContext.JobIdentifer + "_" + _databaseJobMap[opContext.JobIdentifer].ExecutionState.JobType + " : " + exp.ToString());
                    }

                    if (_databaseJobMap.ContainsKey(opContext.JobIdentifer))
                    {
                        _databaseJobMap[opContext.JobIdentifer].ExecutionState.Status  = RecoveryStatus.Failure;
                        _databaseJobMap[opContext.JobIdentifer].ExecutionState.Message = "Failure during Cancel phase";

                        // commented because the config server will not have any job handler to recieve this message
                        //CheckJobState(opContext.JobIdentifer, true);
                    }
                    status.Status  = RecoveryStatus.Failure;
                    status.Message = exp.ToString();
                }
            }
            if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsInfoEnabled)
            {
                LoggerManager.Instance.RecoveryLogger.Info("ShardRecoveryManager.CancelRecoveryJob()", status.ToString());
            }

            return(status);
        }
        internal virtual bool Initialize(RecoveryOperation operation)
        {
            _jobIdentifier = operation.JobIdentifer;

            return(true);
        }
Exemplo n.º 26
0
 public Common.Recovery.RecoveryOperationStatus SubmitDataRecoveryJob(string cluster, string shard, RecoveryOperation opContext)
 {
     try
     {
         ManagementCommand command = GetManagementCommand(ConfigurationCommandUtil.MethodName.SubmitRecoveryJob);
         command.Parameters.AddParameter(cluster);
         command.Parameters.AddParameter(shard);
         command.Parameters.AddParameter(opContext);
         return((Common.Recovery.RecoveryOperationStatus)ExecuteCommandOnMgtServer(command, true));
     }
     catch (System.Exception e)
     {
         throw e;
     }
 }