public bool IsIndexStale(int indexId, LastCollectionEtags lastCollectionEtags) { bool isStale = false; documentDatabase.TransactionalStorage.Batch(actions => { Index indexInstance = GetIndexInstance(indexId); isStale = (indexInstance != null && indexInstance.IsMapIndexingInProgress) || actions.Staleness.IsIndexStale(indexId, null, null); if (indexInstance != null && indexInstance.IsTestIndex) isStale = false; if (isStale && actions.Staleness.IsIndexStaleByTask(indexId, null) == false && actions.Staleness.IsReduceStale(indexId) == false) { var viewGenerator = indexDefinitionStorage.GetViewGenerator(indexId); if (viewGenerator == null) return; var indexStats = actions.Indexing.GetIndexStats(indexId); if (indexStats == null) return; var lastIndexedEtag = indexStats.LastIndexedEtag; var collectionNames = viewGenerator.ForEntityNames.ToList(); if (lastCollectionEtags.HasEtagGreaterThan(collectionNames, lastIndexedEtag) == false) isStale = false; } }); return isStale; }
public DocumentDatabase(InMemoryRavenConfiguration configuration, TransportState recievedTransportState = null) { DocumentLock = new PutSerialLock(); Name = configuration.DatabaseName; Configuration = configuration; transportState = recievedTransportState ?? new TransportState(); ExtensionsState = new AtomicDictionary<object>(); using (LogManager.OpenMappedContext("database", Name ?? Constants.SystemDatabase)) { Log.Debug("Start loading the following database: {0}", Name ?? Constants.SystemDatabase); initializer = new DocumentDatabaseInitializer(this, configuration); initializer.InitializeEncryption(); initializer.ValidateLicense(); initializer.SubscribeToDomainUnloadOrProcessExit(); initializer.ExecuteAlterConfiguration(); initializer.SatisfyImportsOnce(); backgroundTaskScheduler = configuration.CustomTaskScheduler ?? TaskScheduler.Default; recentTouches = new SizeLimitedConcurrentDictionary<string, TouchedDocumentInfo>(configuration.MaxRecentTouchesToRemember, StringComparer.OrdinalIgnoreCase); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { Database = this, DatabaseName = Name, IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers, TaskScheduler = backgroundTaskScheduler, Configuration = configuration, IndexReaderWarmers = IndexReaderWarmers }; try { uuidGenerator = new SequentialUuidGenerator(); initializer.InitializeTransactionalStorage(uuidGenerator); lastCollectionEtags = new LastCollectionEtags(WorkContext); } catch (Exception) { if (TransactionalStorage != null) TransactionalStorage.Dispose(); throw; } try { TransactionalStorage.Batch(actions => uuidGenerator.EtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); // Index codecs must be initialized before we try to read an index InitializeIndexCodecTriggers(); initializer.InitializeIndexStorage(); Attachments = new AttachmentActions(this, recentTouches, uuidGenerator, Log); Documents = new DocumentActions(this, recentTouches, uuidGenerator, Log); Indexes = new IndexActions(this, recentTouches, uuidGenerator, Log); Maintenance = new MaintenanceActions(this, recentTouches, uuidGenerator, Log); Notifications = new NotificationActions(this, recentTouches, uuidGenerator, Log); Patches = new PatchActions(this, recentTouches, uuidGenerator, Log); Queries = new QueryActions(this, recentTouches, uuidGenerator, Log); Tasks = new TaskActions(this, recentTouches, uuidGenerator, Log); Transformers = new TransformerActions(this, recentTouches, uuidGenerator, Log); inFlightTransactionalState = TransactionalStorage.GetInFlightTransactionalState(this, Documents.Put, Documents.Delete); CompleteWorkContextSetup(); prefetcher = new Prefetcher(workContext); indexingExecuter = new IndexingExecuter(workContext, prefetcher); RaiseIndexingWiringComplete(); InitializeTriggersExceptIndexCodecs(); SecondStageInitialization(); ExecuteStartupTasks(); lastCollectionEtags.InitializeBasedOnIndexingResults(); Log.Debug("Finish loading the following database: {0}", configuration.DatabaseName ?? Constants.SystemDatabase); } catch (Exception) { Dispose(); throw; } } }
public bool IsIndexStale(string indexName, LastCollectionEtags lastCollectionEtags) { var index = TryIndexByName(indexName); if(index == null) throw new InvalidOperationException("Could not find index " + indexName); return IsIndexStale(index.IndexId, lastCollectionEtags); }
public DocumentDatabase(InMemoryRavenConfiguration configuration, TransportState recievedTransportState = null) { TimerManager = new ResourceTimerManager(); DocumentLock = new PutSerialLock(); IdentityLock = new PutSerialLock(); Name = configuration.DatabaseName; ResourceName = Name; Configuration = configuration; transportState = recievedTransportState ?? new TransportState(); ExtensionsState = new AtomicDictionary<object>(); using (LogManager.OpenMappedContext("database", Name ?? Constants.SystemDatabase)) { Log.Debug("Start loading the following database: {0}", Name ?? Constants.SystemDatabase); initializer = new DocumentDatabaseInitializer(this, configuration); initializer.ValidateLicense(); initializer.ValidateStorage(); initializer.InitializeEncryption(); initializer.SubscribeToDomainUnloadOrProcessExit(); initializer.SubscribeToDiskSpaceChanges(); initializer.ExecuteAlterConfiguration(); initializer.SatisfyImportsOnce(); backgroundTaskScheduler = configuration.CustomTaskScheduler ?? TaskScheduler.Default; recentTouches = new SizeLimitedConcurrentDictionary<string, TouchedDocumentInfo>(configuration.MaxRecentTouchesToRemember, StringComparer.OrdinalIgnoreCase); configuration.Container.SatisfyImportsOnce(this); workContext = new WorkContext { Database = this, DatabaseName = Name, IndexUpdateTriggers = IndexUpdateTriggers, ReadTriggers = ReadTriggers, TaskScheduler = backgroundTaskScheduler, Configuration = configuration, IndexReaderWarmers = IndexReaderWarmers }; try { uuidGenerator = new SequentialUuidGenerator(); initializer.InitializeTransactionalStorage(uuidGenerator); lastCollectionEtags = new LastCollectionEtags(WorkContext); } catch (Exception ex) { Log.ErrorException("Could not initialize transactional storage, not creating database", ex); try { if (TransactionalStorage != null) TransactionalStorage.Dispose(); if (initializer != null) { initializer.UnsubscribeToDomainUnloadOrProcessExit(); initializer.Dispose(); } } catch (Exception e) { Log.ErrorException("Could not dispose on initialized DocumentDatabase members", e); } throw; } try { TransactionalStorage.Batch(actions => uuidGenerator.EtagBase = actions.General.GetNextIdentityValue("Raven/Etag")); initializer.InitializeIndexDefinitionStorage(); Indexes = new IndexActions(this, recentTouches, uuidGenerator, Log); Attachments = new AttachmentActions(this, recentTouches, uuidGenerator, Log); Maintenance = new MaintenanceActions(this, recentTouches, uuidGenerator, Log); Notifications = new NotificationActions(this, recentTouches, uuidGenerator, Log); Subscriptions = new SubscriptionActions(this, Log); Patches = new PatchActions(this, recentTouches, uuidGenerator, Log); Queries = new QueryActions(this, recentTouches, uuidGenerator, Log); Tasks = new TaskActions(this, recentTouches, uuidGenerator, Log); Transformers = new TransformerActions(this, recentTouches, uuidGenerator, Log); Documents = new DocumentActions(this, recentTouches, uuidGenerator, Log); inFlightTransactionalState = TransactionalStorage.InitializeInFlightTransactionalState(this, (key, etag, document, metadata, transactionInformation) => Documents.Put(key, etag, document, metadata, transactionInformation), (key, etag, transactionInformation) => Documents.Delete(key, etag, transactionInformation)); InitializeTriggersExceptIndexCodecs(); // Second stage initializing before index storage for determining the hash algotihm for encrypted databases that were upgraded from 2.5 SecondStageInitialization(); // Index codecs must be initialized before we try to read an index InitializeIndexCodecTriggers(); initializer.InitializeIndexStorage(); CompleteWorkContextSetup(); prefetcher = new Prefetcher(workContext); IndexReplacer = new IndexReplacer(this); indexingExecuter = new IndexingExecuter(workContext, prefetcher, IndexReplacer); InitializeTriggersExceptIndexCodecs(); EnsureAllIndexDefinitionsHaveIndexes(); RaiseIndexingWiringComplete(); ExecuteStartupTasks(); lastCollectionEtags.InitializeBasedOnIndexingResults(); Log.Debug("Finish loading the following database: {0}", configuration.DatabaseName ?? Constants.SystemDatabase); } catch (Exception e) { Log.ErrorException("Could not create database", e); try { Dispose(); } catch (Exception ex) { Log.FatalException("Failed to disposed when already getting an error during ctor", ex); } throw; } } }