diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/stage/StagingManager.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/stage/StagingManager.java index 955700e3b5..0e0c3355ba 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/stage/StagingManager.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/stage/StagingManager.java @@ -91,26 +91,33 @@ public long clean(long ttlInMs) { long purgedMemSize = 0; for (String key : keys) { IStagedResource resource = resourceList.get(key); - boolean resourceIsOld = (System.currentTimeMillis() - resource.getLastUpdateTime()) > ttlInMs; - if ((resource.getState() == State.READY || resource.getState() == State.DONE) - && (resourceIsOld || !resource.exists())) { - if (!resource.isInUse()) { - boolean file = resource.isFileResource(); - long size = resource.getSize(); - if (resource.delete()) { - if (file) { - purgedFileCount++; - purgedFileSize += size; + /* resource could have deleted itself between the time the keys were cloned and now */ + if (resource != null) { + boolean resourceIsOld = (System.currentTimeMillis() - resource + .getLastUpdateTime()) > ttlInMs; + if ((resource.getState() == State.READY || resource.getState() == State.DONE) + && (resourceIsOld || !resource.exists())) { + if (!resource.isInUse()) { + boolean file = resource.isFileResource(); + long size = resource.getSize(); + if (resource.delete()) { + if (file) { + purgedFileCount++; + purgedFileSize += size; + } else { + purgedMemCount++; + purgedMemSize += size; + } + resourceList.remove(key); } else { - purgedMemCount++; - purgedMemSize += size; + log.warn("Failed to delete the '{}' staging resource", + resource.getPath()); } - resourceList.remove(key); } else { - log.warn("Failed to delete the '{}' staging resource", resource.getPath()); + log.info( + "The '{}' staging resource qualified for being cleaned, but was in use. It will not be cleaned right now", + resource.getPath()); } - } else { - log.info("The '{}' staging resource qualified for being cleaned, but was in use. It will not be cleaned right now", resource.getPath()); } } }