To explain a bit why this worked: free() only overwrites the key length on disk, but the FileEntry in memory remains untouched. The only operation that did need to wait for the readers to finish was clear(), because it truncated the file, so it wasn't possible for readers to finish reading their values after a clear.

With your changes, truncateFile() and mergeFreeEntries() both skip locked entries, so I would expect things to keep working without the `waitUnlocked()` call here.