This is an automated email from the ASF dual-hosted git repository.

Caideyipi pushed a commit to branch patch-2094
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit e1cb738f22ade95051ac041dd061d53be1a2054b
Author: 罗振羽 <[email protected]>
AuthorDate: Tue May 12 03:12:41 2026 +0000

    [TIMECHODB]fix: reduce lock granularity in ScpRemoteFileTransfer to avoid 
deadlock-like blocking
    
    (cherry picked from commit d5c4fdfb976493c60a63cc9d4bb725619c01ea5a)
---
 .../plugin/sink/tsfile/ScpRemoteFileTransfer.java  | 24 ++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git 
a/library-pipe/tsfile-remote-sink/src/main/java/org/apache/iotdb/pipe/plugin/sink/tsfile/ScpRemoteFileTransfer.java
 
b/library-pipe/tsfile-remote-sink/src/main/java/org/apache/iotdb/pipe/plugin/sink/tsfile/ScpRemoteFileTransfer.java
index 1a27f026c87..87556ded0cd 100644
--- 
a/library-pipe/tsfile-remote-sink/src/main/java/org/apache/iotdb/pipe/plugin/sink/tsfile/ScpRemoteFileTransfer.java
+++ 
b/library-pipe/tsfile-remote-sink/src/main/java/org/apache/iotdb/pipe/plugin/sink/tsfile/ScpRemoteFileTransfer.java
@@ -213,8 +213,8 @@ class ScpRemoteFileTransfer implements RemoteFileTransfer {
   }
 
   @Override
-  public synchronized void transferFile(
-      File tsFile, File modFile, File objectSourceDir, String targetName) 
throws IOException {
+  public void transferFile(File tsFile, File modFile, File objectSourceDir, 
String targetName)
+      throws IOException {
     try {
       syncObjectDirectory(objectSourceDir, targetName);
       final String finalTsName = computeFinalTsName(targetName);
@@ -516,11 +516,15 @@ class ScpRemoteFileTransfer implements RemoteFileTransfer 
{
     }
   }
 
-  private synchronized SshClient getOrCreateClient() {
+  private SshClient getOrCreateClient() {
     if (client == null || !client.isStarted()) {
-      System.setProperty("org.apache.sshd.security.provider.BC.enabled", 
"false");
-      client = SshClient.setUpDefaultClient();
-      client.start();
+      synchronized (this) {
+        if (client == null || !client.isStarted()) {
+          System.setProperty("org.apache.sshd.security.provider.BC.enabled", 
"false");
+          client = SshClient.setUpDefaultClient();
+          client.start();
+        }
+      }
     }
     return client;
   }
@@ -535,7 +539,11 @@ class ScpRemoteFileTransfer implements RemoteFileTransfer {
 
   private synchronized ClientSession getSession() throws IOException {
     if (session == null || !session.isOpen()) {
-      session = createAuthenticatedSession();
+      synchronized (this) {
+        if (session == null || !session.isOpen()) {
+          session = createAuthenticatedSession();
+        }
+      }
     }
     return session;
   }
@@ -618,7 +626,7 @@ class ScpRemoteFileTransfer implements RemoteFileTransfer {
   }
 
   @Override
-  public synchronized void handshake() throws IOException {
+  public void handshake() throws IOException {
     try {
       ensureRemoteDirExists(getSession(), remoteBaseDir);
       LOGGER.info("SCP handshake OK, remote base: {}", remoteBaseDir);

Reply via email to