public IndexStorage(IndexDefinitionStorage indexDefinitionStorage, InMemoryRavenConfiguration configuration, DocumentDatabase documentDatabase) { this.indexDefinitionStorage = indexDefinitionStorage; this.configuration = configuration; path = configuration.IndexStoragePath; if (Directory.Exists(path) == false && configuration.RunInMemory == false) Directory.CreateDirectory(path); if (configuration.RunInMemory == false) { var crashMarkerPath = Path.Combine(path, "indexing.crash-marker"); if (File.Exists(crashMarkerPath)) { // the only way this can happen is if we crashed because of a power outage // in this case, we consider all open indexes to be corrupt and force them // to be reset. This is because to get better perf, we don't flush the files to disk, // so in the case of a power outage, we can't be sure that there wasn't still stuff in // the OS buffer that wasn't written yet. configuration.ResetIndexOnUncleanShutdown = true; } // The delete on close ensures that the only way this file will exists is if there was // a power outage while the server was running. crashMarker = File.Create(crashMarkerPath, 16, FileOptions.DeleteOnClose); } foreach (var indexName in indexDefinitionStorage.IndexNames) { OpenIndexOnStartup(documentDatabase, indexName); } }
public IndexStorage(IndexDefinitionStorage indexDefinitionStorage, InMemoryRavenConfiguration configuration, DocumentDatabase documentDatabase) { this.indexDefinitionStorage = indexDefinitionStorage; this.configuration = configuration; path = configuration.IndexStoragePath; if (Directory.Exists(path) == false && configuration.RunInMemory == false) Directory.CreateDirectory(path); foreach (var indexName in indexDefinitionStorage.IndexNames) { OpenIndexOnStartup(documentDatabase, indexName); } }
public IndexStorage(IndexDefinitionStorage indexDefinitionStorage, InMemoryRavenConfiguration configuration, DocumentDatabase documentDatabase) { try { this.indexDefinitionStorage = indexDefinitionStorage; this.configuration = configuration; this.documentDatabase = documentDatabase; path = configuration.IndexStoragePath; if (Directory.Exists(path) == false && configuration.RunInMemory == false) Directory.CreateDirectory(path); if (configuration.RunInMemory == false) { var crashMarkerPath = Path.Combine(path, "indexing.crash-marker"); if (File.Exists(crashMarkerPath)) { // the only way this can happen is if we crashed because of a power outage // in this case, we consider all open indexes to be corrupt and force them // to be reset. This is because to get better perf, we don't flush the files to disk, // so in the case of a power outage, we can't be sure that there wasn't still stuff in // the OS buffer that wasn't written yet. configuration.ResetIndexOnUncleanShutdown = true; } // The delete on close ensures that the only way this file will exists is if there was // a power outage while the server was running. crashMarker = File.Create(crashMarkerPath, 16, FileOptions.DeleteOnClose); } BackgroundTaskExecuter.Instance.ExecuteAllInterleaved(documentDatabase.WorkContext, indexDefinitionStorage.IndexNames, OpenIndexOnStartup); } catch(Exception e) { log.WarnException("Could not create index storage", e); try { Dispose(); } catch (Exception ex) { log.FatalException("Failed to disposed when already getting an error during ctor", ex); } throw; } }
public DocumentDatabase(RavenConfiguration configuration) { Configuration = configuration; configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers }; TransactionalStorage = configuration.CreateTransactionalStorage(workContext.NotifyAboutWork); configuration.Container.SatisfyImportsOnce(TransactionalStorage); bool newDb; try { newDb = TransactionalStorage.Initialize(); } catch (Exception) { TransactionalStorage.Dispose(); throw; } IndexDefinitionStorage = new IndexDefinitionStorage( TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration); workContext.PerformanceCounters = new PerformanceCounters("Instance @ " + configuration.Port); workContext.IndexStorage = IndexStorage; workContext.TransactionaStorage = TransactionalStorage; workContext.IndexDefinitionStorage = IndexDefinitionStorage; InitializeTriggers(); ExecuteStartupTasks(); if (!newDb) return; OnNewlyCreatedDatabase(); }
public IndexStorage(string path, IndexDefinitionStorage indexDefinitionStorage) { this.path = Path.Combine(path, "Index"); if (Directory.Exists(this.path) == false) Directory.CreateDirectory(this.path); log.DebugFormat("Initializing index storage at {0}", this.path); foreach (var indexDirectory in Directory.GetDirectories(this.path)) { log.DebugFormat("Loading saved index {0}", indexDirectory); var name = Path.GetFileName(indexDirectory); name = HttpUtility.UrlDecode(name); var indexDefinition = indexDefinitionStorage.GetIndexDefinition(name); if(indexDefinition == null) continue; var fsDirectory = FSDirectory.GetDirectory(indexDirectory, false); indexes.TryAdd(name, CreateIndexImplementation(name, indexDefinition, fsDirectory)); } }
public IndexStorage(IndexDefinitionStorage indexDefinitionStorage, RavenConfiguration configuration) { this.configuration = configuration; path = Path.Combine(configuration.DataDirectory, "Indexes"); if (Directory.Exists(path) == false) Directory.CreateDirectory(path); foreach (var indexDirectory in indexDefinitionStorage.IndexNames) { log.DebugFormat("Loading saved index {0}", indexDirectory); var indexDefinition = indexDefinitionStorage.GetIndexDefinition(indexDirectory); if (indexDefinition == null) continue; indexes.TryAdd(indexDirectory, CreateIndexImplementation(indexDirectory, indexDefinition, OpenOrCreateLuceneDirectory(indexDirectory))); } }
public DocumentDatabase(RavenConfiguration configuration) { this.configuration = configuration; workContext = new WorkContext(); TransactionalStorage = new TransactionalStorage(configuration.DataDirectory, workContext.NotifyAboutWork); bool newDb; try { newDb = TransactionalStorage.Initialize(); } catch (Exception) { TransactionalStorage.Dispose(); throw; } IndexDefinitionStorage = new IndexDefinitionStorage(configuration.DataDirectory); IndexStorage = new IndexStorage(configuration.DataDirectory, IndexDefinitionStorage); workContext.IndexStorage = IndexStorage; workContext.TransactionaStorage = TransactionalStorage; workContext.IndexDefinitionStorage = IndexDefinitionStorage; if (!newDb) return; if(configuration.ShouldCreateDefaultsWhenBuildingNewDatabaseFromScratch) { PutIndex("Raven/DocumentsByEntityName", new IndexDefinition { Map = @" from doc in docs where doc[""@metadata""][""Raven-Entity-Name""] != null select new { Tag = doc[""@metadata""][""Raven-Entity-Name""] }; " }); } configuration.RaiseDatabaseCreatedFromScratch(this); }
public IndexStorage(IndexDefinitionStorage indexDefinitionStorage, InMemoryRavenConfiguration configuration) { this.indexDefinitionStorage = indexDefinitionStorage; this.configuration = configuration; path = configuration.IndexStoragePath; if (Directory.Exists(path) == false && configuration.RunInMemory == false) Directory.CreateDirectory(path); foreach (var indexDirectory in indexDefinitionStorage.IndexNames) { log.Debug("Loading saved index {0}", indexDirectory); var indexDefinition = indexDefinitionStorage.GetIndexDefinition(indexDirectory); if (indexDefinition == null) continue; var luceneDirectory = OpenOrCreateLuceneDirectory(indexDefinition); var indexImplementation = CreateIndexImplementation(indexDirectory, indexDefinition, luceneDirectory); indexes.TryAdd(indexDirectory, indexImplementation); } }
public DocumentDatabase(InMemoryRavenConfiguration configuration) { this.configuration = configuration; using (LogManager.OpenMappedContext("database", configuration.DatabaseName ?? Constants.SystemDatabase)) { if (configuration.IsTenantDatabase == false) { validateLicense = new ValidateLicense(); validateLicense.Execute(configuration); } AppDomain.CurrentDomain.DomainUnload += DomainUnloadOrProcessExit; AppDomain.CurrentDomain.ProcessExit += DomainUnloadOrProcessExit; Name = configuration.DatabaseName; backgroundTaskScheduler = configuration.CustomTaskScheduler ?? TaskScheduler.Current; ExtensionsState = new AtomicDictionary<object>(); Configuration = configuration; ExecuteAlterConfiguration(); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { Database = this, DatabaseName = Name, IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers, RaiseIndexChangeNotification = RaiseNotifications, TaskScheduler = backgroundTaskScheduler, Configuration = configuration }; TransactionalStorage = configuration.CreateTransactionalStorage(workContext.HandleWorkNotifications); try { sequentialUuidGenerator = new SequentialUuidGenerator(); TransactionalStorage.Initialize(sequentialUuidGenerator, DocumentCodecs); } catch (Exception) { TransactionalStorage.Dispose(); throw; } try { TransactionalStorage.Batch(actions => sequentialUuidGenerator.EtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); TransportState = new TransportState(); // Index codecs must be initialized before we try to read an index InitializeIndexCodecTriggers(); IndexDefinitionStorage = new IndexDefinitionStorage( configuration, TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration, this); CompleteWorkContextSetup(); indexingExecuter = new IndexingExecuter(workContext); InitializeTriggersExceptIndexCodecs(); SecondStageInitialization(); ExecuteStartupTasks(); } catch (Exception) { Dispose(); throw; } } }
public DocumentDatabase(InMemoryRavenConfiguration configuration) { ExternalState = new ConcurrentDictionary<string, object>(); Name = configuration.DatabaseName; if (configuration.BackgroundTasksPriority != ThreadPriority.Normal) { backgroundTaskScheduler = new TaskSchedulerWithCustomPriority( // we need a minimum of four task threads - one for indexing dispatch, one for reducing dispatch, one for tasks, one for indexing/reducing ops Math.Max(4, configuration.MaxNumberOfParallelIndexTasks + 2), configuration.BackgroundTasksPriority); } else { backgroundTaskScheduler = TaskScheduler.Current; } ExtensionsState = new ConcurrentDictionary<object, object>(); Configuration = configuration; ExecuteAlterConfiguration(); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers }; TransactionalStorage = configuration.CreateTransactionalStorage(workContext.HandleWorkNotifications); configuration.Container.SatisfyImportsOnce(TransactionalStorage); try { TransactionalStorage.Initialize(this); } catch (Exception) { TransactionalStorage.Dispose(); throw; } TransactionalStorage.Batch(actions => currentEtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); IndexDefinitionStorage = new IndexDefinitionStorage( configuration, TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration); workContext.Configuration = configuration; workContext.IndexStorage = IndexStorage; workContext.TransactionaStorage = TransactionalStorage; workContext.IndexDefinitionStorage = IndexDefinitionStorage; try { InitializeTriggers(); ExecuteStartupTasks(); } catch (Exception) { Dispose(); throw; } }
public DocumentDatabase(InMemoryRavenConfiguration configuration, TransportState transportState = null) { DocumentLock = new PutSerialLock(); this.configuration = configuration; this.transportState = transportState ?? new TransportState(); using (LogManager.OpenMappedContext("database", configuration.DatabaseName ?? Constants.SystemDatabase)) { log.Debug("Start loading the following database: {0}", configuration.DatabaseName ?? Constants.SystemDatabase); if (configuration.IsTenantDatabase == false) { validateLicense = new ValidateLicense(); validateLicense.Execute(configuration); } AppDomain.CurrentDomain.DomainUnload += DomainUnloadOrProcessExit; AppDomain.CurrentDomain.ProcessExit += DomainUnloadOrProcessExit; Name = configuration.DatabaseName; backgroundTaskScheduler = configuration.CustomTaskScheduler ?? TaskScheduler.Default; ExtensionsState = new AtomicDictionary<object>(); Configuration = configuration; ExecuteAlterConfiguration(); recentTouches = new SizeLimitedConcurrentDictionary<string, TouchedDocumentInfo>(configuration.MaxRecentTouchesToRemember, StringComparer.OrdinalIgnoreCase); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { Database = this, DatabaseName = Name, IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers, RaiseIndexChangeNotification = RaiseNotifications, TaskScheduler = backgroundTaskScheduler, Configuration = configuration, IndexReaderWarmers = IndexReaderWarmers }; TransactionalStorage = configuration.CreateTransactionalStorage(workContext.HandleWorkNotifications); try { sequentialUuidGenerator = new SequentialUuidGenerator(); TransactionalStorage.Initialize(sequentialUuidGenerator, DocumentCodecs); } catch (Exception) { TransactionalStorage.Dispose(); throw; } try { inFlightTransactionalState = TransactionalStorage.GetInFlightTransactionalState(Put, Delete); TransactionalStorage.Batch(actions => sequentialUuidGenerator.EtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); // Index codecs must be initialized before we try to read an index InitializeIndexCodecTriggers(); IndexDefinitionStorage = new IndexDefinitionStorage( configuration, TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration, this); CompleteWorkContextSetup(); prefetcher = new Prefetcher(workContext); indexingExecuter = new IndexingExecuter(workContext, prefetcher); InitializeTriggersExceptIndexCodecs(); SecondStageInitialization(); ExecuteStartupTasks(); log.Debug("Finish loading the following database: {0}", configuration.DatabaseName ?? Constants.SystemDatabase); } catch (Exception) { Dispose(); throw; } } }
public DocumentDatabase(InMemoryRavenConfiguration configuration) { if (configuration.IsTenantDatabase == false) { validateLicense = new ValidateLicense(); validateLicense.Execute(configuration); } AppDomain.CurrentDomain.DomainUnload += DomainUnloadOrProcessExit; AppDomain.CurrentDomain.ProcessExit += DomainUnloadOrProcessExit; Name = configuration.DatabaseName; if (configuration.CustomTaskScheduler != null) { backgroundTaskScheduler = configuration.CustomTaskScheduler; } else if (configuration.BackgroundTasksPriority != ThreadPriority.Normal) { backgroundTaskScheduler = new TaskSchedulerWithCustomPriority( // we need a minimum of four task threads - one for indexing dispatch, one for reducing dispatch, one for tasks, one for indexing/reducing ops Math.Max(4, configuration.MaxNumberOfParallelIndexTasks + 2), configuration.BackgroundTasksPriority); } else { backgroundTaskScheduler = TaskScheduler.Current; } ExtensionsState = new AtomicDictionary<object>(); Configuration = configuration; ExecuteAlterConfiguration(); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { DatabaseName = Name, IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers, RaiseIndexChangeNotification = RaiseNotifications, TaskScheduler = backgroundTaskScheduler, Configuration = configuration }; TransactionalStorage = configuration.CreateTransactionalStorage(workContext.HandleWorkNotifications); try { TransactionalStorage.Initialize(this, DocumentCodecs); } catch (Exception) { TransactionalStorage.Dispose(); throw; } try { TransactionalStorage.Batch(actions => currentEtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); TransportState = new TransportState(); // Index codecs must be initialized before we try to read an index InitializeIndexCodecTriggers(); IndexDefinitionStorage = new IndexDefinitionStorage( configuration, TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration, this); CompleteWorkContextSetup(); indexingExecuter = new IndexingExecuter(workContext); InitializeTriggersExceptIndexCodecs(); ExecuteStartupTasks(); } catch (Exception) { Dispose(); throw; } }
public DocumentDatabase(InMemoryRavenConfiguration configuration) { Configuration = configuration; configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers }; dynamicQueryRunner = new DynamicQueryRunner(this); suggestionQueryRunner = new SuggestionQueryRunner(this); TransactionalStorage = configuration.CreateTransactionalStorage(workContext.HandleWorkNotifications); configuration.Container.SatisfyImportsOnce(TransactionalStorage); bool newDb; try { newDb = TransactionalStorage.Initialize(this); } catch (Exception) { TransactionalStorage.Dispose(); throw; } TransactionalStorage.Batch(actions => currentEtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); IndexDefinitionStorage = new IndexDefinitionStorage( configuration, TransactionalStorage, configuration.DataDirectory, configuration.Container.GetExportedValues<AbstractViewGenerator>(), Extensions); IndexStorage = new IndexStorage(IndexDefinitionStorage, configuration); workContext.IndexStorage = IndexStorage; workContext.TransactionaStorage = TransactionalStorage; workContext.IndexDefinitionStorage = IndexDefinitionStorage; try { InitializeTriggers(); ExecuteStartupTasks(); } catch (Exception) { Dispose(); throw; } if (!newDb) return; OnNewlyCreatedDatabase(); }