-
Notifications
You must be signed in to change notification settings - Fork 588
HDDS-11408. Snapshot rename table entries are propagated incorrectly on snapshot deletes #7200
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
Conversation
…on snapshot deletes Change-Id: I79bcf24d6517bd740aae0c7cf9915146b34d0931
4ce3b36 to
0335ed2
Compare
hemantk-12
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @swamirishi for working on this.
I'm half done with the review and leaving some comments.
hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
| int currentCount = 0; | ||
| while (renamedKeyIter.hasNext() && currentCount < count) { | ||
| Table.KeyValue<String, String> kv = renamedKeyIter.next(); | ||
| if (kv != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can it be null? hasNext() should do this check?
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
Show resolved
Hide resolved
...ain/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java
Outdated
Show resolved
Hide resolved
...ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
Outdated
Show resolved
Hide resolved
...ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
Outdated
Show resolved
Hide resolved
Change-Id: Ib9e08a7bdf603a4a26e7631c7b5a978d89c32a5a
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java
Outdated
Show resolved
Hide resolved
Change-Id: Ifc9b97ffb05aa079bec5de9b08739c662d18c9ec
aswinshakil
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for working on the patch @swamirishi. I'm posting my comments halfway through the code, I have yet to review the core logic.
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManager.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java
Show resolved
Hide resolved
Change-Id: I7b5d16029296b45fe49709121b0608c37ccc634b
Change-Id: Id6ce92feed88029bfbea9fdcdb77e123d097519f
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
Outdated
Show resolved
Hide resolved
Change-Id: I501790e90bd6005dde625f286db3969dbf0c99aa
Change-Id: Idd1c12d2a457ff024f798df4833deeb9fb73f4eb
Change-Id: I4503a43edef21e0511e5d9517217ff7fd9ee6a0b
Change-Id: I746be2343c3aa075ae8470a2b58587bab6c72f89
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Outdated
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Outdated
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
Change-Id: I3353211ab7269cc4506489019a6c2992554da658
Change-Id: I485ed971c9f9cb2240cfc807ff29188c9ba90f7e
Change-Id: If9552a29f9a6b78ee828841b113d015f6f51199d
Change-Id: I7f76fdd5b7c8fc8b9477ff1cd96dd4eefdc47d20
Change-Id: I12c2ce8da14fd8d30c78953be06efd96429ed190
Change-Id: I43a67c1ae02d9a89391aa48dfec0238debb1c5c5
Change-Id: I0aa53260461fe306cb3b9c95fe0366d7764d6531
Change-Id: Iedfa1dbc2294ffcb486a941599a73bc0e35acf44
Change-Id: Iffea07415eea4c5a071264f66516b8f041cce290
Change-Id: I0fb68ee048e9b85ce412b10b8791ca4bfe74d3aa
Change-Id: Ia6efe2b4ef67e1b4bd847cd1a3301b3ffbe585d0
Change-Id: I9c7d92c66fad94166e6b5da5973a404e4fca1c58
| om.getKeyManager().getDeletedDirEntries(testBucket.getVolumeName(), | ||
| testBucket.getName(), 1000); | ||
| renamesKeyEntries.forEach(entry -> Assertions.assertTrue(aosRenamesKeyEntries.contains(entry))); | ||
| deletedKeyEntries.forEach(entry -> Assertions.assertTrue(aosDeletedKeyEntries.contains(entry))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we also assert that these keys are removed from the snapshot to be deleted ?
...tion-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingService.java
Show resolved
Hide resolved
| @Override | ||
| public boolean equals(Object obj) { | ||
| if (!(obj instanceof KeyValue)) { | ||
| return false; | ||
| } | ||
| KeyValue<?, ?> kv = (KeyValue<?, ?>) obj; | ||
| try { | ||
| return getKey().equals(kv.getKey()) && getValue().equals(kv.getValue()); | ||
| } catch (IOException e) { | ||
| throw new RuntimeException(e); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public int hashCode() { | ||
| return Objects.hash(getKey(), getValue()); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
qq: Is this for testing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yup
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@swamirishi , This seems incorrect. Filed HDDS-13235
BTW, testing code should reside in tests. Otherwise, it may introduce real bugs to production code.
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/Table.java
Outdated
Show resolved
Hide resolved
| * underlying metadataManager. | ||
| * @throws IOException | ||
| */ | ||
| List<Table.KeyValue<String, String>> getRenamesKeyEntries( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not asking to create another map. I'm saying the return type could be a map rather than a list of pairs.
| int currentCount = 0; | ||
| while (tableIterator.hasNext() && currentCount < count) { | ||
| Table.KeyValue<String, V> kv = tableIterator.next(); | ||
| if (kv != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, there is no harm but it isn't how an iterator is supposed to be used unless null is allowed value in the collection.
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
Show resolved
Hide resolved
| List<SnapshotMoveKeyInfos> deletedDirs = new ArrayList<>(moveTableKeysRequest.getDeletedDirsList().size()); | ||
| //validate deleted key starts with bucket FSO path prefix.[/<volId>/<bucketId>/] | ||
| for (SnapshotMoveKeyInfos deletedDir : moveTableKeysRequest.getDeletedDirsList()) { | ||
| // Filter deleted directories with exactly one keyInfo per key. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't it the same as line 120?
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Outdated
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Show resolved
Hide resolved
...rc/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveTableKeysRequest.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
.../ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
Outdated
Show resolved
Hide resolved
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java
Show resolved
Hide resolved
...ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotChain.java
Show resolved
Hide resolved
Change-Id: Ia56d8cd8c11ab74fd9f9076516d939bcc88f3559
hemantk-12
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, @swamirishi for finding this critical issue and fixing it.
LGTM+1.
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
Outdated
Show resolved
Hide resolved
Change-Id: Ia69b99aef696fa20f299670b1fdcc3f790ca8e19
|
Thank you for the reviews on the patch @aswinshakil @hemantk-12 @prashantpogde |
What changes were proposed in this pull request?
On snapshot deletes, not all rename table entries are propogated to the next snapshot. This could lead to an incorrect reclamation of blocks on certain edge case scenarios.
Snapshot deletion steps:
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-11408
How was this patch tested?
Adding unit tests