From 45acca32f7272c101d398831aff9f0b8b03d8002 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 15 Feb 2022 19:35:04 -0800 Subject: [PATCH] fix connection deadlock, speed up reconnect (#3936) --- .../autotest/src/main/java/com/rusefi/IoUtil.java | 6 ++++-- java_console/io/src/main/java/com/rusefi/Timeouts.java | 2 +- .../io/src/main/java/com/rusefi/io/LinkManager.java | 7 ++----- .../com/rusefi/binaryprotocol/test/SerialSandbox.java | 8 ++++++-- java_console/ui/src/main/java/com/rusefi/ConsoleUI.java | 8 -------- .../ui/src/main/java/com/rusefi/ui/console/MainFrame.java | 7 +++++++ 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/java_console/autotest/src/main/java/com/rusefi/IoUtil.java b/java_console/autotest/src/main/java/com/rusefi/IoUtil.java index b283893c68..11a5109b4e 100644 --- a/java_console/autotest/src/main/java/com/rusefi/IoUtil.java +++ b/java_console/autotest/src/main/java/com/rusefi/IoUtil.java @@ -160,8 +160,10 @@ public class IoUtil { linkManager.getEngineState().registerStringValueAction(Fields.PROTOCOL_OUTPIN, (EngineState.ValueCallback) EngineState.ValueCallback.VOID); linkManager.getEngineState().registerStringValueAction(AverageAnglesUtil.KEY, (EngineState.ValueCallback) EngineState.ValueCallback.VOID); - CountDownLatch connected = linkManager.connect(port); - if (connected.getCount() > 0) + try { + linkManager.connect(port).await(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { throw new IllegalStateException("Not connected in time"); + } } } diff --git a/java_console/io/src/main/java/com/rusefi/Timeouts.java b/java_console/io/src/main/java/com/rusefi/Timeouts.java index 0ea6bfe7c0..511fc400ca 100644 --- a/java_console/io/src/main/java/com/rusefi/Timeouts.java +++ b/java_console/io/src/main/java/com/rusefi/Timeouts.java @@ -14,7 +14,7 @@ public interface Timeouts { int BINARY_IO_TIMEOUT = 5 * SECOND; int READ_IMAGE_TIMEOUT = 60 * SECOND; - int CONNECTION_RESTART_DELAY = BINARY_IO_TIMEOUT; + int CONNECTION_RESTART_DELAY = 1 * SECOND; int CMD_TIMEOUT = 20 * SECOND; int SET_ENGINE_TIMEOUT = 60 * SECOND; diff --git a/java_console/io/src/main/java/com/rusefi/io/LinkManager.java b/java_console/io/src/main/java/com/rusefi/io/LinkManager.java index 86f17668e9..35656435bb 100644 --- a/java_console/io/src/main/java/com/rusefi/io/LinkManager.java +++ b/java_console/io/src/main/java/com/rusefi/io/LinkManager.java @@ -89,6 +89,7 @@ public class LinkManager implements Closeable { @NotNull public CountDownLatch connect(String port) { final CountDownLatch connected = new CountDownLatch(1); + startAndConnect(port, new ConnectionStateListener() { @Override public void onConnectionFailed() { @@ -101,11 +102,7 @@ public class LinkManager implements Closeable { connected.countDown(); } }); - try { - connected.await(60, TimeUnit.SECONDS); - } catch (InterruptedException e) { - throw new IllegalStateException(e); - } + return connected; } diff --git a/java_console/io/src/test/java/com/rusefi/binaryprotocol/test/SerialSandbox.java b/java_console/io/src/test/java/com/rusefi/binaryprotocol/test/SerialSandbox.java index d33a4f210f..7d838e91b1 100644 --- a/java_console/io/src/test/java/com/rusefi/binaryprotocol/test/SerialSandbox.java +++ b/java_console/io/src/test/java/com/rusefi/binaryprotocol/test/SerialSandbox.java @@ -7,6 +7,7 @@ import com.rusefi.io.LinkManager; import java.util.Date; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; public class SerialSandbox { public static void main(String[] args) { @@ -25,8 +26,11 @@ public class SerialSandbox { LinkManager linkManager = new LinkManager() .setNeedPullText(textPull) // todo: open issue #2 .setNeedPullLiveData(true); - CountDownLatch connected = linkManager.connect(port); - if (connected.getCount() > 0) + + try { + linkManager.connect(port).await(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { throw new IllegalStateException("Not connected in time"); + } } } diff --git a/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java b/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java index 662b71f05f..2122059bff 100644 --- a/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java +++ b/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java @@ -91,14 +91,6 @@ public class ConsoleUI { if (LinkManager.isLogViewerMode(port)) tabbedPane.addTab("Log Viewer", new LogViewer(uiContext, engineSnifferPanel)); - // TODO: this is a race if the ECU is slow to connect - new ConnectionWatchdog(Timeouts.CONNECTION_RESTART_DELAY, () -> { - uiContext.getLinkManager().execute(() -> { - log.info("ConnectionWatchdog.reconnectTimer restarting: " + Timeouts.CONNECTION_RESTART_DELAY); - linkManager.restart(); - }); - }).start(); - uiContext.DetachedRepositoryINSTANCE.init(getConfig().getRoot().getChild("detached")); uiContext.DetachedRepositoryINSTANCE.load(); if (!linkManager.isLogViewer()) diff --git a/java_console/ui/src/main/java/com/rusefi/ui/console/MainFrame.java b/java_console/ui/src/main/java/com/rusefi/ui/console/MainFrame.java index 065489dddc..1b481841df 100644 --- a/java_console/ui/src/main/java/com/rusefi/ui/console/MainFrame.java +++ b/java_console/ui/src/main/java/com/rusefi/ui/console/MainFrame.java @@ -84,6 +84,13 @@ public class MainFrame { @Override public void onConnectionEstablished() { + new ConnectionWatchdog(Timeouts.CONNECTION_RESTART_DELAY, () -> { + linkManager.execute(() -> { + log.info("ConnectionWatchdog.reconnectTimer restarting: " + Timeouts.CONNECTION_RESTART_DELAY); + linkManager.restart(); + }); + }).start(); + tabbedPane.settingsTab.showContent(); tabbedPane.logsManager.showContent(); tabbedPane.fuelTunePane.showContent();