Skip to content

Commit 7b6ceea

Browse files
committed
<fix>[core,kvm]: fix SSH session leak in CallBackNetworkChecker and KVMHost
1. CallBackNetworkChecker.stopAnsible() creates Ssh object but never closes it, leaking JSch Session thread on every call. 2. KVMHost "check-host-is-taken-over" flow has the same pattern. When a host continuously fails reconnect (e.g. sharedblock VG error), each reconnect cycle leaks 1-2 SSH sessions. Over days this exhausts heap memory (18000+ threads observed) causing MN OOM and Unknown status. Fix: add finally { ssh.close() } to both code paths. Resolves: ZSTAC-83305 Resolves: ZSTAC-82731 Change-Id: I786e766e79776d6b7a75786d776278696c76666f
1 parent f15be32 commit 7b6ceea

2 files changed

Lines changed: 7 additions & 3 deletions

File tree

core/src/main/java/org/zstack/core/ansible/CallBackNetworkChecker.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ public ErrorCode stopAnsible() {
7272
return useNcatAndNmapToTestConnection(ssh);
7373
} catch (SshException e) {
7474
return operr(ORG_ZSTACK_CORE_ANSIBLE_10004, e.getMessage());
75+
} finally {
76+
ssh.close();
7577
}
7678
}
7779

plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5573,10 +5573,10 @@ public boolean skip(Map data) {
55735573

55745574
@Override
55755575
public void run(FlowTrigger trigger, Map data) {
5576+
Ssh ssh = new Ssh().setUsername(getSelf().getUsername())
5577+
.setPassword(getSelf().getPassword()).setPort(getSelf().getPort())
5578+
.setHostname(getSelf().getManagementIp());
55765579
try {
5577-
Ssh ssh = new Ssh().setUsername(getSelf().getUsername())
5578-
.setPassword(getSelf().getPassword()).setPort(getSelf().getPort())
5579-
.setHostname(getSelf().getManagementIp());
55805580
ssh.command(String.format("grep -i ^uuid %s | sed 's/uuid://g'", hostTakeOverFlagPath));
55815581
SshResult hostRet = ssh.run();
55825582
if (hostRet.isSshFailure() || hostRet.getReturnCode() != 0) {
@@ -5625,6 +5625,8 @@ public void run(FlowTrigger trigger, Map data) {
56255625
logger.warn(e.getMessage(), e);
56265626
trigger.next();
56275627
return;
5628+
} finally {
5629+
ssh.close();
56285630
}
56295631
}
56305632
});

0 commit comments

Comments
 (0)