diff --git a/src/main/java/org/elasticsearch/index/engine/internal/LiveVersionMap.java b/src/main/java/org/elasticsearch/index/engine/internal/LiveVersionMap.java index c4bc95f0dc5..29dc863db03 100644 --- a/src/main/java/org/elasticsearch/index/engine/internal/LiveVersionMap.java +++ b/src/main/java/org/elasticsearch/index/engine/internal/LiveVersionMap.java @@ -187,7 +187,7 @@ class LiveVersionMap implements ReferenceManager.RefreshListener, Accountable { // Deduct tombstones bytes used for the version we just removed or replaced: if (prevTombstone != null) { long v = ramBytesUsedTombstones.addAndGet(-(BASE_BYTES_PER_CHM_ENTRY + prevTombstone.ramBytesUsed() + uidRAMBytesUsed)); - assert v >= 0; + assert v >= 0: "bytes=" + v; } } @@ -200,7 +200,7 @@ class LiveVersionMap implements ReferenceManager.RefreshListener, Accountable { if (prev != null) { assert prev.delete(); long v = ramBytesUsedTombstones.addAndGet(-(BASE_BYTES_PER_CHM_ENTRY + prev.ramBytesUsed() + uidRAMBytesUsed)); - assert v >= 0; + assert v >= 0: "bytes=" + v; } final VersionValue curVersion = maps.current.get(uid); if (curVersion != null && curVersion.delete()) { @@ -226,7 +226,12 @@ class LiveVersionMap implements ReferenceManager.RefreshListener, Accountable { maps = new Maps(); tombstones.clear(); ramBytesUsedCurrent.set(0); - ramBytesUsedTombstones.set(0); + + // NOTE: we can't zero this here, because a refresh thread could be calling InternalEngine.pruneDeletedTombstones at the same time, + // and this will lead to an assert trip. Presumably it's fine if our ramBytesUsedTombstones is non-zero after clear since the index + // is being closed: + //ramBytesUsedTombstones.set(0); + if (mgr != null) { mgr.removeListener(this); mgr = null;