@@ -1054,4 +1054,61 @@ private void assertSearchableSnapshotIndexDirectoryExistence(String nodeName, In
10541054 assertTrue ("index cache path should " + (exists ? "exist" : "not exist" ), Files .exists (indexPath ) == exists );
10551055 }, 30 , TimeUnit .SECONDS );
10561056 }
1057+
1058+ public void testRestoreRemoteSnapshotWithNullShardSizes () throws Exception {
1059+ final String snapshotName1 = "test-snap-1" ;
1060+ final String snapshotName2 = "test-snap-2" ;
1061+ final String repoName = "test-repo" ;
1062+ final String indexName1 = "test-idx-1" ;
1063+ final String indexName2 = "test-idx-2" ;
1064+ final Client client = client ();
1065+
1066+ // Setup cluster with delayed ClusterInfo updates to simulate null shard sizes
1067+ client .admin ()
1068+ .cluster ()
1069+ .prepareUpdateSettings ()
1070+ .setPersistentSettings (Settings .builder ().put ("cluster.info.update.interval" , "60m" ))
1071+ .get ();
1072+
1073+ internalCluster ().ensureAtLeastNumDataNodes (2 );
1074+
1075+ createIndexWithDocsAndEnsureGreen (0 , 50 , indexName1 );
1076+ createRepositoryWithSettings (null , repoName );
1077+ takeSnapshot (client , snapshotName1 , repoName , indexName1 );
1078+ deleteIndicesAndEnsureGreen (client , indexName1 );
1079+
1080+ createIndexWithDocsAndEnsureGreen (0 , 50 , indexName2 );
1081+ takeSnapshot (client , snapshotName2 , repoName , indexName2 );
1082+ deleteIndicesAndEnsureGreen (client , indexName2 );
1083+
1084+ internalCluster ().ensureAtLeastNumWarmNodes (2 );
1085+
1086+ RestoreSnapshotRequest firstRestore = new RestoreSnapshotRequest (repoName , snapshotName1 ).indices (indexName1 )
1087+ .storageType (RestoreSnapshotRequest .StorageType .REMOTE_SNAPSHOT )
1088+ .renamePattern ("(.+)" )
1089+ .renameReplacement ("remote-$1" )
1090+ .waitForCompletion (true );
1091+
1092+ client .admin ().cluster ().restoreSnapshot (firstRestore ).get ();
1093+ ensureGreen ("remote-" + indexName1 );
1094+
1095+ // Second restore immediately after - ClusterInfo won't have size data for first restore shards
1096+ RestoreSnapshotRequest secondRestore = new RestoreSnapshotRequest (repoName , snapshotName2 ).indices (indexName2 )
1097+ .storageType (RestoreSnapshotRequest .StorageType .REMOTE_SNAPSHOT )
1098+ .renamePattern ("(.+)" )
1099+ .renameReplacement ("remote-$1" )
1100+ .waitForCompletion (true );
1101+
1102+ client .admin ().cluster ().restoreSnapshot (secondRestore ).get ();
1103+ ensureGreen ("remote-" + indexName2 );
1104+
1105+ assertDocCount ("remote-" + indexName1 , 50L );
1106+ assertDocCount ("remote-" + indexName2 , 50L );
1107+
1108+ client .admin ()
1109+ .cluster ()
1110+ .prepareUpdateSettings ()
1111+ .setPersistentSettings (Settings .builder ().putNull ("cluster.info.update.interval" ))
1112+ .get ();
1113+ }
10571114}
0 commit comments