mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-10-23 11:22:21 +03:00
Cache IOU image default values per image path to avoid redundant subprocess calls
- Add class-level caches for loader and default RAM/NVRAM values - When multiple IOU nodes use the same image, only the first one runs the ld-linux --verify and iou-image -h subprocesses - Subsequent nodes reuse cached results, saving ~2 subprocess calls per node - Cache is populated only on successful subprocess execution to avoid overwriting explicitly set ram/nvram values with stale cached defaults
This commit is contained in:
parent
650f95af54
commit
650be3565f
@ -57,6 +57,12 @@ log = logging.getLogger(__name__)
|
|||||||
class IOUVM(BaseNode):
|
class IOUVM(BaseNode):
|
||||||
module_name = "iou"
|
module_name = "iou"
|
||||||
|
|
||||||
|
# Class-level caches shared across all IOU VM instances using the same image.
|
||||||
|
# These avoid redundant subprocess calls during project loading when multiple
|
||||||
|
# IOU nodes use the same image.
|
||||||
|
_loader_cache = {} # image path -> loader command list
|
||||||
|
_default_values_cache = {} # image path -> (ram, nvram)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
IOU VM implementation.
|
IOU VM implementation.
|
||||||
|
|
||||||
@ -180,8 +186,15 @@ class IOUVM(BaseNode):
|
|||||||
async def update_default_iou_values(self):
|
async def update_default_iou_values(self):
|
||||||
"""
|
"""
|
||||||
Finds the default RAM and NVRAM values for the IOU image.
|
Finds the default RAM and NVRAM values for the IOU image.
|
||||||
|
Results are cached per image path to avoid redundant subprocess calls
|
||||||
|
when multiple IOU nodes use the same image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Check class-level cache for default values
|
||||||
|
if self._path in IOUVM._default_values_cache:
|
||||||
|
self._ram, self._nvram = IOUVM._default_values_cache[self._path]
|
||||||
|
return
|
||||||
|
|
||||||
await self._check_requirements()
|
await self._check_requirements()
|
||||||
try:
|
try:
|
||||||
output = await gns3server.utils.asyncio.subprocess_check_output(
|
output = await gns3server.utils.asyncio.subprocess_check_output(
|
||||||
@ -193,6 +206,9 @@ class IOUVM(BaseNode):
|
|||||||
match = re.search(r"-m <n>\s+Megabytes of router memory \(default ([0-9]+)MB\)", output)
|
match = re.search(r"-m <n>\s+Megabytes of router memory \(default ([0-9]+)MB\)", output)
|
||||||
if match:
|
if match:
|
||||||
self.ram = int(match.group(1))
|
self.ram = int(match.group(1))
|
||||||
|
# Only cache on success, so a subsequent call with explicitly set
|
||||||
|
# ram/nvram values won't be overwritten by stale cached defaults
|
||||||
|
IOUVM._default_values_cache[self._path] = (self._ram, self._nvram)
|
||||||
except (ValueError, OSError, subprocess.SubprocessError) as e:
|
except (ValueError, OSError, subprocess.SubprocessError) as e:
|
||||||
log.warning(f"could not find default RAM and NVRAM values for {os.path.basename(self._path)}: {e}")
|
log.warning(f"could not find default RAM and NVRAM values for {os.path.basename(self._path)}: {e}")
|
||||||
|
|
||||||
@ -207,6 +223,13 @@ class IOUVM(BaseNode):
|
|||||||
|
|
||||||
if self._loader is not None:
|
if self._loader is not None:
|
||||||
return # image already checked
|
return # image already checked
|
||||||
|
|
||||||
|
# Check class-level cache: if another IOU VM already verified this image,
|
||||||
|
# reuse its loader configuration to avoid redundant subprocess calls.
|
||||||
|
if self._path in IOUVM._loader_cache:
|
||||||
|
self._loader = IOUVM._loader_cache[self._path]
|
||||||
|
return
|
||||||
|
|
||||||
if not self._path:
|
if not self._path:
|
||||||
raise IOUError("IOU image is not configured")
|
raise IOUError("IOU image is not configured")
|
||||||
if not os.path.isfile(self._path) or not os.path.exists(self._path):
|
if not os.path.isfile(self._path) or not os.path.exists(self._path):
|
||||||
@ -252,6 +275,9 @@ class IOUVM(BaseNode):
|
|||||||
except (OSError, subprocess.SubprocessError) as e:
|
except (OSError, subprocess.SubprocessError) as e:
|
||||||
log.warning(f"Could not use loader {loader}: {e}")
|
log.warning(f"Could not use loader {loader}: {e}")
|
||||||
|
|
||||||
|
# Cache the loader result for other IOU VMs using the same image
|
||||||
|
IOUVM._loader_cache[self._path] = self._loader
|
||||||
|
|
||||||
def asdict(self):
|
def asdict(self):
|
||||||
|
|
||||||
iou_vm_info = {
|
iou_vm_info = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user