diff options
author | Devendra Tewari <devendra.tewari@gmail.com> | 2021-04-19 11:23:58 -0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-04-23 10:12:12 +0100 |
commit | 8d48138e9b1f3577cfba64b4757b576c27c6ef04 (patch) | |
tree | 9c67de3630ffde438b70e92cf6864103233bc149 /meta/lib/oe/package_manager | |
parent | f2d1523b19cb066a4a06609f036822fe4a8b43f0 (diff) | |
download | openembedded-core-contrib-8d48138e9b1f3577cfba64b4757b576c27c6ef04.tar.gz |
classes/lib/scripts: Use shutil.move when os.rename fails
Incremental build in Docker fails with:
OSError: [Errno 18] Invalid cross-device link
when source and destination are on different overlay filesystems.
This change handles error with os.rename and retries with shutil.move.
The reason os.rename is still used is because shutil.move is too slow
for speed sensitive sections of code.
[YOCTO #14301]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe/package_manager')
-rw-r--r-- | meta/lib/oe/package_manager/deb/__init__.py | 18 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/ipk/__init__.py | 5 |
2 files changed, 19 insertions, 4 deletions
diff --git a/meta/lib/oe/package_manager/deb/__init__.py b/meta/lib/oe/package_manager/deb/__init__.py index 2ee68fefb1..8edc653dff 100644 --- a/meta/lib/oe/package_manager/deb/__init__.py +++ b/meta/lib/oe/package_manager/deb/__init__.py @@ -5,6 +5,7 @@ import re import subprocess from oe.package_manager import * +import shutil class DpkgIndexer(Indexer): def _create_configs(self): @@ -214,7 +215,10 @@ class DpkgPM(OpkgDpkgPM): tmp_sf.write(status) - os.rename(status_file + ".tmp", status_file) + try: + os.rename(status_file + ".tmp", status_file) + except OSError: + shutil.move(status_file + ".tmp", status_file) def run_pre_post_installs(self, package_name=None): """ @@ -299,13 +303,21 @@ class DpkgPM(OpkgDpkgPM): for dir in dirs: new_dir = re.sub(r"\.dpkg-new", "", dir) if dir != new_dir: - os.rename(os.path.join(root, dir), + try: + os.rename(os.path.join(root, dir), + os.path.join(root, new_dir)) + except OSError: + shutil.move(os.path.join(root, dir), os.path.join(root, new_dir)) for file in files: new_file = re.sub(r"\.dpkg-new", "", file) if file != new_file: - os.rename(os.path.join(root, file), + try: + os.rename(os.path.join(root, file), + os.path.join(root, new_file)) + except OSError: + shutil.move(os.path.join(root, file), os.path.join(root, new_file)) diff --git a/meta/lib/oe/package_manager/ipk/__init__.py b/meta/lib/oe/package_manager/ipk/__init__.py index da488c1c7f..2aa21949f3 100644 --- a/meta/lib/oe/package_manager/ipk/__init__.py +++ b/meta/lib/oe/package_manager/ipk/__init__.py @@ -213,7 +213,10 @@ class OpkgPM(OpkgDpkgPM): tmp_sf.write(status) - os.rename(status_file + ".tmp", status_file) + try: + os.rename(status_file + ".tmp", status_file) + except OSError: + shutil.move(status_file + ".tmp", status_file) def _create_custom_config(self): bb.note("Building from feeds activated!") |