Solves issue #689. Attribute Error.'None type' has no attribute 'format' ...
It seems the system does not syncronus update its internal information after a partitioning. Two places are affected. Directly on filesystem.add_partition (the uuid of the new partition isn't available after the parted command) and blockdevice.get_partition, where the list of partitions for the iterator might not be available in the query. The patch places both sections under controlled loops, giving the system the chance to update the information. Should be more controlled via application parameters
This commit is contained in:
parent
b7fcbf13bc
commit
671c7b3854
|
|
@ -1,9 +1,11 @@
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import time
|
||||||
from ..exceptions import DiskError
|
from ..exceptions import DiskError
|
||||||
from ..output import log
|
from ..output import log
|
||||||
from ..general import SysCommand
|
from ..general import SysCommand
|
||||||
|
from ..storage import storage
|
||||||
|
|
||||||
GIGA = 2 ** 30
|
GIGA = 2 ** 30
|
||||||
|
|
||||||
|
|
@ -213,6 +215,15 @@ class BlockDevice:
|
||||||
self.part_cache = {}
|
self.part_cache = {}
|
||||||
|
|
||||||
def get_partition(self, uuid):
|
def get_partition(self, uuid):
|
||||||
for partition in self:
|
count = 0
|
||||||
if partition.uuid == uuid:
|
while count < 5:
|
||||||
return partition
|
for partition in self:
|
||||||
|
if partition.uuid == uuid:
|
||||||
|
return partition
|
||||||
|
else:
|
||||||
|
log(f"uuid {uuid} not found. Waiting for {count +1} time",level=logging.DEBUG)
|
||||||
|
time.sleep(float(storage['arguments'].get('disk-sleep', 0.2)))
|
||||||
|
count +=1
|
||||||
|
else:
|
||||||
|
log(f"Could not find {uuid} in disk after 5 retries",level=logging.INFO)
|
||||||
|
raise DiskError(f"New partition {uuid} never showed up after adding new partition on {self}")
|
||||||
|
|
|
||||||
|
|
@ -167,17 +167,21 @@ class Filesystem:
|
||||||
parted_string = f'{self.blockdevice.device} mkpart {partition_type} {start} {end}'
|
parted_string = f'{self.blockdevice.device} mkpart {partition_type} {start} {end}'
|
||||||
|
|
||||||
if self.parted(parted_string):
|
if self.parted(parted_string):
|
||||||
start_wait = time.time()
|
count = 0
|
||||||
|
while count < 10:
|
||||||
while previous_partition_uuids == {partition.uuid for partition in self.blockdevice.partitions.values()}:
|
new_uuid = None
|
||||||
if time.time() - start_wait > 10:
|
new_uuid_set = (previous_partition_uuids ^ {partition.uuid for partition in self.blockdevice.partitions.values()})
|
||||||
raise DiskError(f"New partition never showed up after adding new partition on {self} (timeout 10 seconds).")
|
if len(new_uuid_set) > 0:
|
||||||
time.sleep(0.025)
|
new_uuid = new_uuid_set.pop()
|
||||||
|
if new_uuid:
|
||||||
# Todo: Find a better way to detect if the new UUID of the partition has showed up.
|
return self.blockdevice.get_partition(new_uuid)
|
||||||
# But this will address (among other issues)
|
else:
|
||||||
time.sleep(float(storage['arguments'].get('disk-sleep', 2.0))) # Let the kernel catch up with quick block devices (nvme for instance)
|
count += 1
|
||||||
return self.blockdevice.get_partition(uuid=(previous_partition_uuids ^ {partition.uuid for partition in self.blockdevice.partitions.values()}).pop())
|
log(f"Could not get uuid for partition. Waiting for the {count} time",level=logging.DEBUG)
|
||||||
|
time.sleep(float(storage['arguments'].get('disk-sleep', 0.2)))
|
||||||
|
else:
|
||||||
|
log("Add partition exiting due to excesive wait time",level=logging.INFO)
|
||||||
|
raise DiskError(f"New partition never showed up after adding new partition on {self}.")
|
||||||
|
|
||||||
def set_name(self, partition: int, name: str):
|
def set_name(self, partition: int, name: str):
|
||||||
return self.parted(f'{self.blockdevice.device} name {partition + 1} "{name}"') == 0
|
return self.parted(f'{self.blockdevice.device} name {partition + 1} "{name}"') == 0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue