From 96ec6624c5cc395b18d1cd0ea77a368e7c496b1e Mon Sep 17 00:00:00 2001 From: AntonKun Date: Mon, 22 Sep 2025 16:28:00 +0300 Subject: [PATCH] Updated the JSON-RPC handler on a file lock overlap --- .../jsonrpc/SignalJsonRpcCommandHandler.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java index 48eb4a45..2ab050e3 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java @@ -129,13 +129,32 @@ public class SignalJsonRpcCommandHandler { private RegistrationManager getRegistrationManagerFromParams(final ContainerNode params) { if (params != null && params.has("account")) { + final var number = params.get("account").asText(); try { - final var registrationManager = c.getNewRegistrationManager(params.get("account").asText()); + final var registrationManager = c.getNewRegistrationManager(number); ((ObjectNode) params).remove("account"); return registrationManager; } catch (OverlappingFileLockException e) { - logger.warn("Account is already in use"); - return null; + logger.warn("Account is already in use, attempting to close existing manager and retry: {}", number); + try { + final var existingManager = c.getManager(number); + if (existingManager != null) { + existingManager.close(); + } + } catch (Throwable closeError) { + logger.warn("Failed to close existing manager for {}: {}", number, closeError.getMessage()); + } + try { + final var registrationManager = c.getNewRegistrationManager(number); + ((ObjectNode) params).remove("account"); + return registrationManager; + } catch (OverlappingFileLockException e2) { + logger.warn("Account still in use after closing manager: {}", number); + return null; + } catch (IOException | IllegalStateException e2) { + logger.warn("Failed to load registration manager after retry", e2); + return null; + } } catch (IOException | IllegalStateException e) { logger.warn("Failed to load registration manager", e); return null;