swamirishi commented on code in PR #5934:
URL: https://github.com/apache/ozone/pull/5934#discussion_r1446573735
##########
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:
I guess separating out the referenceCounted and cacheLoader is not the right
way to implement the cache. From what I know this has go hand in hand in a
single lock. Increasing the reference count or decreasing the reference count
or when evicting an instance from the cache which would check if there are any
references. BTW even decrementRefCount has this problem. decrement is called
with referenceCountLock, and it checks if the reference count is zero and adds
it to the pending eviction list which checks the count is 0. But in case of a
race condition a get call could have a closed rocksdb instance, cleaner thread
could have closed the instance in the background.
--
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]