swamirishi commented on code in PR #5934:
URL: https://github.com/apache/ozone/pull/5934#discussion_r1446502413
##########
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java:
##########
@@ -304,30 +305,35 @@ 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);
+ dbMap.compute(key, (k, v) -> {
+ if (v == null) {
+ throw new IllegalStateException("Key '" + k + "' does not exist in
cache. The RocksDB " +
+ "instance of the Snapshot may not be closed properly.");
+ }
- // 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);
- }
+ // 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) {
Review Comment:
This particular check is not exactly thread safe there would still be a race
condition, this doesn't really take a ref count lock. We should probably put
this function check inside ReferenceCounted class which would take a ref count
lock when doing the check. Some function like
`boolean isTotalRefCountEqual(long expectedValue)` which would return if the
value is equal
##########
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java:
##########
@@ -304,30 +305,35 @@ 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);
+ dbMap.compute(key, (k, v) -> {
+ if (v == null) {
+ throw new IllegalStateException("Key '" + k + "' does not exist in
cache. The RocksDB " +
+ "instance of the Snapshot may not be closed properly.");
+ }
- // 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);
- }
+ // 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) {
Review Comment:
GetKey increaments the ref count after the dbMap.compute() function so the
lock is already out of scope. I don't see any change in the get function so
this should be the way going forward for the cleanup.
--
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]