diff --git a/Dockerfile b/Dockerfile index 02f0b7e..ff5734f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,9 @@ RUN apt-get update && \ ADD docker/iscsiadm /usr/local/sbin RUN chmod +x /usr/local/sbin/iscsiadm +ADD docker/multipath /usr/local/sbin +RUN chmod +x /usr/local/sbin/multipath + # Run as a non-root user RUN useradd --create-home csi \ && mkdir /home/csi/app \ diff --git a/docker/multipath b/docker/multipath new file mode 100644 index 0000000..0a95bc8 --- /dev/null +++ b/docker/multipath @@ -0,0 +1,3 @@ +#!/bin/bash + +chroot /host /usr/bin/env -i PATH="/sbin:/bin:/usr/sbin:/usr/bin" multipath "${@:1}" diff --git a/src/driver/index.js b/src/driver/index.js index 388bb57..a5ad8fa 100644 --- a/src/driver/index.js +++ b/src/driver/index.js @@ -395,6 +395,10 @@ class CsiBaseDriver { } } + // let things settle + // this will help in dm scenarios + await sleep(2000); + // filter duplicates iscsiDevices = iscsiDevices.filter((value, index, self) => { return self.indexOf(value) === index; @@ -936,6 +940,7 @@ class CsiBaseDriver { let is_block = false; let is_formatted; let fs_type; + let is_device_mapper = false; const volume_id = call.request.volume_id; const volume_path = call.request.volume_path; @@ -972,7 +977,24 @@ class CsiBaseDriver { } if (is_block) { - await filesystem.rescanDevice(device); + let rescan_devices = []; + // detect if is a multipath device + is_device_mapper = await filesystem.isDeviceMapperDevice(device); + if (is_device_mapper) { + // NOTE: want to make sure we scan the dm device *after* all the underlying slaves + rescan_devices = await filesystem.getDeviceMapperDeviceSlaves(device); + } + + rescan_devices.push(device); + + for (let sdevice of rescan_devices) { + await filesystem.rescanDevice(sdevice); + } + + // let things settle + // it appears the dm devices can take a second to figure things out + await sleep(2000); + if (is_formatted && access_type == "mount") { fs_info = await filesystem.getDeviceFilesystemInfo(device); fs_type = fs_info.type; diff --git a/src/utils/filesystem.js b/src/utils/filesystem.js index e7e84ef..7bb3684 100644 --- a/src/utils/filesystem.js +++ b/src/utils/filesystem.js @@ -415,12 +415,19 @@ class Filesystem { ); } + let is_device_mapper_device = await filesystem.isDeviceMapperDevice(device); result = await filesystem.realpath(device); - device_name = result.split("/").pop(); - // echo 1 > /sys/block/sdb/device/rescan - const sys_file = `/sys/block/${device_name}/device/rescan`; - fs.writeFileSync(sys_file, "1"); + if (is_device_mapper_device) { + // multipath -r /dev/dm-0 + result = await filesystem.exec("multipath", ["-r", device]); + } else { + device_name = result.split("/").pop(); + + // echo 1 > /sys/block/sdb/device/rescan + const sys_file = `/sys/block/${device_name}/device/rescan`; + fs.writeFileSync(sys_file, "1"); + } } /**