Skip to content

Commit

Permalink
feat: add config option for if the DOC should lock the file channel
Browse files Browse the repository at this point in the history
 - related to #2222
 - effectively just a workaround as most people would not need to worry about locking the clipboard file
  • Loading branch information
dordsor21 committed Dec 17, 2023
1 parent 17abaeb commit eaf0403
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,13 @@ public static class CLIPBOARD {
" - Requires clipboard.use-disk to be enabled"
})
public boolean SAVE_CLIPBOARD_NBT_TO_DISK = true;
@Comment({
"Apply a file lock on the clipboard file (only relevant if clipboad.on-disk is enabled)",
" - Prevents other processes using the file whilst in use by FAWE",
" - This extends to other servers, useful if you have multiple servers using a unified clipboard folder",
" - May run into issues where a file lock is not correctly lifted"
})
public boolean LOCK_CLIPBOARD_FILE = false;

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,22 +305,24 @@ public File getFile() {
private void init() throws IOException {
if (this.fileChannel == null) {
this.fileChannel = braf.getChannel();
try {
FileLock lock = this.fileChannel.lock();
LOCK_HOLDER_CACHE.put(file.getName(), new LockHolder(lock));
} catch (OverlappingFileLockException e) {
LockHolder existing = LOCK_HOLDER_CACHE.get(file.getName());
if (existing != null) {
long ms = System.currentTimeMillis() - existing.lockHeldSince;
LOGGER.error(
"Cannot lock clipboard file {} acquired by thread {}, {}ms ago",
file.getName(),
existing.thread,
ms
);
if (Settings.settings().CLIPBOARD.LOCK_CLIPBOARD_FILE) {
try {
FileLock lock = this.fileChannel.lock();
LOCK_HOLDER_CACHE.put(file.getName(), new LockHolder(lock));
} catch (OverlappingFileLockException e) {
LockHolder existing = LOCK_HOLDER_CACHE.get(file.getName());
if (existing != null) {
long ms = System.currentTimeMillis() - existing.lockHeldSince;
LOGGER.error(
"Cannot lock clipboard file {} acquired by thread {}, {}ms ago",
file.getName(),
existing.thread,
ms
);
}
// Rethrow to prevent clipboard access
throw e;
}
// Rethrow to prevent clipboard access
throw e;
}
this.byteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, braf.length());
}
Expand Down

0 comments on commit eaf0403

Please sign in to comment.