@Override public void handle(FdetPort.Dead event) { ArrayList<Long> removed = new ArrayList<Long>(); boolean popAfter = false; Iterator<Entry<Long, TaskPlaceholder.Direct>> i = res.workingQueue.running.entrySet().iterator(); while (i.hasNext()) { Entry<Long, TaskPlaceholder.Direct> e = i.next(); TaskPlaceholder.Direct tph = e.getValue(); if (tph.taskMaster.equals(event.ref)) { borrowers.claim(event.ref, tph.task.required); removed.add(e.getKey()); i.remove(); popAfter = true; } } Iterator<Entry<Long, Deferred>> j = waitingConfirmation.entrySet().iterator(); while (j.hasNext()) { Entry<Long, TaskPlaceholder.Deferred> e = j.next(); TaskPlaceholder.Deferred tph = e.getValue(); if (tph.taskMaster.equals(event.ref)) { borrowers.claim(event.ref, tph.required); removed.add(e.getKey()); j.remove(); } } assert borrowers.countCredits(event.ref) == 0; log.debug( getId() + ": {} DETECTED AS DEAD. RELEASED RESOURCES FOR {}", event.ref.getIp().getHostAddress(), removed); /* If we eliminated at least one running task, the pop() call will be skipped. * We need therefore to do it here. */ if (popAfter) pop(); }