Пример #1
0
        private List <FileSystemData> GetFileSystemsData(IEnumerable <RavenJToken> fileSystems)
        {
            return(fileSystems
                   .Select(fileSystem =>
            {
                var bundles = new string[] { };
                var settings = fileSystem.Value <RavenJObject>("Settings");
                if (settings != null)
                {
                    var activeBundles = settings.Value <string>("Raven/ActiveBundles");
                    if (activeBundles != null)
                    {
                        bundles = activeBundles.Split(';');
                    }
                }

                var fsName = fileSystem.Value <RavenJObject>("@metadata").Value <string>("@id").Replace(Constants.FileSystem.Prefix, string.Empty);
                var isFileSystemLoaded = FileSystemsLandlord.IsFileSystemLoaded(fsName);
                FileSystemStats stats = null;
                if (isFileSystemLoaded)
                {
                    try
                    {
                        var fs = FileSystemsLandlord.GetResourceInternal(fsName).Result;
                        if (fs != null)
                        {
                            stats = fs.GetFileSystemStats();
                        }
                    }
                    catch (Exception)
                    {
                        //the file system is shutting down or locked
                        //we can ignore this
                    }
                }

                return new FileSystemData
                {
                    Name = fsName,
                    Disabled = fileSystem.Value <bool>("Disabled"),
                    Bundles = bundles,
                    IsAdminCurrentTenant = true,
                    IsLoaded = isFileSystemLoaded,
                    Stats = stats
                };
            }).ToList());
        }
Пример #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(() =>
            {
                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 = AsyncHelpers.RunSync(() => FileSystemsLandlord.GetResourceInternal(fs));
                    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;

            SystemDatabase.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
            }, HttpStatusCode.Accepted));
        }