diff options
| -rw-r--r-- | docker/ceph/ceph-osd/extend_start.sh | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/docker/ceph/ceph-osd/extend_start.sh b/docker/ceph/ceph-osd/extend_start.sh index 31c4a0ffb..5590afabd 100644 --- a/docker/ceph/ceph-osd/extend_start.sh +++ b/docker/ceph/ceph-osd/extend_start.sh @@ -7,6 +7,32 @@ if [[ $(stat -c %a /var/log/kolla/ceph) != "755" ]]; then chmod 755 /var/log/kolla/ceph fi +# Inform the os about partition table changes +function partprobe_device { + local device=$1 + udevadm settle --timeout=600 + flock -s ${device} partprobe ${device} + udevadm settle --timeout=600 +} + +# In some cases, the disk partition will not appear immediately, so check every +# 1s, try up to 10 times. In general, this interval is enough. +function wait_partition_appear { + local dev_part=$1 + local part_name=$(echo ${dev_part} | awk -F '/' '{print $NF}') + for(( i=1; i<11; i++ )); do + flag=$(ls /dev | awk '/'"${part_name}"'/{print $0}' | wc -l) + if [[ "${flag}" -eq 0 ]]; then + echo "sleep 1 waits for the partition ${dev_part} to appear: ${i}" + sleep 1 + else + return 0 + fi + done + echo "The device /dev/${dev_part} does not appear within the limited time 10s." + exit 1 +} + # Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases # of the KOLLA_BOOTSTRAP variable being set, including empty. if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then @@ -38,11 +64,13 @@ if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then sgdisk --zap-all -- "${OSD_BS_DEV}" sgdisk --new=1:0:+100M --mbrtogpt -- "${OSD_BS_DEV}" sgdisk --largest-new=2 --mbrtogpt -- "${OSD_BS_DEV}" - partprobe || true + partprobe_device "${OSD_BS_DEV}" if [[ "${OSD_BS_DEV}" =~ "/dev/loop" ]]; then + wait_partition_appear "${OSD_BS_DEV}"p2 sgdisk --zap-all -- "${OSD_BS_DEV}"p2 else + wait_partition_appear "${OSD_BS_DEV}"2 sgdisk --zap-all -- "${OSD_BS_DEV}"2 fi fi |
