Skip to content

Commit 5bf34d2

Browse files
authored
[Snapshot V2] Support pinned timestamp in delete flow (opensearch-project#15256)
Signed-off-by: Anshu Agarwal <anshukag@amazon.com>
1 parent 0753461 commit 5bf34d2

File tree

8 files changed

+790
-31
lines changed

8 files changed

+790
-31
lines changed

server/src/internalClusterTest/java/org/opensearch/snapshots/DeleteSnapshotITV2.java

+332
Large diffs are not rendered by default.

server/src/main/java/org/opensearch/action/admin/cluster/repositories/cleanup/TransportCleanupRepositoryAction.java

+9
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.opensearch.common.inject.Inject;
5353
import org.opensearch.core.action.ActionListener;
5454
import org.opensearch.core.common.io.stream.StreamInput;
55+
import org.opensearch.index.store.RemoteSegmentStoreDirectoryFactory;
5556
import org.opensearch.index.store.lockmanager.RemoteStoreLockManagerFactory;
5657
import org.opensearch.indices.RemoteStoreSettings;
5758
import org.opensearch.repositories.RepositoriesService;
@@ -97,6 +98,8 @@ public final class TransportCleanupRepositoryAction extends TransportClusterMana
9798

9899
private final RemoteStoreLockManagerFactory remoteStoreLockManagerFactory;
99100

101+
private final RemoteSegmentStoreDirectoryFactory remoteSegmentStoreDirectoryFactory;
102+
100103
@Override
101104
protected String executor() {
102105
return ThreadPool.Names.SAME;
@@ -124,6 +127,11 @@ public TransportCleanupRepositoryAction(
124127
);
125128
this.repositoriesService = repositoriesService;
126129
this.snapshotsService = snapshotsService;
130+
this.remoteSegmentStoreDirectoryFactory = new RemoteSegmentStoreDirectoryFactory(
131+
() -> repositoriesService,
132+
threadPool,
133+
remoteStoreSettings.getSegmentsPathFixedPrefix()
134+
);
127135
this.remoteStoreLockManagerFactory = new RemoteStoreLockManagerFactory(
128136
() -> repositoriesService,
129137
remoteStoreSettings.getSegmentsPathFixedPrefix()
@@ -277,6 +285,7 @@ public void clusterStateProcessed(String source, ClusterState oldState, ClusterS
277285
repositoryStateId,
278286
snapshotsService.minCompatibleVersion(newState.nodes().getMinNodeVersion(), repositoryData, null),
279287
remoteStoreLockManagerFactory,
288+
remoteSegmentStoreDirectoryFactory,
280289
ActionListener.wrap(result -> after(null, result), e -> after(e, null))
281290
)
282291
)

server/src/main/java/org/opensearch/node/remotestore/RemoteStorePinnedTimestampService.java

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.apache.logging.log4j.Logger;
1313
import org.apache.logging.log4j.message.ParameterizedMessage;
1414
import org.opensearch.cluster.service.ClusterService;
15+
import org.opensearch.common.annotation.ExperimentalApi;
1516
import org.opensearch.common.blobstore.BlobContainer;
1617
import org.opensearch.common.blobstore.BlobMetadata;
1718
import org.opensearch.common.collect.Tuple;
@@ -42,6 +43,7 @@
4243
*
4344
* @opensearch.internal
4445
*/
46+
@ExperimentalApi
4547
public class RemoteStorePinnedTimestampService implements Closeable {
4648
private static final Logger logger = LogManager.getLogger(RemoteStorePinnedTimestampService.class);
4749
private static Tuple<Long, Set<Long>> pinnedTimestampsSet = new Tuple<>(-1L, Set.of());

server/src/main/java/org/opensearch/repositories/Repository.java

+55-5
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@
5050
import org.opensearch.index.mapper.MapperService;
5151
import org.opensearch.index.snapshots.IndexShardSnapshotStatus;
5252
import org.opensearch.index.snapshots.blobstore.RemoteStoreShardShallowCopySnapshot;
53+
import org.opensearch.index.store.RemoteSegmentStoreDirectoryFactory;
5354
import org.opensearch.index.store.Store;
5455
import org.opensearch.index.store.lockmanager.RemoteStoreLockManagerFactory;
5556
import org.opensearch.indices.recovery.RecoveryState;
57+
import org.opensearch.node.remotestore.RemoteStorePinnedTimestampService;
5658
import org.opensearch.snapshots.SnapshotId;
5759
import org.opensearch.snapshots.SnapshotInfo;
5860

@@ -207,11 +209,59 @@ void deleteSnapshots(
207209
/**
208210
* Deletes snapshots and releases respective lock files from remote store repository.
209211
*
210-
* @param snapshotIds snapshot ids
211-
* @param repositoryStateId the unique id identifying the state of the repository when the snapshot deletion began
212-
* @param repositoryMetaVersion version of the updated repository metadata to write
213-
* @param remoteStoreLockManagerFactory RemoteStoreLockManagerFactory to be used for cleaning up remote store lock files
214-
* @param listener completion listener
212+
* @param snapshotIds snapshot ids
213+
* @param repositoryStateId the unique id identifying the state of the repository when the snapshot deletion began
214+
* @param repositoryMetaVersion version of the updated repository metadata to write
215+
* @param remoteStoreLockManagerFactory RemoteStoreLockManagerFactory to be used for cleaning up remote store lock files
216+
* @param remoteSegmentStoreDirectoryFactory RemoteSegmentStoreDirectoryFactory to be used for cleaning up remote store segment files
217+
* @param remoteStorePinnedTimestampService service for pinning and unpinning of the timestamp
218+
* @param snapshotIdsPinnedTimestampMap map of snapshots ids and the pinned timestamp
219+
* @param isShallowSnapshotV2 true for shallow snapshots v2
220+
* @param listener completion listener
221+
*/
222+
default void deleteSnapshotsInternal(
223+
Collection<SnapshotId> snapshotIds,
224+
long repositoryStateId,
225+
Version repositoryMetaVersion,
226+
RemoteStoreLockManagerFactory remoteStoreLockManagerFactory,
227+
RemoteSegmentStoreDirectoryFactory remoteSegmentStoreDirectoryFactory,
228+
RemoteStorePinnedTimestampService remoteStorePinnedTimestampService,
229+
Map<SnapshotId, Long> snapshotIdsPinnedTimestampMap,
230+
boolean isShallowSnapshotV2,
231+
ActionListener<RepositoryData> listener
232+
) {
233+
throw new UnsupportedOperationException();
234+
}
235+
236+
/**
237+
* Deletes snapshots and unpin the snapshot timestamp using remoteStorePinnedTimestampService
238+
*
239+
* @param snapshotsWithPinnedTimestamp map of snapshot ids and the pinned timestamps
240+
* @param repositoryStateId the unique id identifying the state of the repository when the snapshot deletion began
241+
* @param repositoryMetaVersion version of the updated repository metadata to write
242+
* @param remoteSegmentStoreDirectoryFactory RemoteSegmentStoreDirectoryFactory to be used for cleaning up remote store segment files
243+
* @param remoteStorePinnedTimestampService service for pinning and unpinning of the timestamp
244+
* @param listener completion listener
245+
*/
246+
default void deleteSnapshotsWithPinnedTimestamp(
247+
Map<SnapshotId, Long> snapshotsWithPinnedTimestamp,
248+
long repositoryStateId,
249+
Version repositoryMetaVersion,
250+
RemoteSegmentStoreDirectoryFactory remoteSegmentStoreDirectoryFactory,
251+
RemoteStorePinnedTimestampService remoteStorePinnedTimestampService,
252+
ActionListener<RepositoryData> listener
253+
) {
254+
throw new UnsupportedOperationException();
255+
}
256+
257+
/**
258+
* Deletes snapshots and releases respective lock files from remote store repository
259+
*
260+
* @param snapshotIds
261+
* @param repositoryStateId
262+
* @param repositoryMetaVersion
263+
* @param remoteStoreLockManagerFactory
264+
* @param listener
215265
*/
216266
default void deleteSnapshotsAndReleaseLockFiles(
217267
Collection<SnapshotId> snapshotIds,

server/src/main/java/org/opensearch/repositories/RepositoryData.java

+5
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ public final class RepositoryData {
111111
* The indices found in the repository across all snapshots, as a name to {@link IndexId} mapping
112112
*/
113113
private final Map<String, IndexId> indices;
114+
115+
public Map<IndexId, List<SnapshotId>> getIndexSnapshots() {
116+
return indexSnapshots;
117+
}
118+
114119
/**
115120
* The snapshots that each index belongs to.
116121
*/

0 commit comments

Comments
 (0)