From b83b3a0e95b42779d583dfd5355c563b04de9f2b Mon Sep 17 00:00:00 2001 From: aviv Date: Wed, 31 Jan 2024 12:52:59 +0200 Subject: [PATCH] RavenDB-17793 : do not allow to add prefix setting with no shards --- .../Sharding/Handlers/Admin/ShardedAdminShardingHandler.cs | 2 -- .../Commands/Sharding/AddPrefixedSettingCommand.cs | 3 +++ src/Raven.Server/ServerWide/ShardingStore.cs | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Raven.Server/Documents/Sharding/Handlers/Admin/ShardedAdminShardingHandler.cs b/src/Raven.Server/Documents/Sharding/Handlers/Admin/ShardedAdminShardingHandler.cs index 97e8ba1bb0d4..cbf9fbd53a6d 100644 --- a/src/Raven.Server/Documents/Sharding/Handlers/Admin/ShardedAdminShardingHandler.cs +++ b/src/Raven.Server/Documents/Sharding/Handlers/Admin/ShardedAdminShardingHandler.cs @@ -28,7 +28,6 @@ public async Task ExecuteMoveDocuments() await processor.ExecuteAsync(); } - [RavenShardedAction("/databases/*/admin/sharding/prefixes/add", "POST")] public async Task AddPrefixConfiguration() { @@ -103,7 +102,6 @@ public async Task UpdatePrefixConfiguration() { var json = await context.ReadForMemoryAsync(RequestBodyStream(), GetType().Name); var setting = JsonDeserializationCluster.PrefixedShardingSetting(json); - setting.Prefix = setting.Prefix.ToLower(); var shardingConfiguration = ServerStore.Cluster.ReadShardingConfiguration(DatabaseName); diff --git a/src/Raven.Server/ServerWide/Commands/Sharding/AddPrefixedSettingCommand.cs b/src/Raven.Server/ServerWide/Commands/Sharding/AddPrefixedSettingCommand.cs index c07c4490ecfb..85a2a3dbe9bd 100644 --- a/src/Raven.Server/ServerWide/Commands/Sharding/AddPrefixedSettingCommand.cs +++ b/src/Raven.Server/ServerWide/Commands/Sharding/AddPrefixedSettingCommand.cs @@ -47,6 +47,9 @@ public override void UpdateDatabaseRecord(DatabaseRecord record, long etag) private static int GetNextPrefixedBucketRangeStart(IEnumerable prefixes) { var prefixesByRangeStart = prefixes.OrderBy(x => x.BucketRangeStart).ToList(); + if (prefixesByRangeStart.Count == 0) + return ShardHelper.NumberOfBuckets; + for (int i = 0; i < prefixesByRangeStart.Count; i++) { var currentRangeStart = prefixesByRangeStart[i].BucketRangeStart; diff --git a/src/Raven.Server/ServerWide/ShardingStore.cs b/src/Raven.Server/ServerWide/ShardingStore.cs index fb3edd2d8a38..880b06bc4364 100644 --- a/src/Raven.Server/ServerWide/ShardingStore.cs +++ b/src/Raven.Server/ServerWide/ShardingStore.cs @@ -256,6 +256,11 @@ internal static void AssertValidPrefix(PrefixedShardingSetting setting, Sharding $"Cannot add prefix '{setting.Prefix}' to {nameof(ShardingConfiguration)}.{nameof(ShardingConfiguration.Prefixed)}. " + "In order to define sharding by prefix, the prefix string must end with '/' or '-' characters."); + if (setting.Shards.Count == 0) + throw new InvalidOperationException( + $"Cannot add prefix '{setting.Prefix}' to {nameof(ShardingConfiguration)}.{nameof(ShardingConfiguration.Prefixed)}. " + + $"{nameof(PrefixedShardingSetting)}.{nameof(PrefixedShardingSetting.Shards)} cannot be empty."); + foreach (var shardNumber in setting.Shards) { if (shardingConfiguration.Shards.ContainsKey(shardNumber) == false)