aswinshakil commented on code in PR #5934:
URL: https://github.com/apache/ozone/pull/5934#discussion_r1444105668
##########
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java:
##########
@@ -304,30 +305,28 @@ private void cleanupInternal() {
OmSnapshot omSnapshot = (OmSnapshot) rcOmSnapshot.get();
LOG.debug("Evicting OmSnapshot instance {} with table key {}",
rcOmSnapshot, omSnapshot.getSnapshotTableKey());
- // Sanity check
- Preconditions.checkState(rcOmSnapshot.getTotalRefCount() == 0L,
- "Illegal state: OmSnapshot reference count non-zero ("
- + rcOmSnapshot.getTotalRefCount() + ") but shows up in the "
- + "clean up list");
final String key = omSnapshot.getSnapshotTableKey();
- final ReferenceCounted<IOmMetadataReader, SnapshotCache> result =
- dbMap.remove(key);
- // Sanity check
- Preconditions.checkState(rcOmSnapshot == result,
- "Cache map entry removal failure. The cache is in an inconsistent "
- + "state. Expected OmSnapshot instance: " + rcOmSnapshot
- + ", actual: " + result + " for key: " + key);
-
- pendingEvictionList.remove(result);
-
- // Close the instance, which also closes its DB handle.
- try {
- ((OmSnapshot) rcOmSnapshot.get()).close();
- } catch (IOException ex) {
- throw new IllegalStateException("Error while closing snapshot DB", ex);
- }
+ dbMap.computeIfPresent(key, (k, v) -> {
+ // Sanity check
+ Preconditions.checkState(rcOmSnapshot == v,
+ "Cache map entry removal failure. The cache is in an inconsistent "
+ + "state. Expected OmSnapshot instance: " + rcOmSnapshot
+ + ", actual: " + v + " for key: " + key);
+
+ // Close the instance, which also closes its DB handle.
+ if (rcOmSnapshot.getTotalRefCount() == 0L) {
+ try {
+ ((OmSnapshot) rcOmSnapshot.get()).close();
+ } catch (IOException ex) {
+ throw new IllegalStateException("Error while closing snapshot DB",
ex);
+ }
+ return null;
+ }
+ return v;
+ });
+ pendingEvictionList.remove(rcOmSnapshot);
Review Comment:
Yeah it should be fine if it is removed already. Here we have to `remove()`
the `rcOmSnapshot` instance from `pendingEvictionList` regardless if we close
the rocksdb or not. If it is still being referenced then we remove it from the
`pendingEvictionList` , if it is not being referenced then we close() the DB
instance and then `remove()`. Also the case that you mentioned if it is already
removed then it will be a no-op.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]