Use ContainerRegistry.lockFile in Cura package management

Prevent concurrent I/O issues.
This commit is contained in:
Lipu Fei 2018-05-01 10:31:54 +02:00
parent cff4dc8a0c
commit 1fb2edace5

View file

@ -48,23 +48,29 @@ class CuraPackageManager(QObject):
Logger.log("i", "Package management file %s doesn't exist, do nothing", self._package_management_file_path) Logger.log("i", "Package management file %s doesn't exist, do nothing", self._package_management_file_path)
return return
with open(self._package_management_file_path, "r", encoding = "utf-8") as f: # Need to use the file lock here to prevent concurrent I/O from other processes/threads
management_dict = json.load(f, encoding = "utf-8") container_registry = self._application.getContainerRegistry()
with container_registry.lockFile():
with open(self._package_management_file_path, "r", encoding = "utf-8") as f:
management_dict = json.load(f, encoding = "utf-8")
self._installed_package_dict = management_dict["installed"] self._installed_package_dict = management_dict["installed"]
self._to_remove_package_set = set(management_dict["to_remove"]) self._to_remove_package_set = set(management_dict["to_remove"])
self._to_install_package_dict = management_dict["to_install"] self._to_install_package_dict = management_dict["to_install"]
Logger.log("i", "Package management file %s is loaded", self._package_management_file_path) Logger.log("i", "Package management file %s is loaded", self._package_management_file_path)
def _saveManagementData(self) -> None: def _saveManagementData(self) -> None:
with open(self._package_management_file_path, "w", encoding = "utf-8") as f: # Need to use the file lock here to prevent concurrent I/O from other processes/threads
data_dict = {"installed": self._installed_package_dict, container_registry = self._application.getContainerRegistry()
"to_remove": list(self._to_remove_package_set), with container_registry.lockFile():
"to_install": self._to_install_package_dict} with open(self._package_management_file_path, "w", encoding = "utf-8") as f:
data_dict["to_remove"] = list(data_dict["to_remove"]) data_dict = {"installed": self._installed_package_dict,
json.dump(data_dict, f) "to_remove": list(self._to_remove_package_set),
Logger.log("i", "Package management file %s is saved", self._package_management_file_path) "to_install": self._to_install_package_dict}
data_dict["to_remove"] = list(data_dict["to_remove"])
json.dump(data_dict, f)
Logger.log("i", "Package management file %s is saved", self._package_management_file_path)
# (for initialize) Removes all packages that have been scheduled to be removed. # (for initialize) Removes all packages that have been scheduled to be removed.
def _removeAllScheduledPackages(self) -> None: def _removeAllScheduledPackages(self) -> None: