Ejemplo n.º 1
0
        public void Start()
        {
            var indexDefinitions  = Database.Indexes.Definitions;
            var sideBySideIndexes = indexDefinitions.Where(x => x.Name.StartsWith(Constants.SideBySideIndexNamePrefix)).ToList();

            foreach (var indexDefinition in sideBySideIndexes)
            {
                var indexName = indexDefinition.Name;
                var instance  = Database.IndexStorage.GetIndexInstance(indexName);
                if (instance == null)
                {
                    //probably deleted
                    continue;
                }

                var indexToAdd = new IndexToAdd
                {
                    Name       = indexDefinition.Name,
                    Definition = indexDefinition,
                    Priority   = instance.Priority
                };

                SetIndexReplaceInfo(indexName, indexToAdd);

                StartReplicatingSideBySideIndexAsync(indexToAdd);
            }

            Database.Notifications.OnIndexChange    += OnIndexChange;
            Database.Notifications.OnDocumentChange += OnDocumentChange;

            indexReplicationTimer = Database.TimerManager.NewTimer(x => Execute(), TimeSpan.Zero, replicationFrequency);
            lastQueriedTimer      = Database.TimerManager.NewTimer(x => SendLastQueried(), TimeSpan.Zero, lastQueriedFrequency);
        }
Ejemplo n.º 2
0
        public void StartReplicatingSideBySideIndexAsync(IndexToAdd indexToAdd)
        {
            if (indexToAdd.Name.StartsWith(Constants.SideBySideIndexNamePrefix))
            {
                indexToAdd.Name = indexToAdd.Name.Substring(Constants.SideBySideIndexNamePrefix.Length);
            }

            sideBySideIndexesToReplicate.TryAdd(indexToAdd.Definition.IndexId, indexToAdd);

            ReplicateSideBySideIndexes();
        }
Ejemplo n.º 3
0
        private void OnDocumentChange(DocumentDatabase db, DocumentChangeNotification notification, RavenJObject doc)
        {
            var docId = notification.Id;

            if (docId == null)
            {
                return;
            }

            if (docId.StartsWith(Constants.IndexReplacePrefix, StringComparison.OrdinalIgnoreCase) == false)
            {
                return;
            }

            if (notification.Type != DocumentChangeTypes.Put)
            {
                return;
            }

            var replaceIndexName = docId.Substring(Constants.IndexReplacePrefix.Length);
            var instance         = Database.IndexStorage.GetIndexInstance(replaceIndexName);

            if (instance == null)
            {
                return;
            }

            var indexDefinition = Database.Indexes.GetIndexDefinition(replaceIndexName);

            if (indexDefinition == null)
            {
                return;
            }

            var indexToAdd = new IndexToAdd
            {
                Name       = replaceIndexName,
                Definition = indexDefinition,
                Priority   = instance.Priority,
            };

            SetIndexReplaceInfo(replaceIndexName, indexToAdd);

            StartReplicatingSideBySideIndexAsync(indexToAdd);
        }
Ejemplo n.º 4
0
        private void SetIndexReplaceInfo(string indexName, IndexToAdd indexToAdd)
        {
            var key        = Constants.IndexReplacePrefix + indexName;
            var replaceDoc = Database.Documents.Get(key, null);

            if (replaceDoc == null)
            {
                return;
            }

            try
            {
                var indexReplaceInformation = replaceDoc.DataAsJson.JsonDeserialization <IndexReplaceDocument>();
                indexToAdd.MinimumEtagBeforeReplace = indexReplaceInformation.MinimumEtagBeforeReplace;
                indexToAdd.ReplaceTimeUtc           = indexReplaceInformation.ReplaceTimeUtc;
            }
            catch (Exception)
            {
                //the index was already replaced or the document was deleted
                //anyway, we'll try to replicate this index with default settings
            }
        }