コード例 #1
0
        public HttpResponseMessage Compact()
        {
            var db = InnerRequest.RequestUri.ParseQueryString()["database"];

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

            var configuration = DatabasesLandlord.CreateTenantConfiguration(db);

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

            try
            {
                var targetDb = DatabasesLandlord.GetDatabaseInternal(db).ResultUnwrap();
                DatabasesLandlord.Lock(db, () => targetDb.TransactionalStorage.Compact(configuration));
                return(GetEmptyMessage());
            }
            catch (NotSupportedException e)
            {
                return(GetMessageWithString(e.Message, HttpStatusCode.BadRequest));
            }
        }
コード例 #2
0
        public HttpResponseMessage Compact()
        {
            EnsureSystemDatabase();

            var db = InnerRequest.RequestUri.ParseQueryString()["database"];

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

            var configuration = DatabasesLandlord.CreateTenantConfiguration(db);

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

            DatabasesLandlord.Lock(db, () => DatabasesLandlord.SystemDatabase.TransactionalStorage.Compact(configuration));

            return(GetEmptyMessage());
        }
コード例 #3
0
        public HttpResponseMessage Compact()
        {
            var db = InnerRequest.RequestUri.ParseQueryString()["database"];

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

            var configuration = DatabasesLandlord.CreateTenantConfiguration(db);

            if (configuration == null)
            {
                return(GetMessageWithString("No database named: " + db, 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 targetDb = DatabasesLandlord.GetDatabaseInternal(db).ResultUnwrap();
                DatabasesLandlord.Lock(db, () => targetDb.TransactionalStorage.Compact(configuration));
                return(GetEmptyMessage());
            });
            long id;

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

            return(GetMessageWithObject(new
            {
                OperationId = id
            }));
        }
コード例 #4
0
        public HttpResponseMessage Compact()
        {
            var db = InnerRequest.RequestUri.ParseQueryString()["database"];

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

            var configuration = DatabasesLandlord.CreateTenantConfiguration(db);

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

            var task = Task.Factory.StartNew(() =>
            {
                var compactStatus = new CompactStatus {
                    State = CompactStatusState.Running, Messages = new List <string>()
                };
                DatabasesLandlord.SystemDatabase.Documents.Delete(CompactStatus.RavenDatabaseCompactStatusDocumentKey(db), null, null);

                try
                {
                    var targetDb = DatabasesLandlord.GetDatabaseInternal(db).ResultUnwrap();

                    DatabasesLandlord.Lock(db, () => targetDb.TransactionalStorage.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.RavenDatabaseCompactStatusDocumentKey(db), null,
                                                                           RavenJObject.FromObject(compactStatus), new RavenJObject(), null);
                        }
                    }));
                    compactStatus.State = CompactStatusState.Completed;
                    compactStatus.Messages.Add("Database compaction completed.");
                    DatabasesLandlord.SystemDatabase.Documents.Put(CompactStatus.RavenDatabaseCompactStatusDocumentKey(db), null,
                                                                   RavenJObject.FromObject(compactStatus), new RavenJObject(), null);
                }
                catch (Exception e)
                {
                    compactStatus.Messages.Add("Unable to compact database " + e.Message);
                    compactStatus.State = CompactStatusState.Faulted;
                    DatabasesLandlord.SystemDatabase.Documents.Put(CompactStatus.RavenDatabaseCompactStatusDocumentKey(db), 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.CompactDatabase,
                Payload   = "Compact database " + db,
            }, out id);

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