In ProcessorStateManager in the lockStateDirectory method, we close a channel if the lock is null. However, as described in https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html, "...closing a channel releases all locks held by the Java virtual machine on the underlying file regardless of whether the locks were acquired via that channel or via another channel open on the same file. It is strongly recommended that, within a program, a unique channel be used to acquire all locks on any given file.". Thus closing this channel sometimes leads to the other lock in ProcessorStateManager, called directoryLock to be released.
Problem is reproduced as part of the steps in
KAFKA-3805, when two processes are using the same state directory.