boolean () { if (!SystemProperties.getBooleanProperty(DO_SELF_HEAL_PROP, false)) { return false; } LOG.info("Trying to self-heal " + myFile); class DataWithOffset { final Data data; final int offset; DataWithOffset(Data data, int offset) { this.data = data; this.offset = offset; } } List<DataWithOffset> items = new ArrayList<>(); try { iterateData((offset, data) -> { items.add(new DataWithOffset(data, offset)); return true; }); lockStorageWrite(); try { myCollisionResolutionStorage.clear(); myKeyStorage.clear(); myCollisionResolutionStorage.ensureSize(4096); markDirty(true); putMetaData(0); putMetaData2(0); if (myBTree != null) { myBTree.doClose(); } setupEmptyFile(); doFlush(); } finally { unlockStorageWrite(); } for (DataWithOffset item : items) { int id = enumerate(item.data); int expectedId = item.offset + 1; if (expectedId != id) { throw new IOException("Enumeration order has been changed while self-healing, were " + expectedId + " now " + id); } } } catch (Throwable throwable) { LOG.info(throwable); return false; } return true; }