示例#1
0
        private void ProcessData(InnerData data)
        {
            _lock.EnterReadLock();
            bool exit = _isStart;

            _lock.ExitReadLock();
            if (!exit)
            {
                return;
            }

            data.Transaction.OperationName = OperationName.RestoreUpdate;
            data.Transaction.OperationType = OperationType.Async;

            var result = WriterNet.ProcessSync(_remote, data);

            if (result is FailNetResult)
            {
                Logger.Logger.Instance.InfoFormat("Servers {0} unavailable in recover process", _remote);
                _asyncTaskModule.DeleteTask(AsyncTasksNames.RestoreLocal);
                _reader.Stop();

                _lock.EnterWriteLock();
                _isStart = false;
                _lock.ExitWriteLock();
            }
            else if (!_local.Equals(_remote))
            {
                _db.Delete(data);
            }
        }
示例#2
0
        private void NoAnswerCallback(AsyncData async)
        {
            _asyncTaskModule.StopTask(AsyncTasksNames.RestoreRemote);

            if (async.IsLast())
            {
                AddServerToFailed(_remoteServer);
                StartNextServer();
                return;
            }

            var ret = WriterNet.SendToWriter(_remoteServer,
                                             new RestoreCommandWithData(_local[0].ServerId,
                                                                        _local.ToList(), _isModelUpdated, _tableName));

            if (ret is FailNetResult)
            {
                AddServerToFailed(_remoteServer);
                StartNextServer();
            }
            else
            {
                _asyncTaskModule.StartTask(AsyncTasksNames.RestoreRemote);
            }
        }
示例#3
0
        private int SendNextServer()
        {
            var next = _servers.FirstOrDefault(x => !x.Value);

            if (next.Equals(default(KeyValuePair <ServerId, bool>)))
            {
                return(-1);
            }

            bool result = WriterNet.ConnectToWriter(next.Key);

            Logger.Logger.Instance.Debug(string.Format("Connection result = {0}", result), "restore");
            var ret = WriterNet.SendToWriter(next.Key,
                                             new RestoreCommandWithData(_local[0].ServerId,
                                                                        _local.ToList(), !next.Key.Equals(_local[0].ServerId) && _isModelUpdated, _tableName));

            _servers[next.Key] = true;

            if (ret is FailNetResult)
            {
                Logger.Logger.Instance.ErrorFormat(
                    "Restore command for server: {0} failed with result: {1}", next.Key, ret.Description);
                AddServerToFailed(next.Key);
                return(1);
            }
            _remoteServer = next.Key;

            return(0);
        }
示例#4
0
        private void RestoreAnswerCallback(AsyncData obj)
        {
            Logger.Logger.Instance.Debug(
                string.Format("Async complete = {0}, start = {1}", _reader.IsComplete, _isStart), "restore");

            if (_reader.IsComplete && _isStart)
            {
                _asyncTaskModule.DeleteTask(AsyncTasksNames.RestoreLocal);
                _lock.EnterWriteLock();
                _isStart = false;
                _lock.ExitWriteLock();
                WriterNet.SendToWriter(_remote, new RestoreCompleteCommand(_local));
                _reader.Dispose();
            }
            else
            {
                if (_reader.IsQueueEmpty && _isStart)
                {
                    _reader.GetAnotherData();
                }

                WriterNet.SendToWriter(_remote, new RestoreInProcessCommand(_local));
            }
        }