Skip to content

Commit 755f393

Browse files
author
Sachin Kale
committed
Re-factor some methods
Signed-off-by: Sachin Kale <[email protected]>
1 parent 61f8c26 commit 755f393

File tree

2 files changed

+80
-50
lines changed

2 files changed

+80
-50
lines changed

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

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@
5151
import java.util.Collections;
5252
import java.util.HashMap;
5353
import java.util.HashSet;
54+
import java.util.Iterator;
5455
import java.util.List;
5556
import java.util.Map;
5657
import java.util.Objects;
5758
import java.util.Set;
59+
import java.util.TreeSet;
5860
import java.util.concurrent.ConcurrentHashMap;
5961
import java.util.concurrent.atomic.AtomicBoolean;
6062
import java.util.concurrent.atomic.AtomicLong;
@@ -181,12 +183,19 @@ public RemoteSegmentMetadata initializeToSpecificCommit(long primaryTerm, long c
181183
return remoteSegmentMetadata;
182184
}
183185

186+
/**
187+
* Initializes the remote segment metadata to a specific timestamp.
188+
*
189+
* @param timestamp The timestamp to initialize the remote segment metadata to.
190+
* @return The RemoteSegmentMetadata object corresponding to the specified timestamp, or null if no metadata file is found for that timestamp.
191+
* @throws IOException If an I/O error occurs while reading the metadata file.
192+
*/
184193
public RemoteSegmentMetadata initializeToSpecificTimestamp(long timestamp) throws IOException {
185194
List<String> metadataFiles = remoteMetadataDirectory.listFilesByPrefixInLexicographicOrder(
186195
MetadataFilenameUtils.METADATA_PREFIX,
187196
Integer.MAX_VALUE
188197
);
189-
Set<String> lockedMetadataFiles = getImplicitLockedFiles(metadataFiles, Set.of(timestamp));
198+
Set<String> lockedMetadataFiles = getPinnedTimestampLockedFiles(metadataFiles, Set.of(timestamp));
190199
if (lockedMetadataFiles.isEmpty()) {
191200
return null;
192201
}
@@ -824,7 +833,7 @@ public void deleteStaleSegments(int lastNMetadataFilesToKeep) throws IOException
824833

825834
// ToDo: fetch pinned timestamps along with last fetch status of pinned timestamps. If stale, return.
826835
Set<Long> pinnedTimestamps = new HashSet<>();
827-
Set<String> implicitLockedFiles = getImplicitLockedFiles(metadataFilesEligibleToDelete, pinnedTimestamps);
836+
Set<String> implicitLockedFiles = getPinnedTimestampLockedFiles(metadataFilesEligibleToDelete, pinnedTimestamps);
828837
final Set<String> allLockFiles = new HashSet<>(implicitLockedFiles);
829838

830839
try {
@@ -899,56 +908,77 @@ public void deleteStaleSegments(int lastNMetadataFilesToKeep) throws IOException
899908
logger.debug("deletedSegmentFiles={}", deletedSegmentFiles);
900909
}
901910

902-
// Visible for testing
903-
Set<String> getImplicitLockedFiles(List<String> metadataFiles, Set<Long> pinnedTimstampSet) {
911+
/**
912+
* Determines and returns a set of metadata files that match provided pinned timestamps.
913+
*
914+
* This method identifies metadata files that are considered implicitly locked due to their timestamps
915+
* matching or being the closest preceding timestamp to the pinned timestamps. It uses a caching mechanism
916+
* to improve performance for previously processed timestamps.
917+
*
918+
* @param metadataFiles A list of metadata file names. Expected to be sorted in descending order of timestamp.
919+
* @param pinnedTimestampSet A set of timestamps representing pinned points in time.
920+
* @return A set of metadata file names that are implicitly locked based on the pinned timestamps.
921+
*
922+
* @implSpec The method performs the following steps:
923+
* 1. Validates input parameters.
924+
* 2. Updates the cache (metadataFilePinnedTimestampMap) to remove outdated entries.
925+
* 3. Processes cached entries and identifies new timestamps to process.
926+
* 4. For new timestamps, iterates through metadata files to find matching or closest preceding files.
927+
* 5. Updates the cache with newly processed timestamps and their corresponding metadata files.
928+
*
929+
* @implNote The method currently sorts the metadata files, but this may be unnecessary if files are
930+
* already sorted when fetched from the remote store.
931+
*/
932+
Set<String> getPinnedTimestampLockedFiles(List<String> metadataFiles, Set<Long> pinnedTimestampSet) {
904933
Set<String> implicitLockedFiles = new HashSet<>();
905934

906-
if (metadataFiles == null || metadataFiles.isEmpty() || pinnedTimstampSet == null) {
935+
if (metadataFiles == null || metadataFiles.isEmpty() || pinnedTimestampSet == null) {
907936
return implicitLockedFiles;
908937
}
909-
// Remove entries for timestamps that are no longer pinned
910-
metadataFilePinnedTimestampMap.keySet().retainAll(pinnedTimstampSet);
911938

912-
// If metadata file is already known for given timestamp, fetch it from cache
913-
for (Long pinnedTimestamp : pinnedTimstampSet) {
914-
if (metadataFilePinnedTimestampMap.containsKey(pinnedTimestamp)) {
915-
implicitLockedFiles.add(metadataFilePinnedTimestampMap.get(pinnedTimestamp));
939+
// Remove entries for timestamps that are no longer pinned
940+
metadataFilePinnedTimestampMap.keySet().retainAll(pinnedTimestampSet);
941+
942+
// Add cached entries and collect new timestamps
943+
Set<Long> newPinnedTimestamps = new TreeSet<>(Collections.reverseOrder());
944+
for (Long pinnedTimestamp : pinnedTimestampSet) {
945+
String cachedFile = metadataFilePinnedTimestampMap.get(pinnedTimestamp);
946+
if (cachedFile != null) {
947+
implicitLockedFiles.add(cachedFile);
948+
} else {
949+
newPinnedTimestamps.add(pinnedTimestamp);
916950
}
917951
}
918952

919-
// Remove already cached key and sort the new pinned timestamps in descending order
920-
List<Long> pinnedTimestamps = new ArrayList<>(pinnedTimstampSet);
921-
pinnedTimestamps.removeAll(metadataFilePinnedTimestampMap.keySet());
922-
if (pinnedTimstampSet.isEmpty()) {
953+
if (newPinnedTimestamps.isEmpty()) {
923954
return implicitLockedFiles;
924955
}
925-
pinnedTimestamps.sort(Collections.reverseOrder(Long::compare));
926956

927-
// Sort metadata files in descending order
957+
// Sort metadata files in descending order of timestamp
928958
// ToDo: Do we really need this? Files fetched from remote store are already lexicographically sorted.
929959
metadataFiles.sort(String::compareTo);
930960

931-
int cursor = 0;
961+
Iterator<Long> timestampIterator = newPinnedTimestamps.iterator();
962+
Long currentPinnedTimestamp = timestampIterator.next();
932963
long prevMdTimestamp = Long.MAX_VALUE;
933-
for (int i = 0; i < metadataFiles.size(); i++) {
934-
String metadataFileName = metadataFiles.get(i);
964+
965+
for (String metadataFileName : metadataFiles) {
935966
long currentMdTimestamp = MetadataFilenameUtils.getTimestamp(metadataFileName.split(SEPARATOR));
936-
long pinnedTimestamp = pinnedTimestamps.get(cursor);
937-
if (currentMdTimestamp <= pinnedTimestamp && prevMdTimestamp > pinnedTimestamp) {
967+
968+
while (currentMdTimestamp <= currentPinnedTimestamp && prevMdTimestamp > currentPinnedTimestamp) {
938969
implicitLockedFiles.add(metadataFileName);
939970
// Do not cache entry for latest metadata file as the next metadata can also match the same pinned timestamp
940971
if (prevMdTimestamp != Long.MAX_VALUE) {
941-
metadataFilePinnedTimestampMap.put(pinnedTimestamps.get(cursor), metadataFileName);
972+
metadataFilePinnedTimestampMap.put(currentPinnedTimestamp, metadataFileName);
942973
}
943-
cursor++;
944-
if (cursor >= pinnedTimestamps.size()) {
945-
break;
974+
if (timestampIterator.hasNext() == false) {
975+
return implicitLockedFiles;
946976
}
947-
i--;
948-
} else {
949-
prevMdTimestamp = currentMdTimestamp;
977+
currentPinnedTimestamp = timestampIterator.next();
950978
}
979+
prevMdTimestamp = currentMdTimestamp;
951980
}
981+
952982
return implicitLockedFiles;
953983
}
954984

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,35 +1144,35 @@ public void testMetadataFileNameOrder() {
11441144
assertEquals(14, count);
11451145
}
11461146

1147-
public void testGetImplicitLockedFilesWithEmptyMetadataFiles() {
1147+
public void testGetPinnedTimestampLockedFilesWithEmptyMetadataFiles() {
11481148
List<String> metadataFiles = Collections.emptyList();
11491149
Set<Long> pinnedTimestampSet = new HashSet<>(Arrays.asList(1L, 2L, 3L));
1150-
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getImplicitLockedFiles(metadataFiles, pinnedTimestampSet);
1150+
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getPinnedTimestampLockedFiles(metadataFiles, pinnedTimestampSet);
11511151
assertTrue(implicitLockedFiles.isEmpty());
11521152
}
11531153

1154-
public void testGetImplicitLockedFilesWithNoPinnedTimestamps() {
1154+
public void testGetPinnedTimestampLockedFilesWithNoPinnedTimestamps() {
11551155
List<String> metadataFiles = Arrays.asList("file1.txt", "file2.txt", "file3.txt");
11561156
Set<Long> pinnedTimestampSet = Collections.emptySet();
1157-
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getImplicitLockedFiles(metadataFiles, pinnedTimestampSet);
1157+
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getPinnedTimestampLockedFiles(metadataFiles, pinnedTimestampSet);
11581158
assertTrue(implicitLockedFiles.isEmpty());
11591159
}
11601160

1161-
public void testGetImplicitLockedFilesWithNullMetadataFiles() {
1161+
public void testGetPinnedTimestampLockedFilesWithNullMetadataFiles() {
11621162
List<String> metadataFiles = null;
11631163
Set<Long> pinnedTimestampSet = new HashSet<>(Arrays.asList(1L, 2L, 3L));
1164-
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getImplicitLockedFiles(metadataFiles, pinnedTimestampSet);
1164+
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getPinnedTimestampLockedFiles(metadataFiles, pinnedTimestampSet);
11651165
assertTrue(implicitLockedFiles.isEmpty());
11661166
}
11671167

1168-
public void testGetImplicitLockedFilesWithNullPinnedTimestampSet() {
1168+
public void testGetPinnedTimestampLockedFilesWithNullPinnedTimestampSet() {
11691169
List<String> metadataFiles = Arrays.asList("file1.txt", "file2.txt", "file3.txt");
11701170
Set<Long> pinnedTimestampSet = null;
1171-
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getImplicitLockedFiles(metadataFiles, pinnedTimestampSet);
1171+
Set<String> implicitLockedFiles = remoteSegmentStoreDirectory.getPinnedTimestampLockedFiles(metadataFiles, pinnedTimestampSet);
11721172
assertTrue(implicitLockedFiles.isEmpty());
11731173
}
11741174

1175-
private Tuple<Map<Long, String>, Set<String>> testGetImplicitLockedFilesWithPinnedTimestamps(
1175+
private Tuple<Map<Long, String>, Set<String>> testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
11761176
List<Long> metadataFileTimestamps,
11771177
Set<Long> pinnedTimetamps
11781178
) {
@@ -1183,15 +1183,15 @@ private Tuple<Map<Long, String>, Set<String>> testGetImplicitLockedFilesWithPinn
11831183
}
11841184
return new Tuple<>(
11851185
metadataFiles,
1186-
remoteSegmentStoreDirectory.getImplicitLockedFiles(new ArrayList<>(metadataFiles.values()), pinnedTimetamps)
1186+
remoteSegmentStoreDirectory.getPinnedTimestampLockedFiles(new ArrayList<>(metadataFiles.values()), pinnedTimetamps)
11871187
);
11881188
}
11891189

1190-
public void testGetImplicitLockedFilesWithPinnedTimestamps() {
1190+
public void testGetPinnedTimestampLockedFilesWithPinnedTimestamps() {
11911191
// Pinned timestamps 800, 900
11921192
// Metadata with timestamp 990
11931193
// No metadata matches the timestamp
1194-
Tuple<Map<Long, String>, Set<String>> metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1194+
Tuple<Map<Long, String>, Set<String>> metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
11951195
List.of(990L),
11961196
Set.of(800L, 900L)
11971197
);
@@ -1205,7 +1205,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12051205
// Pinned timestamps 800, 900, 1000
12061206
// Metadata with timestamp 990
12071207
// Metadata timestamp 990 <= Pinned Timestamp 1000
1208-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(List.of(990L), Set.of(800L, 900L, 1000L));
1208+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(List.of(990L), Set.of(800L, 900L, 1000L));
12091209
metadataFiles = metadataAndLocks.v1();
12101210
implicitLockedFiles = metadataAndLocks.v2();
12111211

@@ -1218,7 +1218,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12181218
// Pinned timestamps 800, 900, 1000
12191219
// Metadata with timestamp 990, 995
12201220
// Metadata timestamp 995 <= Pinned Timestamp 1000
1221-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(List.of(990L, 995L), Set.of(800L, 900L, 1000L));
1221+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(List.of(990L, 995L), Set.of(800L, 900L, 1000L));
12221222
metadataFiles = metadataAndLocks.v1();
12231223
implicitLockedFiles = metadataAndLocks.v2();
12241224

@@ -1231,7 +1231,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12311231
// Pinned timestamps 800, 900, 1000
12321232
// Metadata with timestamp 990, 995, 1000
12331233
// Metadata timestamp 1000 <= Pinned Timestamp 1000
1234-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(List.of(990L, 995L, 1000L), Set.of(800L, 900L, 1000L));
1234+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(List.of(990L, 995L, 1000L), Set.of(800L, 900L, 1000L));
12351235
metadataFiles = metadataAndLocks.v1();
12361236
implicitLockedFiles = metadataAndLocks.v2();
12371237

@@ -1245,7 +1245,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12451245
// Metadata with timestamp 990, 995, 1000, 1001
12461246
// Metadata timestamp 1000 <= Pinned Timestamp 1000
12471247
// Metadata timestamp 1001 <= Pinned Timestamp 2000
1248-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1248+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
12491249
List.of(990L, 995L, 1000L, 1001L),
12501250
Set.of(800L, 900L, 1000L, 2000L)
12511251
);
@@ -1267,7 +1267,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12671267
// Metadata timestamp 1001 <= Pinned Timestamp 3000
12681268
// Metadata timestamp 1001 <= Pinned Timestamp 4000
12691269
// Metadata timestamp 1001 <= Pinned Timestamp 5000
1270-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1270+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
12711271
List.of(990L, 995L, 1000L, 1001L),
12721272
Set.of(800L, 900L, 1000L, 2000L, 3000L, 4000L, 5000L)
12731273
);
@@ -1289,7 +1289,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
12891289
// Metadata timestamp 2300 <= Pinned Timestamp 3000
12901290
// Metadata timestamp 2300 <= Pinned Timestamp 4000
12911291
// Metadata timestamp 2300 <= Pinned Timestamp 5000
1292-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1292+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
12931293
List.of(990L, 995L, 1000L, 1001L, 1900L, 2300L),
12941294
Set.of(800L, 900L, 1000L, 2000L, 3000L, 4000L, 5000L)
12951295
);
@@ -1312,7 +1312,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
13121312
// Metadata timestamp 2300 <= Pinned Timestamp 3000
13131313
// Metadata timestamp 2300 <= Pinned Timestamp 4000
13141314
// Metadata timestamp 2300 <= Pinned Timestamp 5000
1315-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1315+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
13161316
List.of(990L, 995L, 1000L, 1001L, 1900L, 2300L),
13171317
Set.of(2000L, 3000L, 4000L, 5000L)
13181318
);
@@ -1333,7 +1333,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
13331333
// Metadata timestamp 3000 <= Pinned Timestamp 3000
13341334
// Metadata timestamp 3001 <= Pinned Timestamp 4000
13351335
// Metadata timestamp 3001 <= Pinned Timestamp 5000
1336-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1336+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
13371337
List.of(1001L, 1900L, 2300L, 3000L, 3001L, 5500L, 6000L),
13381338
Set.of(2000L, 3000L, 4000L, 5000L)
13391339
);
@@ -1358,7 +1358,7 @@ public void testGetImplicitLockedFilesWithPinnedTimestamps() {
13581358
// Metadata timestamp 3001 <= Pinned Timestamp 5000
13591359
// Metadata timestamp 6000 <= Pinned Timestamp 6000
13601360
// Metadata timestamp 6000 <= Pinned Timestamp 7000
1361-
metadataAndLocks = testGetImplicitLockedFilesWithPinnedTimestamps(
1361+
metadataAndLocks = testGetPinnedTimestampLockedFilesWithPinnedTimestamps(
13621362
List.of(2300L, 3000L, 3001L, 5500L, 6000L),
13631363
Set.of(4000L, 5000L, 6000L, 7000L)
13641364
);

0 commit comments

Comments
 (0)