On 2/18/19 8:57 AM, Brian Dolbec wrote:
> On Sun, 17 Feb 2019 15:04:29 -0800
> Zac Medico wrote:
>
>> Since hardlinks on sshfs do not have matching inode numbers, detect
>> this behavior and use a simple stat call to detect if lock_path has
>> been removed.
>>
>> Bug: https://bugs.gentoo.org/678218
>> Signed-off-by: Zac Medico
>> ---
>> lib/portage/locks.py | 27 +++
>> 1 file changed, 27 insertions(+)
>>
>> diff --git a/lib/portage/locks.py b/lib/portage/locks.py
>> index 74c2c086a..510925da0 100644
>> --- a/lib/portage/locks.py
>> +++ b/lib/portage/locks.py
>> @@ -340,6 +340,33 @@ def _lockfile_was_removed(lock_fd, lock_path):
>>
>> hardlink_stat = os.stat(hardlink_path)
>> if hardlink_stat.st_ino != fstat_st.st_ino or
>> hardlink_stat.st_dev != fstat_st.st_dev:
>> +# Create another hardlink in order to detect
>> whether or not
>> +# hardlink inode numbers are expected to
>> match. For example,
>> +# inode numbers are not expected to match
>> for sshfs.
>> +inode_test = hardlink_path + '-inode-test'
>> +try:
>> +os.unlink(inode_test)
>> +except OSError as e:
>> +if e.errno not in (errno.ENOENT,
>> errno.ESTALE):
>> +_raise_exc(e)
>> +try:
>> +os.link(hardlink_path, inode_test)
>> +except OSError as e:
>> +if e.errno not in (errno.ENOENT,
>> errno.ESTALE):
>> +_raise_exc(e)
>> +return True
>> +else:
>> +if not
>> os.path.samefile(hardlink_path, inode_test):
>> +# This implies that inode
>> numbers are not expected
>> +# to match for this file
>> system, so use a simple
>> +# stat call to detect if
>> lock_path has been removed.
>> +return not
>> os.path.exists(lock_path)
>> +finally:
>> +try:
>> +os.unlink(inode_test)
>> +except OSError as e:
>> +if e.errno not in
>> (errno.ENOENT, errno.ESTALE):
>> +_raise_exc(e)
>> return True
>> finally:
>> try:
>
> Looks fine to me
Thanks, merged:
https://gitweb.gentoo.org/proj/portage.git/commit/?id=34532af167cff457c3cccda4ea4249a0bc26481a
--
Thanks,
Zac
signature.asc
Description: OpenPGP digital signature