From e637852df0a2563efe5df5548113376c7f3cf52f Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Mon, 7 Dec 2020 15:50:47 +0100 Subject: Potential solution for #67 It's a 0.025 second sleep waiting for the partition to pop up in partprobe. Also added a grace period of 10 seconds for that to occur. Otherwise we'll throw an exception since something most likely broke down. (Note here: Older drives, say 6200 RPM spin disks, might take a few seconds to come online. Have no such hardware to test with, but worth testing) --- archinstall/lib/disk.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'archinstall/lib/disk.py') diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py index f8680017..3f03e52c 100644 --- a/archinstall/lib/disk.py +++ b/archinstall/lib/disk.py @@ -1,4 +1,4 @@ -import glob, re, os, json +import glob, re, os, json, time # Time is only used to gracefully wait for new paritions to come online from collections import OrderedDict from .exceptions import DiskError from .general import * @@ -77,7 +77,7 @@ class BlockDevice(): #o = b''.join(sys_command('/usr/bin/lsblk -o name -J -b {dev}'.format(dev=dev))) o = b''.join(sys_command(f'/usr/bin/lsblk -J {self.path}')) - #print(self, 'partitions:', o) + if b'not a block device' in o: raise DiskError(f'Can not read partitions off something that isn\'t a block device: {self.path}') @@ -188,6 +188,9 @@ class Filesystem(): else: raise DiskError(f'Unknown mode selected to format in: {self.mode}') + def __repr__(self): + return f"Filesystem(blockdevice={self.blockdevice}, mode={self.mode})" + def __exit__(self, *args, **kwargs): # TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager if len(args) >= 2 and args[1]: @@ -221,17 +224,20 @@ class Filesystem(): def add_partition(self, type, start, end, format=None): log(f'Adding partition to {self.blockdevice}', level=LOG_LEVELS.Info, file=storage.get('logfile', None)) - print('Before:', self.blockdevice.partitions) + + previous_partitions = self.blockdevice.partitions if format: partitioning = self.parted(f'{self.blockdevice.device} mkpart {type} {format} {start} {end}') == 0 else: partitioning = self.parted(f'{self.blockdevice.device} mkpart {type} {start} {end}') == 0 - import time - time.sleep(5) - print('After:', print(self.blockdevice.partitions)) - if partitioning: + start_wait = time.time() + while previous_partitions == self.blockdevice.partitions: + time.sleep(0.025) # Let the new partition come up in the kernel + if time.time() - start_wait > 10: + raise DiskError(f"New partition never showed up after adding new partition on {self} (timeout 10 seconds).") + return True def set_name(self, partition:int, name:str): -- cgit v1.2.3-54-g00ecf