Skip to content

Commit b2a836b

Browse files
ashking94gbbafna
andauthored
[Backport 2.x] [Remote Store] Using hash of node id in metadata file names (#10491)
* [Remote Store] Using hash of node id in metadata file names (#10480) Signed-off-by: Gaurav Bafna <gbbafna@amazon.com> Signed-off-by: Ashish Singh <ssashish@amazon.com> * Fix failing testGetPrimaryTermAndGeneration in TranslogTransferManagerTests (#10490) Signed-off-by: Ashish Singh <ssashish@amazon.com> --------- Signed-off-by: Gaurav Bafna <gbbafna@amazon.com> Signed-off-by: Ashish Singh <ssashish@amazon.com> Co-authored-by: Gaurav Bafna <85113518+gbbafna@users.noreply.github.com>
1 parent 24aec59 commit b2a836b

File tree

6 files changed

+29
-16
lines changed

6 files changed

+29
-16
lines changed

server/src/main/java/org/opensearch/index/remote/RemoteStoreUtils.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public static String getSegmentName(String filename) {
8282
* @param fn Function to extract PrimaryTerm_Generation and Node Id from metadata file name .
8383
* fn returns null if node id is not part of the file name
8484
*/
85-
static public void verifyNoMultipleWriters(List<String> mdFiles, Function<String, Tuple<String, String>> fn) {
85+
public static void verifyNoMultipleWriters(List<String> mdFiles, Function<String, Tuple<String, String>> fn) {
8686
Map<String, String> nodesByPrimaryTermAndGen = new HashMap<>();
8787
mdFiles.forEach(mdFile -> {
8888
Tuple<String, String> nodeIdByPrimaryTermAndGen = fn.apply(mdFile);
@@ -91,10 +91,9 @@ static public void verifyNoMultipleWriters(List<String> mdFiles, Function<String
9191
&& (!nodesByPrimaryTermAndGen.get(nodeIdByPrimaryTermAndGen.v1()).equals(nodeIdByPrimaryTermAndGen.v2()))) {
9292
throw new IllegalStateException(
9393
"Multiple metadata files from different nodes"
94+
+ "having same primary term and generations "
9495
+ nodeIdByPrimaryTermAndGen.v1()
95-
+ " and "
96-
+ nodeIdByPrimaryTermAndGen.v2()
97-
+ "having same primary term and generations detected"
96+
+ " detected "
9897
);
9998
}
10099
nodesByPrimaryTermAndGen.put(nodeIdByPrimaryTermAndGen.v1(), nodeIdByPrimaryTermAndGen.v2());

server/src/main/java/org/opensearch/index/store/RemoteSegmentStoreDirectory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.util.HashSet;
5555
import java.util.List;
5656
import java.util.Map;
57+
import java.util.Objects;
5758
import java.util.Set;
5859
import java.util.concurrent.ConcurrentHashMap;
5960
import java.util.concurrent.atomic.AtomicBoolean;
@@ -332,7 +333,7 @@ public static String getMetadataFilename(
332333
RemoteStoreUtils.invertLong(generation),
333334
RemoteStoreUtils.invertLong(translogGeneration),
334335
RemoteStoreUtils.invertLong(uploadCounter),
335-
nodeId,
336+
String.valueOf(Objects.hash(nodeId)),
336337
RemoteStoreUtils.invertLong(System.currentTimeMillis()),
337338
String.valueOf(metadataVersion)
338339
);

server/src/main/java/org/opensearch/index/translog/transfer/TranslogTransferMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public String getFileName() {
100100
RemoteStoreUtils.invertLong(primaryTerm),
101101
RemoteStoreUtils.invertLong(generation),
102102
RemoteStoreUtils.invertLong(createdAt),
103-
nodeId,
103+
String.valueOf(Objects.hash(nodeId)),
104104
String.valueOf(CURRENT_VERSION)
105105
)
106106
);

server/src/test/java/org/opensearch/index/remote/RemoteStoreUtilsTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,10 @@ public void testVerifyMultipleWriters_Segment() {
151151
}
152152

153153
public void testVerifyMultipleWriters_Translog() throws InterruptedException {
154-
TranslogTransferMetadata tm = new TranslogTransferMetadata(1, 1, 1, 2, "node-1");
154+
TranslogTransferMetadata tm = new TranslogTransferMetadata(1, 1, 1, 2, "node--1");
155155
String mdFilename = tm.getFileName();
156156
Thread.sleep(1);
157-
TranslogTransferMetadata tm2 = new TranslogTransferMetadata(1, 1, 1, 2, "node-1");
157+
TranslogTransferMetadata tm2 = new TranslogTransferMetadata(1, 1, 1, 2, "node--1");
158158
String mdFilename2 = tm2.getFileName();
159159
List<BlobMetadata> bmList = new LinkedList<>();
160160
bmList.add(new PlainBlobMetadata(mdFilename, 1));
@@ -167,7 +167,7 @@ public void testVerifyMultipleWriters_Translog() throws InterruptedException {
167167

168168
bmList = new LinkedList<>();
169169
bmList.add(new PlainBlobMetadata(mdFilename, 1));
170-
TranslogTransferMetadata tm3 = new TranslogTransferMetadata(1, 1, 1, 2, "node-2");
170+
TranslogTransferMetadata tm3 = new TranslogTransferMetadata(1, 1, 1, 2, "node--2");
171171
bmList.add(new PlainBlobMetadata(tm3.getFileName(), 1));
172172
List<BlobMetadata> finalBmList = bmList;
173173
assertThrows(

server/src/test/java/org/opensearch/index/store/RemoteSegmentStoreDirectoryTests.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.mockito.Mockito;
6868

6969
import static org.opensearch.index.store.RemoteSegmentStoreDirectory.METADATA_FILES_TO_FETCH;
70+
import static org.opensearch.index.store.RemoteSegmentStoreDirectory.MetadataFilenameUtils.SEPARATOR;
7071
import static org.opensearch.test.RemoteStoreTestUtils.createMetadataFileBytes;
7172
import static org.opensearch.test.RemoteStoreTestUtils.getDummyMetadata;
7273
import static org.hamcrest.CoreMatchers.is;
@@ -213,9 +214,7 @@ public void testUploadedSegmentMetadataFromStringException() {
213214
}
214215

215216
public void testGetPrimaryTermGenerationUuid() {
216-
String[] filenameTokens = "abc__9223372036854775795__9223372036854775784__uuid_xyz".split(
217-
RemoteSegmentStoreDirectory.MetadataFilenameUtils.SEPARATOR
218-
);
217+
String[] filenameTokens = "abc__9223372036854775795__9223372036854775784__uuid_xyz".split(SEPARATOR);
219218
assertEquals(12, RemoteSegmentStoreDirectory.MetadataFilenameUtils.getPrimaryTerm(filenameTokens));
220219
assertEquals(23, RemoteSegmentStoreDirectory.MetadataFilenameUtils.getGeneration(filenameTokens));
221220
}
@@ -1178,6 +1177,10 @@ public void testMetadataFileNameOrder() {
11781177
actualList.sort(String::compareTo);
11791178

11801179
assertEquals(List.of(file3, file2, file4, file6, file5, file1), actualList);
1180+
1181+
long count = file1.chars().filter(ch -> ch == SEPARATOR.charAt(0)).count();
1182+
// There should not be any `_` in mdFile name as it is used a separator .
1183+
assertEquals(14, count);
11811184
}
11821185

11831186
private static class WrapperIndexOutput extends IndexOutput {

server/src/test/java/org/opensearch/index/translog/transfer/TranslogTransferManagerTests.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@
3939
import java.util.Collections;
4040
import java.util.LinkedList;
4141
import java.util.List;
42+
import java.util.Objects;
4243
import java.util.Set;
44+
import java.util.UUID;
4345
import java.util.concurrent.atomic.AtomicInteger;
4446

4547
import org.mockito.Mockito;
4648

49+
import static org.opensearch.index.translog.transfer.TranslogTransferMetadata.METADATA_SEPARATOR;
4750
import static org.mockito.ArgumentMatchers.anyInt;
4851
import static org.mockito.ArgumentMatchers.anyMap;
4952
import static org.mockito.ArgumentMatchers.anySet;
@@ -503,8 +506,12 @@ private void assertTlogCkpDownloadStats() {
503506
}
504507

505508
public void testGetPrimaryTermAndGeneration() {
506-
String tm = new TranslogTransferMetadata(1, 2, 1, 2, "node-1").getFileName();
507-
assertEquals(new Tuple<>(new Tuple<>(1L, 2L), "node-1"), TranslogTransferMetadata.getNodeIdByPrimaryTermAndGeneration(tm));
509+
String nodeId = UUID.randomUUID().toString();
510+
String tm = new TranslogTransferMetadata(1, 2, 1, 2, nodeId).getFileName();
511+
Tuple<Tuple<Long, Long>, String> actualOutput = TranslogTransferMetadata.getNodeIdByPrimaryTermAndGeneration(tm);
512+
assertEquals(1L, (long) (actualOutput.v1().v1()));
513+
assertEquals(2L, (long) (actualOutput.v1().v2()));
514+
assertEquals(String.valueOf(Objects.hash(nodeId)), actualOutput.v2());
508515
}
509516

510517
public void testMetadataConflict() throws InterruptedException {
@@ -515,10 +522,13 @@ public void testMetadataConflict() throws InterruptedException {
515522
null,
516523
remoteTranslogTransferTracker
517524
);
518-
TranslogTransferMetadata tm = new TranslogTransferMetadata(1, 1, 1, 2, "node-1");
525+
TranslogTransferMetadata tm = new TranslogTransferMetadata(1, 1, 1, 2, "node--1");
519526
String mdFilename = tm.getFileName();
527+
long count = mdFilename.chars().filter(ch -> ch == METADATA_SEPARATOR.charAt(0)).count();
528+
// There should not be any `_` in mdFile name as it is used a separator .
529+
assertEquals(10, count);
520530
Thread.sleep(1);
521-
TranslogTransferMetadata tm2 = new TranslogTransferMetadata(1, 1, 1, 2, "node-2");
531+
TranslogTransferMetadata tm2 = new TranslogTransferMetadata(1, 1, 1, 2, "node--2");
522532
String mdFilename2 = tm2.getFileName();
523533

524534
doAnswer(invocation -> {

0 commit comments

Comments
 (0)