Skip to content

Implement Eventually Consistent Mock Repository for SnapshotResiliencyTests #40893

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
6f24de1
Add Eventually Consistent Mock Repository
original-brownbear Apr 4, 2019
15fe43f
bck
original-brownbear Apr 4, 2019
233ef74
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 5, 2019
c346c3d
better
original-brownbear Apr 5, 2019
ab8da42
repeat 5000
original-brownbear Apr 5, 2019
8713682
repeat 5000
original-brownbear Apr 5, 2019
6d7c993
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 5, 2019
86e3d62
bck
original-brownbear Apr 5, 2019
e7587cb
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 17, 2019
e320ebc
CR: Fix incorrect consistency and deleting of empty trees
original-brownbear Apr 17, 2019
81a4ad6
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 17, 2019
7b5c2e6
CR: Fix incorrect consistency and deleting of empty trees
original-brownbear Apr 17, 2019
dfffe74
handle empty dirs like on S3/GCS
original-brownbear Apr 17, 2019
bc751fd
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 18, 2019
ea12df2
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 19, 2019
0f35d33
CR: fix failing to use cached misses in read and exists calls
original-brownbear Apr 19, 2019
4aaaecb
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 19, 2019
83a7d67
Merge remote-tracking branch 'elastic' into eventually-consistent-moc…
original-brownbear Apr 21, 2019
7f1f7eb
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 23, 2019
beef086
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 24, 2019
cf9a39d
Make things nicer loooking
original-brownbear Apr 24, 2019
dd0f92f
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 24, 2019
ba6abf6
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Apr 26, 2019
228ece6
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear May 7, 2019
f8df217
repro #41898
original-brownbear May 7, 2019
f5ce1d6
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear May 8, 2019
c662f18
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear May 10, 2019
0347ae0
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear May 10, 2019
bc7aac2
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jun 24, 2019
0f310ad
CR: Adjust implementation to in memory list of all operations
original-brownbear Jun 24, 2019
573c9ae
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jun 24, 2019
1e50b85
shorter diff
original-brownbear Jun 24, 2019
f0427aa
shorter diff
original-brownbear Jun 24, 2019
7d09033
Merge branch 'eventually-consistent-mock-repo' of github.com:original…
original-brownbear Jul 15, 2019
c73f33b
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 15, 2019
3c94924
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 16, 2019
d1f1e79
CR: Test, fix delete case, dry up ensure open
original-brownbear Jul 16, 2019
f00ba32
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 16, 2019
dc8bac3
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 16, 2019
58a9d42
CR: much stronger overwrite blob assertions, some cleanups, cleaner t…
original-brownbear Jul 16, 2019
7683dcc
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 16, 2019
07bc1cf
Merge remote-tracking branch 'elastic/master' into eventually-consist…
original-brownbear Jul 17, 2019
0afcaa3
blobExists is gone :)
original-brownbear Jul 17, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,13 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent imp

private static final int BUFFER_SIZE = 4096;

private static final String SNAPSHOT_PREFIX = "snap-";
public static final String SNAPSHOT_PREFIX = "snap-";

private static final String SNAPSHOT_CODEC = "snapshot";
public static final String SNAPSHOT_CODEC = "snapshot";

private static final String INDEX_FILE_PREFIX = "index-";

private static final String INDEX_LATEST_BLOB = "index.latest";
public static final String INDEX_LATEST_BLOB = "index.latest";

private static final String TESTS_FILE = "tests-";

Expand Down Expand Up @@ -180,7 +180,7 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent imp

private final ChecksumBlobStoreFormat<IndexMetaData> indexMetaDataFormat;

private final ChecksumBlobStoreFormat<SnapshotInfo> snapshotFormat;
protected final ChecksumBlobStoreFormat<SnapshotInfo> snapshotFormat;

private final boolean readOnly;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
import org.elasticsearch.cluster.service.ClusterApplierService;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.cluster.service.MasterService;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.network.NetworkModule;
import org.elasticsearch.common.settings.ClusterSettings;
Expand Down Expand Up @@ -152,6 +153,7 @@
import org.elasticsearch.search.SearchService;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.FetchPhase;
import org.elasticsearch.snapshots.mockstore.MockEventuallyConsistentRepository;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.disruption.DisruptableMockTransport;
import org.elasticsearch.test.disruption.NetworkDisruption;
Expand Down Expand Up @@ -203,16 +205,28 @@ public class SnapshotResiliencyTests extends ESTestCase {

private Path tempDir;

/**
* Context shared by all the node's {@link Repository} instances if the eventually consistent blobstore is to be used.
* {@code null} if not using the eventually consistent blobstore.
*/
@Nullable private MockEventuallyConsistentRepository.Context blobStoreContext;

@Before
public void createServices() {
tempDir = createTempDir();
if (randomBoolean()) {
blobStoreContext = new MockEventuallyConsistentRepository.Context();
}
deterministicTaskQueue =
new DeterministicTaskQueue(Settings.builder().put(NODE_NAME_SETTING.getKey(), "shared").build(), random());
}

@After
public void verifyReposThenStopServices() {
try {
if (blobStoreContext != null) {
blobStoreContext.forceConsistent();
}
BlobStoreTestUtil.assertConsistency(
(BlobStoreRepository) testClusterNodes.randomMasterNodeSafe().repositoriesService.repository("repo"),
Runnable::run);
Expand Down Expand Up @@ -900,19 +914,7 @@ public void onFailure(final Exception e) {
final IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver();
repositoriesService = new RepositoriesService(
settings, clusterService, transportService,
Collections.singletonMap(FsRepository.TYPE, metaData -> {
final Repository repository = new FsRepository(metaData, environment, xContentRegistry(), threadPool) {
@Override
protected void assertSnapshotOrGenericThread() {
// eliminate thread name check as we create repo in the test thread
}
};
repository.start();
return repository;
}
),
emptyMap(),
threadPool
Collections.singletonMap(FsRepository.TYPE, getRepoFactory(environment)), emptyMap(), threadPool
);
snapshotsService =
new SnapshotsService(settings, clusterService, indexNameExpressionResolver, repositoriesService, threadPool);
Expand Down Expand Up @@ -1077,6 +1079,28 @@ searchTransportService, new SearchPhaseController(searchService::createReduceCon
client.initialize(actions, () -> clusterService.localNode().getId(), transportService.getRemoteClusterService());
}

private Repository.Factory getRepoFactory(Environment environment) {
// Run half the tests with the eventually consistent repository
if (blobStoreContext == null) {
return metaData -> {
final Repository repository = new FsRepository(metaData, environment, xContentRegistry(), threadPool) {
@Override
protected void assertSnapshotOrGenericThread() {
// eliminate thread name check as we create repo in the test thread
}
};
repository.start();
return repository;
};
} else {
return metaData -> {
final Repository repository = new MockEventuallyConsistentRepository(
metaData, environment, xContentRegistry(), deterministicTaskQueue.getThreadPool(), blobStoreContext);
repository.start();
return repository;
};
}
}
public void restart() {
testClusterNodes.disconnectNode(this);
final ClusterState oldState = this.clusterService.state();
Expand Down
Loading