/// <summary>
        /// Create a alias for the given indices.
        /// </summary>
        public async Task <string> MergeIndicesAsync(params string[] indices)
        {
            if (indices.Length < 2)
            {
                throw new ArgumentException(
                          "At least two indices are needed to create a merged index");
            }

            string alias = Guid.NewGuid().ToString();

            IEnumerable <AliasAddDescriptor> createDescriptors = indices
                                                                 .Select(index => new AliasAddDescriptor()
                                                                         .Alias(alias)
                                                                         .Index(index));

            BulkAliasDescriptor aliasDescriptor = new BulkAliasDescriptor();

            foreach (AliasAddDescriptor aliasAddDescriptor in createDescriptors)
            {
                aliasDescriptor.Add(aliasAddDescriptor);
            }

            IBulkAliasResponse bulkAliasResponse = await Client.AliasAsync(aliasDescriptor);

            if (!bulkAliasResponse.IsValid)
            {
                throw new InvalidOperationException(
                          $"Could not create alias for the indices \"{string.Join(",", indices)}\": {bulkAliasResponse.DebugInformation}",
                          bulkAliasResponse.OriginalException);
            }

            await Client.RefreshAsync(Indices.All);

            return(alias);
        }
示例#2
0
        private void updateAlias(string alias, string index, bool close = true)
        {
            Console.WriteLine($"Updating `{alias}` alias to `{index}`...");

            var aliasDescriptor = new BulkAliasDescriptor();
            var oldIndices      = elasticClient.GetIndicesPointingToAlias(alias);

            foreach (var oldIndex in oldIndices)
            {
                aliasDescriptor.Remove(d => d.Alias(alias).Index(oldIndex));
            }

            aliasDescriptor.Add(d => d.Alias(alias).Index(index));

            Console.WriteLine(elasticClient.Alias(aliasDescriptor));

            // cleanup
            if (!close)
            {
                return;
            }
            foreach (var toClose in oldIndices.Where(x => x != index))
            {
                Console.WriteLine($"Closing {toClose}");
                elasticClient.CloseIndex(toClose);
            }
        }
示例#3
0
        protected virtual async Task UpdateAliasesAsync(IList <IndexInfo> indexes)
        {
            if (indexes.Count == 0)
            {
                return;
            }

            var aliasDescriptor = new BulkAliasDescriptor();

            foreach (var indexGroup in indexes.OrderBy(i => i.Version).GroupBy(i => i.DateUtc))
            {
                var indexExpirationDate = GetIndexExpirationDate(indexGroup.Key);

                // Ensure the current version is always set.
                if (SystemClock.UtcNow < indexExpirationDate)
                {
                    var oldestIndex = indexGroup.First();
                    if (oldestIndex.CurrentVersion < 0)
                    {
                        try {
                            await CreateAliasAsync(oldestIndex.Index, GetIndex(indexGroup.Key)).AnyContext();
                        } catch (Exception ex) {
                            _logger.LogError(ex, "Error setting current index version. Will use oldest index version: {OldestIndexVersion}", oldestIndex.Version);
                        }

                        foreach (var indexInfo in indexGroup)
                        {
                            indexInfo.CurrentVersion = oldestIndex.Version;
                        }
                    }
                }

                foreach (var index in indexGroup)
                {
                    if (SystemClock.UtcNow >= indexExpirationDate || index.Version != index.CurrentVersion)
                    {
                        foreach (var alias in Aliases)
                        {
                            aliasDescriptor = aliasDescriptor.Remove(r => r.Index(index.Index).Alias(alias.Name));
                        }

                        continue;
                    }

                    foreach (var alias in Aliases)
                    {
                        if (ShouldCreateAlias(indexGroup.Key, alias))
                        {
                            aliasDescriptor = aliasDescriptor.Add(r => r.Index(index.Index).Alias(alias.Name));
                        }
                        else
                        {
                            aliasDescriptor = aliasDescriptor.Remove(r => r.Index(index.Index).Alias(alias.Name));
                        }
                    }
                }
            }

            var response = await Configuration.Client.AliasAsync(aliasDescriptor).AnyContext();

            if (_logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Trace))
            {
                _logger.LogTrace(response.GetRequest());
            }

            if (!response.IsValid)
            {
                if (response.ApiCall.HttpStatusCode.GetValueOrDefault() == 404)
                {
                    return;
                }

                string message = $"Error updating aliases: {response.GetErrorMessage()}";
                _logger.LogError(response.OriginalException, "Error updating aliases: {0}", message);
                throw new ApplicationException(message, response.OriginalException);
            }
        }