Skip to content

Commit

Permalink
Potential solution for archlinux#67
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
Torxed committed Dec 7, 2020
1 parent 1aef980 commit e637852
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions 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 *
Expand Down Expand Up @@ -77,7 +77,7 @@ def partitions(self):

#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}')

Expand Down Expand Up @@ -188,6 +188,9 @@ def __enter__(self, *args, **kwargs):
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]:
Expand Down Expand Up @@ -221,17 +224,20 @@ def use_entire_disk(self, prep_mode=None):

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):
Expand Down

0 comments on commit e637852

Please sign in to comment.