Пример #1
0
        private async Task <HttpResponseMessage> ExecuteActualRequest(HttpControllerContext controllerContext, CancellationToken cancellationToken,
                                                                      MixedModeRequestAuthorizer authorizer)
        {
            HttpResponseMessage authMsg;

            if (authorizer.TryAuthorize(this, out authMsg) == false)
            {
                return(authMsg);
            }

            if (IsInternalRequest == false)
            {
                RequestManager.IncrementRequestCount();
            }

            var fileSystemInternal = await FileSystemsLandlord.GetFileSystemInternal(FileSystemName);

            if (fileSystemInternal == null)
            {
                var msg = "Could not find a file system named: " + FileSystemName;
                return(GetMessageWithObject(new { Error = msg }, HttpStatusCode.ServiceUnavailable));
            }

            var sp = Stopwatch.StartNew();

            var result = await base.ExecuteAsync(controllerContext, cancellationToken);

            sp.Stop();
            AddRavenHeader(result, sp);

            return(result);
        }
Пример #2
0
        public HttpResponseMessage Compact()
        {
            var fs = InnerRequest.RequestUri.ParseQueryString()["filesystem"];

            if (string.IsNullOrWhiteSpace(fs))
            {
                return(GetMessageWithString("Compact request requires a valid filesystem parameter", HttpStatusCode.BadRequest));
            }

            var configuration = FileSystemsLandlord.CreateTenantConfiguration(fs);

            if (configuration == null)
            {
                return(GetMessageWithString("No filesystem named: " + fs, HttpStatusCode.NotFound));
            }

            var task = Task.Factory.StartNew(() =>
            {
                // as we perform compact async we don't catch exceptions here - they will be propaged to operation
                var targetFs = FileSystemsLandlord.GetFileSystemInternal(fs).ResultUnwrap();
                FileSystemsLandlord.Lock(fs, () => targetFs.Storage.Compact(configuration));
                return(GetEmptyMessage());
            });
            long id;

            Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription
            {
                StartTime = SystemTime.UtcNow,
                TaskType  = TaskActions.PendingTaskType.CompactFilesystem,
                Payload   = "Compact filesystem " + fs,
            }, out id);

            return(GetMessageWithObject(new
            {
                OperationId = id
            }));
        }
Пример #3
0
        public HttpResponseMessage Compact()
        {
            var fs = InnerRequest.RequestUri.ParseQueryString()["filesystem"];

            if (string.IsNullOrWhiteSpace(fs))
            {
                return(GetMessageWithString("Compact request requires a valid filesystem parameter", HttpStatusCode.BadRequest));
            }

            var configuration = FileSystemsLandlord.CreateTenantConfiguration(fs);

            if (configuration == null)
            {
                return(GetMessageWithString("No filesystem named: " + fs, HttpStatusCode.NotFound));
            }

            var task = Task.Factory.StartNew(() =>
            {
                var compactStatus = new CompactStatus {
                    State = CompactStatusState.Running, Messages = new List <string>()
                };
                DatabasesLandlord.SystemDatabase.Documents.Delete(CompactStatus.RavenFilesystemCompactStatusDocumentKey(fs), null, null);
                try
                {
                    // as we perform compact async we don't catch exceptions here - they will be propagated to operation
                    var targetFs = FileSystemsLandlord.GetFileSystemInternal(fs).ResultUnwrap();
                    FileSystemsLandlord.Lock(fs, () => targetFs.Storage.Compact(configuration, msg =>
                    {
                        bool skipProgressReport = false;
                        bool isProgressReport   = false;
                        if (IsUpdateMessage(msg))
                        {
                            isProgressReport = true;
                            var now          = SystemTime.UtcNow;
                            compactStatus.LastProgressMessageTime = compactStatus.LastProgressMessageTime ?? DateTime.MinValue;
                            var timeFromLastUpdate = (now - compactStatus.LastProgressMessageTime.Value);
                            if (timeFromLastUpdate >= ReportProgressInterval)
                            {
                                compactStatus.LastProgressMessageTime = now;
                                compactStatus.LastProgressMessage     = msg;
                            }
                            else
                            {
                                skipProgressReport = true;
                            }
                        }
                        if (!skipProgressReport)
                        {
                            if (!isProgressReport)
                            {
                                compactStatus.Messages.Add(msg);
                            }
                            DatabasesLandlord.SystemDatabase.Documents.Put(CompactStatus.RavenFilesystemCompactStatusDocumentKey(fs), null,
                                                                           RavenJObject.FromObject(compactStatus), new RavenJObject(), null);
                        }
                    }));
                    compactStatus.State = CompactStatusState.Completed;
                    compactStatus.Messages.Add("File system compaction completed.");
                    DatabasesLandlord.SystemDatabase.Documents.Put(CompactStatus.RavenFilesystemCompactStatusDocumentKey(fs), null,
                                                                   RavenJObject.FromObject(compactStatus), new RavenJObject(), null);
                }
                catch (Exception e)
                {
                    compactStatus.Messages.Add("Unable to compact file system " + e.Message);
                    compactStatus.State = CompactStatusState.Faulted;
                    DatabasesLandlord.SystemDatabase.Documents.Put(CompactStatus.RavenFilesystemCompactStatusDocumentKey(fs), null,
                                                                   RavenJObject.FromObject(compactStatus), new RavenJObject(), null);
                    throw;
                }
                return(GetEmptyMessage());
            });

            long id;

            Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription
            {
                StartTime = SystemTime.UtcNow,
                TaskType  = TaskActions.PendingTaskType.CompactFilesystem,
                Payload   = "Compact filesystem " + fs,
            }, out id);

            return(GetMessageWithObject(new
            {
                OperationId = id
            }));
        }