fix repository update with the same settings but different type#31458
Conversation
|
Pinging @elastic/es-distributed |
| if (previous != null) { | ||
| RepositoryMetaData previousMetadata = previous.getMetadata(); | ||
| if (!previousMetadata.type().equals(repositoryMetaData.type()) && previousMetadata.settings().equals(repositoryMetaData.settings())) { | ||
| if (previousMetadata.type().equals(repositoryMetaData.type()) && previousMetadata.settings().equals(repositoryMetaData.settings())) { |
There was a problem hiding this comment.
Maybe we can just use RepositoryMetaData.equals() here?
There was a problem hiding this comment.
make sense
| return Collections.singletonList(TestFSRepositoryPlugin.class); | ||
| } | ||
|
|
||
| public static class TestFSRepositoryPlugin extends Plugin implements RepositoryPlugin { |
There was a problem hiding this comment.
You can use MockRepository.Plugin instead of adding a new type of repository
|
|
||
| Client client = client(); | ||
| Settings settings = ((InternalTestCluster) cluster()).getDefaultSettings(); | ||
| Path location = randomRepoPath(settings); |
There was a problem hiding this comment.
Why not using randomPath() directly?
| assertThat(getRepositoriesResponse2.repositories(), hasSize(1)); | ||
| RepositoryMetaData repositoryMetaData2 = getRepositoriesResponse2.repositories().get(0); | ||
|
|
||
| assertThat(repositoryMetaData2.type(), equalTo(FAKE_FS_TYPE)); |
There was a problem hiding this comment.
I'm wondering if we should also check the Repository instance itself using internalCluster().getInstance(RepositoriesService.class).repository(name) and check if the instance is the same or has changed.
There was a problem hiding this comment.
agree - make sense to add that kind of check
|
@tlrx thanks for your comments, could you pls have another look ? |
tlrx
left a comment
There was a problem hiding this comment.
I left more minor comments, thanks @vladimirdolzhenko for fixing this!
| .setType(FsRepository.TYPE) | ||
| .setSettings(repoSettings) | ||
| .get(); | ||
| assertThat(putRepositoryResponse1.isAcknowledged(), equalTo(true)); |
There was a problem hiding this comment.
You can use assertAcked(client.admin().cluster().preparePutRepository(repositoryName)
.setType(FsRepository.TYPE)
.setSettings(repoSettings))
|
|
||
| // update repository | ||
|
|
||
| boolean diffType = randomBoolean(); |
There was a problem hiding this comment.
Maybe we could make this more readable with:
final String updatedRepositoryType = randomBoolean() ? "mock" : FsRepository.TYPE
?
| .setType(diffType ? "mock" : FsRepository.TYPE) | ||
| .setSettings(repoSettings) | ||
| .get(); | ||
| assertThat(putRepositoryResponse2.isAcknowledged(), equalTo(true)); |
| assertThat(repositoryMetaData2.type(), equalTo(diffType ? "mock" : FsRepository.TYPE)); | ||
|
|
||
| Repository repository2 = repositoriesService.repository(repositoryName); | ||
| assertThat(repository2, instanceOf(diffType ? MockRepository.class : FsRepository.class)); |
There was a problem hiding this comment.
I don't think we need to check the implementation class, instance should be enough.
|
|
||
| assertThat(repositoryMetaData2.type(), equalTo(diffType ? "mock" : FsRepository.TYPE)); | ||
|
|
||
| Repository repository2 = repositoriesService.repository(repositoryName); |
There was a problem hiding this comment.
Can you use more explicit name? (Also for getRepositoriesResponse1/2).
|
test this please |
tlrx
left a comment
There was a problem hiding this comment.
Another bunch of minor comments, sorry I didn't catch everything the first times.
|
|
||
| Client client = client(); | ||
| InternalTestCluster cluster = (InternalTestCluster) cluster(); | ||
| RepositoriesService repositoriesService = cluster.getInstance(RepositoriesService.class); |
There was a problem hiding this comment.
Can you make this final? Also, I think you should use getDataOrMasterNodeInstances as the repository is only registered on master eligible and data nodes. The method getInstance() retrieves the instance from a random node and if it's not a data or master one it will not find the repository.
| InternalTestCluster cluster = (InternalTestCluster) cluster(); | ||
| RepositoriesService repositoriesService = cluster.getInstance(RepositoriesService.class); | ||
| Settings settings = cluster.getDefaultSettings(); | ||
| Path location = randomRepoPath(); |
There was a problem hiding this comment.
If it's not used afterwards, maybe we don't need a ref to the location. We could simply use .put("location", randomRepoPath())
| .setSettings(repoSettings) | ||
| .get()); | ||
|
|
||
| GetRepositoriesResponse originalRetRepositoriesResponse = |
There was a problem hiding this comment.
Nit: typo in originalRetRepositoriesResponse
| } | ||
|
|
||
| public void testUpdateRepository() { | ||
| String repositoryName = "test-repo"; |
| // update repository | ||
|
|
||
| boolean updated = randomBoolean(); | ||
| String updatedRepositoryType = updated ? "mock" : FsRepository.TYPE; |
There was a problem hiding this comment.
updated and updatedRepositoryType can be final too
|
test this please |
1 similar comment
|
test this please |
tlrx
left a comment
There was a problem hiding this comment.
LGTM - I left a more comments that I'd like to be addressed before merging but I don't think that it will require another review
| cluster.getDataOrMasterNodeInstances(RepositoriesService.class).iterator().next(); | ||
| final Settings settings = cluster.getDefaultSettings(); | ||
|
|
||
| final Settings.Builder repoSettings = Settings.builder().put(settings).put("location", randomRepoPath()); |
There was a problem hiding this comment.
You don't need to pass the default cluster settings here but location is enough for a FS repository
| final Repository originalRepository = repositoriesService.repository(repositoryName); | ||
| assertThat(originalRepository, instanceOf(FsRepository.class)); | ||
|
|
||
| // update repository |
There was a problem hiding this comment.
I think you can remove this comment
| } | ||
|
|
||
| public void testUpdateRepository() throws Exception { | ||
| waitNoPendingTasksOnAll(); |
There was a problem hiding this comment.
Thinking about it twice, I don't think that this is necessary. I think you can remove it, run the test multiple times andsee if it fails or not.
|
thanks @tlrx for your comments |
* master: Add get field mappings to High Level REST API Client (#31423) [DOCS] Updates Watcher examples for code testing (#31152) TEST: Add bwc recovery tests with synced-flush index [DOCS] Move sql to docs (#31474) [DOCS] Move monitoring to docs folder (#31477) Core: Combine doExecute methods in TransportAction (#31517) IndexShard should not return null stats (#31528) fix repository update with the same settings but different type (#31458) Fix Mockito trying to mock IOException that isn't thrown by method (#31433) (#31527) Node selector per client rather than per request (#31471) Core: Combine messageRecieved methods in TransportRequestHandler (#31519) Upgrade to Lucene 7.4.0. (#31529) [ML] Add ML filter update API (#31437) Allow multiple unicast host providers (#31509) Avoid deprecation warning when running the ML datafeed extractor. (#31463) REST high-level client: add simulate pipeline API (#31158) Get Mapping API to honour allow_no_indices and ignore_unavailable (#31507) [PkiRealm] Invalidate cache on role mappings change (#31510) [Security] Check auth scheme case insensitively (#31490) In NumberFieldType equals and hashCode, make sure that NumberType is taken into account. (#31514) [DOCS] Fix REST tests in SQL docs [DOCS] Add code snippet testing in more ML APIs (#31339) Core: Remove ThreadPool from base TransportAction (#31492) [DOCS] Remove fixed file from build.gradle Rename createNewTranslog to fileBasedRecovery (#31508) Test: Skip assertion on windows [DOCS] Creates field and document level security overview (#30937) [DOCS] Significantly improve SQL docs [DOCS] Move migration APIs to docs (#31473) Core: Convert TransportAction.execute uses to client calls (#31487) Return transport addresses from UnicastHostsProvider (#31426) Ensure local addresses aren't null (#31440) Remove unused generic type for client execute method (#31444) Introduce http and tcp server channels (#31446)
* elastic/master: (92 commits) Reduce number of raw types warnings (elastic#31523) Migrate scripted metric aggregation scripts to ScriptContext design (elastic#30111) turn GetFieldMappingsResponse to ToXContentObject (elastic#31544) Close xcontent parsers (partial) (elastic#31513) Ingest Attachment: Upgrade Tika to 1.18 (elastic#31252) TEST: Correct the assertion arguments order (elastic#31540) Add get field mappings to High Level REST API Client (elastic#31423) [DOCS] Updates Watcher examples for code testing (elastic#31152) TEST: Add bwc recovery tests with synced-flush index [DOCS] Move sql to docs (elastic#31474) [DOCS] Move monitoring to docs folder (elastic#31477) Core: Combine doExecute methods in TransportAction (elastic#31517) IndexShard should not return null stats (elastic#31528) fix repository update with the same settings but different type (elastic#31458) Fix Mockito trying to mock IOException that isn't thrown by method (elastic#31433) (elastic#31527) Node selector per client rather than per request (elastic#31471) Core: Combine messageRecieved methods in TransportRequestHandler (elastic#31519) Upgrade to Lucene 7.4.0. (elastic#31529) [ML] Add ML filter update API (elastic#31437) Allow multiple unicast host providers (elastic#31509) ...
No description provided.