diff --git a/core/src/main/java/org/dcache/nfs/v4/NFS4Client.java b/core/src/main/java/org/dcache/nfs/v4/NFS4Client.java index 4c3fff304..94740d1c8 100644 --- a/core/src/main/java/org/dcache/nfs/v4/NFS4Client.java +++ b/core/src/main/java/org/dcache/nfs/v4/NFS4Client.java @@ -324,7 +324,14 @@ public NFS4State createState(StateOwner stateOwner, NFS4State openState) throws NFS4State state = new NFS4State(openState, stateOwner, _stateHandler.createStateId(this, _stateIdCounter.incrementAndGet())); if (openState != null) { - openState.addDisposeListener(s -> state.tryDispose()); + openState.addDisposeListener(s -> { + // remove and dispose derived states. + NFS4State nfsState = _clientStates.remove(state.stateid()); + if (nfsState != null) { + _log.debug("removing derived state {}", nfsState); + nfsState.tryDispose(); + } + }); } _clientStates.put(state.stateid(), state); return state; diff --git a/core/src/main/java/org/dcache/nfs/v4/NFS4State.java b/core/src/main/java/org/dcache/nfs/v4/NFS4State.java index a44d04a72..e70bc9566 100644 --- a/core/src/main/java/org/dcache/nfs/v4/NFS4State.java +++ b/core/src/main/java/org/dcache/nfs/v4/NFS4State.java @@ -19,6 +19,7 @@ */ package org.dcache.nfs.v4; +import com.google.common.base.MoreObjects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,4 +124,15 @@ public StateOwner getStateOwner() { synchronized public void addDisposeListener(StateDisposeListener disposeListener) { _disposeListeners.add(disposeListener); } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this.getClass().getSimpleName()) + .add("stateid", _stateid) + .add("open-stateid", _openState == null? null : _openState.stateid()) + .add("owner", _owner.getRawStateOwner()) + .add("confirmed", _isConfimed) + .omitNullValues() + .toString(); + } }