mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-09-02 11:22:41 +01:00
framework: Lock files which could be read/written to concurrently
Add file locking to files that could be read and written to concurrently by separate wa processes causing race conditions.
This commit is contained in:
@@ -32,6 +32,7 @@ from wa.framework.exception import WorkloadError, ConfigError
|
||||
from wa.utils.types import ParameterDict, list_or_string, version_tuple
|
||||
from wa.utils.revent import ReventRecorder
|
||||
from wa.utils.exec_control import once_per_instance
|
||||
from wa.utils.misc import lock_file
|
||||
|
||||
|
||||
class Workload(TargetedPlugin):
|
||||
@@ -731,31 +732,33 @@ class PackageHandler(object):
|
||||
raise WorkloadError(msg)
|
||||
|
||||
self.error_msg = None
|
||||
if self.prefer_host_package:
|
||||
self.resolve_package_from_host(context)
|
||||
if not self.apk_file:
|
||||
self.resolve_package_from_target()
|
||||
else:
|
||||
self.resolve_package_from_target()
|
||||
if not self.apk_file:
|
||||
with lock_file(os.path.join(self.owner.dependencies_directory, self.owner.name)):
|
||||
if self.prefer_host_package:
|
||||
self.resolve_package_from_host(context)
|
||||
|
||||
if self.apk_file:
|
||||
self.apk_info = ApkInfo(self.apk_file)
|
||||
else:
|
||||
if self.error_msg:
|
||||
raise WorkloadError(self.error_msg)
|
||||
if not self.apk_file:
|
||||
self.resolve_package_from_target()
|
||||
else:
|
||||
if self.package_name:
|
||||
message = 'Package "{package}" not found for workload {name} '\
|
||||
'on host or target.'
|
||||
elif self.version:
|
||||
message = 'No matching package found for workload {name} '\
|
||||
'(version {version}) on host or target.'
|
||||
self.resolve_package_from_target()
|
||||
if not self.apk_file:
|
||||
self.resolve_package_from_host(context)
|
||||
|
||||
if self.apk_file:
|
||||
with lock_file(self.apk_file):
|
||||
self.apk_info = ApkInfo(self.apk_file)
|
||||
else:
|
||||
if self.error_msg:
|
||||
raise WorkloadError(self.error_msg)
|
||||
else:
|
||||
message = 'No matching package found for workload {name} on host or target'
|
||||
raise WorkloadError(message.format(name=self.owner.name, version=self.version,
|
||||
package=self.package_name))
|
||||
if self.package_name:
|
||||
message = 'Package "{package}" not found for workload {name} '\
|
||||
'on host or target.'
|
||||
elif self.version:
|
||||
message = 'No matching package found for workload {name} '\
|
||||
'(version {version}) on host or target.'
|
||||
else:
|
||||
message = 'No matching package found for workload {name} on host or target'
|
||||
raise WorkloadError(message.format(name=self.owner.name, version=self.version,
|
||||
package=self.package_name))
|
||||
|
||||
def resolve_package_from_host(self, context):
|
||||
self.logger.debug('Resolving package on host system')
|
||||
@@ -898,8 +901,9 @@ class PackageHandler(object):
|
||||
package_info = self.target.get_package_info(package)
|
||||
apk_name = self._get_package_name(package_info.apk_path)
|
||||
host_path = os.path.join(self.owner.dependencies_directory, apk_name)
|
||||
self.target.pull(package_info.apk_path, host_path,
|
||||
timeout=self.install_timeout)
|
||||
with lock_file(host_path, timeout=self.install_timeout):
|
||||
self.target.pull(package_info.apk_path, host_path,
|
||||
timeout=self.install_timeout)
|
||||
return host_path
|
||||
|
||||
def teardown(self):
|
||||
|
Reference in New Issue
Block a user