Skip to content

Commit b82d399

Browse files
Gupta, SuryaGupta, Surya
authored andcommitted
CSTACKEX-16 Fix Copy Issues in KVM for managed storage
1 parent 3065e5c commit b82d399

File tree

2 files changed

+52
-22
lines changed

2 files changed

+52
-22
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,38 +1131,68 @@ private Answer backupSnapshotFromManagedStorage(final CopyCommand cmd) {
11311131
}
11321132

11331133
/**
1134-
* Rescans an existing iSCSI session to discover newly mapped LUNs.
1135-
* If no session exists yet, performs a login first.
1134+
* Ensures an iSCSI session is active and rescanned so that the target LUN is visible.
1135+
* Handles three scenarios:
1136+
* 1. Session already exists → rescan to discover newly mapped LUNs
1137+
* 2. Node record exists but no session → login, then rescan
1138+
* 3. No node record at all → discover target, create node record, login
11361139
*/
11371140
private void rescanIscsiSession(String iqn, String host, String port) {
1138-
// First try to rescan the existing session
1141+
// Step 1: Try rescan — works if session already exists
11391142
Script rescanCmd = new Script(true, "iscsiadm", 0, logger);
11401143
rescanCmd.add("-m", "node");
11411144
rescanCmd.add("-T", iqn);
11421145
rescanCmd.add("-p", host + ":" + port);
11431146
rescanCmd.add("--rescan");
11441147

11451148
String result = rescanCmd.execute();
1149+
if (result == null) {
1150+
logger.info("rescanIscsiSession: Successfully rescanned existing session for {}@{}:{}", iqn, host, port);
1151+
return;
1152+
}
1153+
1154+
logger.info("rescanIscsiSession: Rescan failed ({}), attempting full connect for {}@{}:{}", result, iqn, host, port);
1155+
1156+
// Step 2: Create node record (iscsiadm -m node -T <iqn> -p <host>:<port> -o new)
1157+
// This is required before login can succeed.
1158+
Script nodeCreateCmd = new Script(true, "iscsiadm", 0, logger);
1159+
nodeCreateCmd.add("-m", "node");
1160+
nodeCreateCmd.add("-T", iqn);
1161+
nodeCreateCmd.add("-p", host + ":" + port);
1162+
nodeCreateCmd.add("-o", "new");
1163+
result = nodeCreateCmd.execute();
1164+
if (result != null) {
1165+
// "already exists" is fine
1166+
logger.info("rescanIscsiSession: Node create result for {}@{}:{}: {}", iqn, host, port, result);
1167+
} else {
1168+
logger.info("rescanIscsiSession: Node record created for {}@{}:{}", iqn, host, port);
1169+
}
1170+
1171+
// Step 3: Login
1172+
Script loginCmd = new Script(true, "iscsiadm", 0, logger);
1173+
loginCmd.add("-m", "node");
1174+
loginCmd.add("-T", iqn);
1175+
loginCmd.add("-p", host + ":" + port);
1176+
loginCmd.add("--login");
1177+
result = loginCmd.execute();
1178+
if (result != null) {
1179+
// "already present" is fine
1180+
logger.info("rescanIscsiSession: Login result for {}@{}:{}: {}", iqn, host, port, result);
1181+
} else {
1182+
logger.info("rescanIscsiSession: Successfully logged in to {}@{}:{}", iqn, host, port);
1183+
}
1184+
1185+
// Step 4: Rescan again to discover newly mapped LUNs
1186+
rescanCmd = new Script(true, "iscsiadm", 0, logger);
1187+
rescanCmd.add("-m", "node");
1188+
rescanCmd.add("-T", iqn);
1189+
rescanCmd.add("-p", host + ":" + port);
1190+
rescanCmd.add("--rescan");
1191+
result = rescanCmd.execute();
11461192
if (result != null) {
1147-
// Rescan failed — session may not exist. Try login first, then rescan.
1148-
logger.info("rescanIscsiSession: Rescan failed ({}), attempting login + rescan for {}@{}:{}", result, iqn, host, port);
1149-
1150-
Script loginCmd = new Script(true, "iscsiadm", 0, logger);
1151-
loginCmd.add("-m", "node");
1152-
loginCmd.add("-T", iqn);
1153-
loginCmd.add("-p", host + ":" + port);
1154-
loginCmd.add("--login");
1155-
loginCmd.execute(); // ignore result — may say "already present"
1156-
1157-
// Retry rescan after login
1158-
rescanCmd = new Script(true, "iscsiadm", 0, logger);
1159-
rescanCmd.add("-m", "node");
1160-
rescanCmd.add("-T", iqn);
1161-
rescanCmd.add("-p", host + ":" + port);
1162-
rescanCmd.add("--rescan");
1163-
rescanCmd.execute(); // best effort
1193+
logger.warn("rescanIscsiSession: Post-login rescan failed for {}@{}:{}: {}", iqn, host, port, result);
11641194
} else {
1165-
logger.info("rescanIscsiSession: Successfully rescanned session for {}@{}:{}", iqn, host, port);
1195+
logger.info("rescanIscsiSession: Post-login rescan succeeded for {}@{}:{}", iqn, host, port);
11661196
}
11671197
}
11681198

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/driver/OntapPrimaryDatastoreDriver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ private void createTempVolume(SnapshotInfo snapshotInfo, long storagePoolId) {
234234
s_logger.info("createTempVolume: 'delete' signal — cleaning up cloned LUN and snapshot details for snapshot [{}]",
235235
snapshotInfo.getSnapshotId());
236236

237-
//deleteSnapshotClone(snapshotInfo, snapshotInfo.getDataStore());
237+
deleteSnapshotClone(snapshotInfo, snapshotInfo.getDataStore());
238238

239239
// Remove ONTAP-specific details that were stored during takeSnapshot()
240240
removeSnapshotDetailIfPresent(snapshotInfo.getSnapshotId(), Constants.SRC_CS_VOLUME_ID);

0 commit comments

Comments
 (0)