protected RavenDbServer GetNewServer() { var ravenConfiguration = new RavenConfiguration { Port = 8080, RunInMemory = true, DataDirectory = "Data", AnonymousUserAccessMode = AnonymousUserAccessMode.All }; ConfigureServer(ravenConfiguration); if(ravenConfiguration.RunInMemory == false) IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory); var ravenDbServer = new RavenDbServer(ravenConfiguration); using (var documentStore = new DocumentStore { Url = "http://localhost:8080" }.Initialize()) { new RavenDocumentsByEntityName().Execute(documentStore); } return ravenDbServer; }
public EsentExportOperation(string dataDirPath) { var dbFullPath = Path.Combine(dataDirPath, "Data"); try { Api.JetCreateInstance(out instance, "instance"); var ravenConfiguration = new RavenConfiguration(); ravenConfiguration.DataDirectory = dataDirPath; ravenConfiguration.Storage.PreventSchemaUpdate = true; ITransactionalStorage storage; var success = StorageExporter.TryToCreateTransactionalStorage(ravenConfiguration, out storage); if (!success) ConsoleUtils.PrintErrorAndFail("Failed to create transactional storage"); var configurator = new TransactionalStorageConfigurator(ravenConfiguration, (TransactionalStorage)storage); configurator.ConfigureInstance(instance, dataDirPath); storage.Dispose(); Api.JetInit(ref instance); Api.JetBeginSession(instance, out sesid, null, null); Api.JetAttachDatabase(sesid, dbFullPath, AttachDatabaseGrbit.None); Api.JetOpenDatabase(sesid, dbFullPath, null, out dbid, OpenDatabaseGrbit.None); } catch (Exception e) { ConsoleUtils.PrintErrorAndFail(e.Message, e.StackTrace); } }
public override void RespondToAdmin(IHttpContext context) { if (EnsureSystemDatabase(context) == false) return; var restoreRequest = context.ReadJsonObject<RestoreRequest>(); var ravenConfiguration = new RavenConfiguration(); if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb"))) { ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Managed.TransactionalStorage, Raven.Storage.Managed"; } else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new"))) { ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Esent.TransactionalStorage, Raven.Storage.Esent"; } var restoreDoc = new List<string>(); // Commented out unfinished code to get it to compile // DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, restoreRequest.DatabaseLocation, // msg => // { // // }); // SystemDatabase. }
public static void Restore(RavenConfiguration configuration, DatabaseRestoreRequest restoreRequest, Action<string> output) { var databaseDocumentPath = FindDatabaseDocument(restoreRequest.BackupLocation); if (File.Exists(databaseDocumentPath) == false) { throw new InvalidOperationException("Cannot restore when the Database.Document file is missing in the backup folder: " + restoreRequest.BackupLocation); } var databaseDocumentText = File.ReadAllText(databaseDocumentPath); var databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>(); string storage; if (databaseDocument.Settings.TryGetValue("Raven/StorageTypeName", out storage) == false) { storage = "esent"; } if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseLocation)) { configuration.DataDirectory = restoreRequest.DatabaseLocation; } using (var transactionalStorage = configuration.CreateTransactionalStorage(storage, () => { })) { transactionalStorage.Restore(restoreRequest, output); } }
public RavenDB_1594() { path = NewDataPath(); pathsToDelete.Add("~/Databases"); Raven.Database.Extensions.IOExtensions.DeleteDirectory(path); var config = new Raven.Database.Config.RavenConfiguration { Port = 8079, RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true, DataDirectory = path, Settings = { { "Raven/ActiveBundles", "PeriodicBackup" } }, }; config.PostInit(); ravenDbServer = new RavenDbServer(config) { UseEmbeddedHttpServer = true }; ravenDbServer.Initialize(); documentStore = new DocumentStore { Url = "http://localhost:8079" }; documentStore.Initialize(); }
public StorageExporter(string databaseBaseDirectory, string databaseOutputFile,int batchSize) { baseDirectory = databaseBaseDirectory; outputDirectory = databaseOutputFile; var ravenConfiguration = new RavenConfiguration(); ravenConfiguration.DataDirectory = databaseBaseDirectory; ravenConfiguration.Storage.PreventSchemaUpdate = true; CreateTransactionalStorage(ravenConfiguration); BatchSize = batchSize; }
public StorageExporter(string databaseBaseDirectory, string databaseOutputFile,int batchSize,Etag documentsStartEtag) { baseDirectory = databaseBaseDirectory; outputDirectory = databaseOutputFile; var ravenConfiguration = new RavenConfiguration(); ravenConfiguration.DataDirectory = databaseBaseDirectory; ravenConfiguration.Storage.PreventSchemaUpdate = true; ravenConfiguration.Storage.SkipConsistencyCheck = true; CreateTransactionalStorage(ravenConfiguration); BatchSize = batchSize; DocumentsStartEtag = documentsStartEtag; }
public TestServerFixture() { var configuration = new RavenConfiguration(); configuration.Port = Port; configuration.ServerName = ServerName; configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName; configuration.DataDirectory = Path.Combine(configuration.DataDirectory, "Tests"); IOExtensions.DeleteDirectory(configuration.DataDirectory); Server = new RavenDbServer(configuration) { UseEmbeddedHttpServer = true }.Initialize(); }
public RavenConfiguration ConvertToRavenConfiguration() { var configuration = new RavenConfiguration { Port = Port, RunInMemory = RunInMemory, DefaultStorageTypeName = "esent" }; foreach (var key in Settings.Keys) { configuration.Settings.Add(key, Settings[key]); } return configuration; }
public override void RespondToAdmin(IHttpContext context) { if (EnsureSystemDatabase(context) == false) return; var restoreRequest = context.ReadJsonObject<RestoreRequest>(); var ravenConfiguration = new RavenConfiguration(); if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb"))) { ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Managed.TransactionalStorage, Raven.Storage.Managed"; } else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new"))) { ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Esent.TransactionalStorage, Raven.Storage.Esent"; } var restoreStatus = new List<string>(); DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, restoreRequest.DatabaseLocation, msg => { restoreStatus.Add(msg); SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new {restoreStatus}), new RavenJObject(), null); }); if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Database.Document"))) { var databaseDocumentText = File.ReadAllText(Path.Combine(restoreRequest.RestoreLocation, "Database.Document")); var databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>(); if (databaseDocument == null) return; if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseLocation)) databaseDocument.Settings[Constants.RavenDataDir] = restoreRequest.DatabaseLocation; if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseName)) databaseDocument.Id = "Raven/Databases/" + restoreRequest.DatabaseName; SystemDatabase.Put(databaseDocument.Id, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null); restoreStatus.Add("The new database was created"); SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null); } }
protected RavenDbServer GetNewServer(int port) { var dataDirectory = Path.Combine(NewDataPath(), "System"); var configuration = new RavenConfiguration { Port = port, DataDirectory = dataDirectory, AnonymousUserAccessMode = AnonymousUserAccessMode.Admin }; configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName; var ravenDbServer = new RavenDbServer(configuration) { UseEmbeddedHttpServer = true }; ravenDbServer.Initialize(); return ravenDbServer; }
public TestServerFixture() { var configuration = new RavenConfiguration(); configuration.Port = Port; configuration.ServerName = ServerName; configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName; configuration.DataDirectory = Path.Combine(configuration.DataDirectory, "Tests"); configuration.MaxSecondsForTaskToWaitForDatabaseToLoad = 10; IOExtensions.DeleteDirectory(configuration.DataDirectory); NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(Port); Server = new RavenDbServer(configuration) { UseEmbeddedHttpServer = true, RunInMemory = true }.Initialize(); }
public StorageExporter(string databaseBaseDirectory, string databaseOutputFile, int batchSize, Etag documentsStartEtag, bool hasCompression, EncryptionConfiguration encryption) { HasCompression = hasCompression; Encryption = encryption; baseDirectory = databaseBaseDirectory; outputDirectory = databaseOutputFile; var ravenConfiguration = new RavenConfiguration { DataDirectory = databaseBaseDirectory, CacheDocumentsInMemory = false, Storage = { PreventSchemaUpdate = true, SkipConsistencyCheck = true, } }; CreateTransactionalStorage(ravenConfiguration); this.batchSize = batchSize; DocumentsStartEtag = documentsStartEtag; }
public RavenDB_1594() { path = NewDataPath(); Raven.Database.Extensions.IOExtensions.DeleteDirectory(path); var config = new Raven.Database.Config.RavenConfiguration { Port = 8079, RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true, DataDirectory = path, Settings = { { "Raven/ActiveBundles", "PeriodicBackup" } }, }; config.PostInit(); ravenDbServer = new RavenDbServer(config) { UseEmbeddedHttpServer = true }; ravenDbServer.Initialize(); documentStore = new DocumentStore { Url = "http://localhost:8079" }; documentStore.Initialize(); }
protected RavenDbServer GetNewServer(int port = 8079, string dataDirectory = "Data") { var ravenConfiguration = new RavenConfiguration { Port = port, DataDirectory = dataDirectory, RunInMemory = true, AnonymousUserAccessMode = AnonymousUserAccessMode.All }; ModifyConfiguration(ravenConfiguration); if (ravenConfiguration.RunInMemory == false) IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory); NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenConfiguration.Port); var ravenDbServer = new RavenDbServer(ravenConfiguration); try { using (var documentStore = new DocumentStore { Conventions = { FailoverBehavior = FailoverBehavior.FailImmediately }, Url = "http://localhost:" + port }.Initialize()) { CreateDefaultIndexes(documentStore); } } catch { ravenDbServer.Dispose(); throw; } return ravenDbServer; }
/// <summary> /// Registers the ClockDocsBundle in the configuration of an embedded database. /// </summary> /// <param name="configuration"></param> public static void RegisterBundle(RavenConfiguration configuration) { configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(ClockDocsHelper).Assembly)); }
protected override void ModifyConfiguration(RavenConfiguration configuration) { configuration.Settings["Raven/Esent/CircularLog"] = "false"; configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction = false; }
protected override void ModifyConfiguration(RavenConfiguration configuration) { // Wire up the bundle to the embedded database configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(CreatedDateTrigger).Assembly)); }
protected RavenDbServer GetNewServer(bool initializeDocumentsByEntitiyName = true) { var ravenConfiguration = new RavenConfiguration { Port = 8079, RunInMemory = true, DataDirectory = "Data", AnonymousUserAccessMode = AnonymousUserAccessMode.All }; ConfigureServer(ravenConfiguration); if(ravenConfiguration.RunInMemory == false) IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory); NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenConfiguration.Port); var ravenDbServer = new RavenDbServer(ravenConfiguration); if (initializeDocumentsByEntitiyName) { try { using (var documentStore = new DocumentStore { Url = "http://localhost:8079" }.Initialize()) { new RavenDocumentsByEntityName().Execute(documentStore); } } catch { ravenDbServer.Dispose(); throw; } } return ravenDbServer; }
protected override void ModifyConfiguration(RavenConfiguration configuration) { Bundles.ClockDocs.ClockDocsHelper.RegisterBundle(configuration); }
public async Task<HttpResponseMessage> Restore() { if (EnsureSystemDatabase() == false) return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest); var restoreStatus = new RestoreStatus{Messages = new List<string>()}; var restoreRequest = await ReadJsonObjectAsync<RestoreRequest>(); DatabaseDocument databaseDocument = null; var databaseDocumentPath = Path.Combine(restoreRequest.BackupLocation, "Database.Document"); if (File.Exists(databaseDocumentPath)) { var databaseDocumentText = File.ReadAllText(databaseDocumentPath); databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>(); } var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName : databaseDocument == null ? null : databaseDocument.Id; if (string.IsNullOrWhiteSpace(databaseName)) { var errorMessage = (databaseDocument == null || String.IsNullOrWhiteSpace(databaseDocument.Id)) ? "Database.Document file is invalid - database name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen." : "A database name must be supplied if the restore location does not contain a valid Database.Document file"; restoreStatus.Messages.Add(errorMessage); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null); return GetMessageWithString(errorMessage,HttpStatusCode.BadRequest); } if (databaseName == Constants.SystemDatabase) return GetMessageWithString("Cannot do an online restore for the <system> database", HttpStatusCode.BadRequest); var ravenConfiguration = new RavenConfiguration { DatabaseName = databaseName, IsTenantDatabase = true }; if (databaseDocument != null) { foreach (var setting in databaseDocument.Settings) { ravenConfiguration.Settings[setting.Key] = setting.Value; } } if (File.Exists(Path.Combine(restoreRequest.BackupLocation, Voron.Impl.Constants.DatabaseFilename))) ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Voron.TransactionalStorage).AssemblyQualifiedName; else if (Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new"))) ravenConfiguration.DefaultStorageTypeName = typeof (Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName; ravenConfiguration.CustomizeValuesForTenant(databaseName); ravenConfiguration.Initialize(); string documentDataDir; ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir); restoreRequest.DatabaseLocation = ravenConfiguration.DataDirectory; DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, null); bool defrag; if (bool.TryParse(GetQueryStringValue("defrag"), out defrag)) restoreRequest.Defrag = defrag; await Task.Factory.StartNew(() => { MaintenanceActions.Restore(ravenConfiguration,restoreRequest, msg => { restoreStatus.Messages.Add(msg); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); }); if (databaseDocument == null) return; databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir; if (restoreRequest.IndexesLocation != null) databaseDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation; if (restoreRequest.JournalsLocation != null) databaseDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation; databaseDocument.Id = databaseName; DatabasesLandlord.Protect(databaseDocument); DatabasesLandlord.SystemDatabase.Documents.Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null); restoreStatus.Messages.Add("The new database was created"); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); }, TaskCreationOptions.LongRunning); return GetEmptyMessage(); }
public override void RespondToAdmin(IHttpContext context) { if (EnsureSystemDatabase(context) == false) return; var restoreRequest = context.ReadJsonObject<RestoreRequest>(); DatabaseDocument databaseDocument = null; if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Database.Document"))) { var databaseDocumentText = File.ReadAllText(Path.Combine(restoreRequest.RestoreLocation, "Database.Document")); databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>(); } var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName : databaseDocument == null ? null : databaseDocument.Id; if (string.IsNullOrWhiteSpace(databaseName)) { context.SetStatusToBadRequest(); context.WriteJson(new { Error = "A database name must be supplied if the restore location does not contain a valid Database.Document file" }); return; } var ravenConfiguration = new RavenConfiguration() { DatabaseName = databaseName, IsTenantDatabase = true }; if(databaseDocument != null) { foreach (var setting in databaseDocument.Settings) { ravenConfiguration.Settings[setting.Key] = setting.Value; } } if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb"))) { ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Managed.TransactionalStorage).AssemblyQualifiedName; } else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new"))) { ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName; } ravenConfiguration.CustomizeValuesForTenant(databaseName); ravenConfiguration.Initialize(); string documentDataDir; ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir); var restoreStatus = new List<string>(); SystemDatabase.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, new TransactionInformation()); var defrag = "true".Equals(context.Request.QueryString["defrag"], StringComparison.InvariantCultureIgnoreCase); DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, null, msg => { restoreStatus.Add(msg); SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new {restoreStatus}), new RavenJObject(), null); }, defrag); if (databaseDocument == null) return; databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir; databaseDocument.Id = databaseName; SystemDatabase.Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null); restoreStatus.Add("The new database was created"); SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null); }
protected virtual void ModifyConfiguration(RavenConfiguration configuration) { }
protected virtual void ConfigureServer(RavenConfiguration ravenConfiguration) { }
public async Task<HttpResponseMessage> Restore() { HttpResponseMessage message = null; if (EnsureSystemDatabase() == false) return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest); var restoreStatus = new RestoreStatus { State = RestoreStatusState.Running, Messages = new List<string>() }; var restoreRequest = await ReadJsonObjectAsync<FilesystemRestoreRequest>(); if (!HasPermissions(restoreRequest.BackupLocation, out message)) return message; var fileSystemDocumentPath = FindFilesystemDocument(restoreRequest.BackupLocation); if (!File.Exists(fileSystemDocumentPath)) { throw new InvalidOperationException("Cannot restore when the Filesystem.Document file is missing in the backup folder: " + restoreRequest.BackupLocation); } var filesystemDocumentText = File.ReadAllText(fileSystemDocumentPath); var filesystemDocument = RavenJObject.Parse(filesystemDocumentText).JsonDeserialization<FileSystemDocument>(); var filesystemName = !string.IsNullOrWhiteSpace(restoreRequest.FilesystemName) ? restoreRequest.FilesystemName : filesystemDocument == null ? null : filesystemDocument.Id; if (string.IsNullOrWhiteSpace(filesystemName)) { var errorMessage = (filesystemDocument == null || String.IsNullOrWhiteSpace(filesystemDocument.Id)) ? Constants.FilesystemDocumentFilename + " file is invalid - filesystem name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen." : "A filesystem name must be supplied if the restore location does not contain a valid " + Constants.FilesystemDocumentFilename + " file"; restoreStatus.Messages.Add(errorMessage); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null); return GetMessageWithString(errorMessage, HttpStatusCode.BadRequest); } var ravenConfiguration = new RavenConfiguration { FileSystemName = filesystemName, }; if (restoreRequest.IndexesLocation != null && !IsValidPath(restoreRequest.IndexesLocation, out message)) return message; if (restoreRequest.JournalsLocation != null && !IsValidPath(restoreRequest.JournalsLocation, out message)) return message; if (filesystemDocument != null) { //no need to check for existence of specified data and index folders here, //since those would be simply created after restore //we need to check only that the drive letter exists, so the folder can actually be created string dataLocation; if (filesystemDocument.Settings.TryGetValue(Constants.FileSystem.DataDirectory, out dataLocation)) { dataLocation = filesystemDocument.Settings[Constants.FileSystem.DataDirectory]; if (!IsOnValidDrive(dataLocation, out message)) return message; if (!HasPermissions(dataLocation, out message)) return message; } string indexesLocation; if (filesystemDocument.Settings.TryGetValue(Constants.FileSystem.IndexStorageDirectory, out indexesLocation)) { indexesLocation = filesystemDocument.Settings[Constants.FileSystem.IndexStorageDirectory]; if (!IsOnValidDrive(indexesLocation, out message)) return message; if (!HasPermissions(indexesLocation, out message)) return message; } foreach (var setting in filesystemDocument.Settings) { ravenConfiguration.Settings[setting.Key] = setting.Value; } } ravenConfiguration.FileSystem.DefaultStorageTypeName = Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new")) ? InMemoryRavenConfiguration.EsentTypeName : InMemoryRavenConfiguration.VoronTypeName; ravenConfiguration.CustomizeValuesForFileSystemTenant(filesystemName); ravenConfiguration.Initialize(); string documentDataDir; ravenConfiguration.FileSystem.DataDirectory = ResolveTenantDataDirectory(restoreRequest.FilesystemLocation, filesystemName, out documentDataDir); restoreRequest.FilesystemLocation = ravenConfiguration.FileSystem.DataDirectory; string anotherRestoreResourceName; if (IsAnotherRestoreInProgress(out anotherRestoreResourceName)) { if (restoreRequest.RestoreStartTimeout.HasValue) { try { using (var cts = new CancellationTokenSource()) { cts.CancelAfter(TimeSpan.FromSeconds(restoreRequest.RestoreStartTimeout.Value)); var token = cts.Token; do { await Task.Delay(500, token); } while (IsAnotherRestoreInProgress(out anotherRestoreResourceName)); } } catch (OperationCanceledException) { return GetMessageWithString(string.Format("Another restore is still in progress (resource name = {0}). Waited {1} seconds for other restore to complete.", anotherRestoreResourceName, restoreRequest.RestoreStartTimeout.Value), HttpStatusCode.ServiceUnavailable); } } else { return GetMessageWithString(string.Format("Another restore is in progress (resource name = {0})", anotherRestoreResourceName), HttpStatusCode.ServiceUnavailable); } } Database.Documents.Put(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, RavenJObject.FromObject(new RestoreInProgress { Resource = filesystemName }), new RavenJObject(), null); DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, null); bool defrag; if (bool.TryParse(GetQueryStringValue("defrag"), out defrag)) restoreRequest.Defrag = defrag; var task = Task.Factory.StartNew(() => { try { if (!string.IsNullOrWhiteSpace(restoreRequest.FilesystemLocation)) ravenConfiguration.FileSystem.DataDirectory = restoreRequest.FilesystemLocation; using (var transactionalStorage = RavenFileSystem.CreateTransactionalStorage(ravenConfiguration)) { transactionalStorage.Restore(restoreRequest, msg => { restoreStatus.Messages.Add(msg); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); }); } if (filesystemDocument == null) return; filesystemDocument.Settings[Constants.FileSystem.DataDirectory] = documentDataDir; if (restoreRequest.IndexesLocation != null) filesystemDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation; if (restoreRequest.JournalsLocation != null) filesystemDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation; filesystemDocument.Id = filesystemName; FileSystemsLandlord.Protect(filesystemDocument); DatabasesLandlord.SystemDatabase.Documents.Put(Constants.FileSystem.Prefix + filesystemName, null, RavenJObject.FromObject(filesystemDocument), new RavenJObject(), null); restoreStatus.State = RestoreStatusState.Completed; restoreStatus.Messages.Add("The new filesystem was created"); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); } catch (Exception e) { restoreStatus.State = RestoreStatusState.Faulted; restoreStatus.Messages.Add("Unable to restore filesystem " + e.Message); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); throw; } finally { Database.Documents.Delete(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, null); } }, TaskCreationOptions.LongRunning); long id; Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription { StartTime = SystemTime.UtcNow, TaskType = TaskActions.PendingTaskType.RestoreFilesystem, Payload = "Restoring filesystem " + filesystemName + " from " + restoreRequest.BackupLocation }, out id); return GetMessageWithObject(new { OperationId = id }); }
protected override void ConfigureServer(RavenConfiguration ravenConfiguration) { ravenConfiguration.AnonymousUserAccessMode = AnonymousUserAccessMode.None; ravenConfiguration.AuthenticationMode = "OAuth"; ravenConfiguration.OAuthTokenCertificate = CertGenerator.GenerateNewCertificate("RavenDB.Test"); }
protected override void ConfigureServer(RavenConfiguration ravenConfiguration) { ravenConfiguration.RunInMemory = false; ravenConfiguration.DefaultStorageTypeName = "esent"; }
protected override void ModifyConfiguration(RavenConfiguration ravenConfiguration) { ravenConfiguration.AnonymousUserAccessMode = AnonymousUserAccessMode.None; }
protected override void ModifyConfiguration(RavenConfiguration configuration) { // Wire up the bundle to the embedded database configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(PutAttachmentTrigger).Assembly)); configuration.Settings[Constants.ActiveBundles] = "IndexedAttachments"; }
public async Task<HttpResponseMessage> Restore() { if (EnsureSystemDatabase() == false) return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest); var restoreStatus = new RestoreStatus { State = RestoreStatusState.Running, Messages = new List<string>() }; var restoreRequest = await ReadJsonObjectAsync<DatabaseRestoreRequest>(); DatabaseDocument databaseDocument = null; var databaseDocumentPath = MaintenanceActions.FindDatabaseDocument(restoreRequest.BackupLocation); if (File.Exists(databaseDocumentPath)) { var databaseDocumentText = File.ReadAllText(databaseDocumentPath); databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>(); } var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName : databaseDocument == null ? null : databaseDocument.Id; if (string.IsNullOrWhiteSpace(databaseName)) { var errorMessage = (databaseDocument == null || String.IsNullOrWhiteSpace(databaseDocument.Id)) ? "Database.Document file is invalid - database name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen." : "A database name must be supplied if the restore location does not contain a valid Database.Document file"; restoreStatus.Messages.Add(errorMessage); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null); return GetMessageWithString(errorMessage, HttpStatusCode.BadRequest); } if (databaseName == Constants.SystemDatabase) return GetMessageWithString("Cannot do an online restore for the <system> database", HttpStatusCode.BadRequest); var existingDatabase = Database.Documents.GetDocumentMetadata("Raven/Databases/" + databaseName, null); if (existingDatabase != null) return GetMessageWithString("Cannot do an online restore for an existing database, delete the database " + databaseName + " and restore again.", HttpStatusCode.BadRequest); var ravenConfiguration = new RavenConfiguration { DatabaseName = databaseName, IsTenantDatabase = true }; if (databaseDocument != null) { foreach (var setting in databaseDocument.Settings) { ravenConfiguration.Settings[setting.Key] = setting.Value; } } if (File.Exists(Path.Combine(restoreRequest.BackupLocation, BackupMethods.Filename))) ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Voron.TransactionalStorage).AssemblyQualifiedName; else if (Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new"))) ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName; ravenConfiguration.CustomizeValuesForDatabaseTenant(databaseName); ravenConfiguration.Initialize(); string documentDataDir; ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir); restoreRequest.DatabaseLocation = ravenConfiguration.DataDirectory; string anotherRestoreResourceName; if (IsAnotherRestoreInProgress(out anotherRestoreResourceName)) { if (restoreRequest.RestoreStartTimeout.HasValue) { try { using (var cts = new CancellationTokenSource()) { cts.CancelAfter(TimeSpan.FromSeconds(restoreRequest.RestoreStartTimeout.Value)); var token = cts.Token; do { await Task.Delay(500, token); } while (IsAnotherRestoreInProgress(out anotherRestoreResourceName)); } } catch (OperationCanceledException) { return GetMessageWithString(string.Format("Another restore is still in progress (resource name = {0}). Waited {1} seconds for other restore to complete.", anotherRestoreResourceName, restoreRequest.RestoreStartTimeout.Value), HttpStatusCode.ServiceUnavailable); } } else { return GetMessageWithString(string.Format("Another restore is in progress (resource name = {0})", anotherRestoreResourceName), HttpStatusCode.ServiceUnavailable); } } Database.Documents.Put(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, RavenJObject.FromObject(new RestoreInProgress { Resource = databaseName }), new RavenJObject(), null); DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, null); bool defrag; if (bool.TryParse(GetQueryStringValue("defrag"), out defrag)) restoreRequest.Defrag = defrag; var task = Task.Factory.StartNew(() => { try { MaintenanceActions.Restore(ravenConfiguration, restoreRequest, msg => { restoreStatus.Messages.Add(msg); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); }); if (databaseDocument == null) return; databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir; if (restoreRequest.IndexesLocation != null) databaseDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation; if (restoreRequest.JournalsLocation != null) databaseDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation; bool replicationBundleRemoved = false; if (restoreRequest.DisableReplicationDestinations) replicationBundleRemoved = TryRemoveReplicationBundle(databaseDocument); databaseDocument.Id = databaseName; DatabasesLandlord.Protect(databaseDocument); DatabasesLandlord .SystemDatabase .Documents .Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null); restoreStatus.Messages.Add("The new database was created"); restoreStatus.State = RestoreStatusState.Completed; DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); if (restoreRequest.GenerateNewDatabaseId) GenerateNewDatabaseId(databaseName); if (replicationBundleRemoved) AddReplicationBundleAndDisableReplicationDestinations(databaseName); } catch (Exception e) { restoreStatus.State = RestoreStatusState.Faulted; restoreStatus.Messages.Add("Unable to restore database " + e.Message); DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null); throw; } finally { Database.Documents.Delete(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, null); } }, TaskCreationOptions.LongRunning); long id; Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription { StartTime = SystemTime.UtcNow, TaskType = TaskActions.PendingTaskType.RestoreDatabase, Payload = "Restoring database " + databaseName + " from " + restoreRequest.BackupLocation }, out id); return GetMessageWithObject(new { OperationId = id }); }
protected override void ConfigureServer(RavenConfiguration serverConfiguration) { serverConfiguration.Catalog.Catalogs.Add(new TypeCatalog(typeof(DeleteOnConflict))); }