Пример #1
0
        public void Handle(ClientMessage.ScavengeDatabase message)
        {
            if (IsAllowed(message.User, message.CorrelationId, message.Envelope))
            {
                lock (_lock) {
                    if (_currentScavenge != null)
                    {
                        message.Envelope.ReplyWith(new ClientMessage.ScavengeDatabaseResponse(message.CorrelationId,
                                                                                              ClientMessage.ScavengeDatabaseResponse.ScavengeResult.InProgress,
                                                                                              _currentScavenge.ScavengeId));
                    }
                    else
                    {
                        var tfChunkScavengerLog = _logManager.CreateLog();

                        _cancellationTokenSource = new CancellationTokenSource();
                        var newScavenge = _currentScavenge = new TFChunkScavenger(_db, tfChunkScavengerLog, _tableIndex,
                                                                                  _readIndex, unsafeIgnoreHardDeletes: _unsafeIgnoreHardDeletes, threads: message.Threads);
                        var newScavengeTask = _currentScavenge.Scavenge(_alwaysKeepScavenged, _mergeChunks,
                                                                        message.StartFromChunk, _cancellationTokenSource.Token);

                        HandleCleanupWhenFinished(newScavengeTask, newScavenge);

                        message.Envelope.ReplyWith(new ClientMessage.ScavengeDatabaseResponse(message.CorrelationId,
                                                                                              ClientMessage.ScavengeDatabaseResponse.ScavengeResult.Started,
                                                                                              tfChunkScavengerLog.ScavengeId));
                    }
                }
            }
        }