Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib/disk.py
diff options
context:
space:
mode:
authorAnton Hvornum <anton.feeds+github@gmail.com>2020-12-07 15:50:47 +0100
committerAnton Hvornum <anton.feeds+github@gmail.com>2020-12-07 15:50:47 +0100
commite637852df0a2563efe5df5548113376c7f3cf52f (patch)
tree1558894cffbf5444fe3aac0103b98ce9cea27032 /archinstall/lib/disk.py
parent1aef9807f95d7a51cf1de80f169b40bb7afb7731 (diff)
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)
Diffstat (limited to 'archinstall/lib/disk.py')
-rw-r--r--archinstall/lib/disk.py20
1 files changed, 13 insertions, 7 deletions
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):