Fixes race condition with privsep utime

There is a race condition that occurs over NFS when multiple instances
are being created where utime fails, due to some other process
modifying the file path. This patch ensures the path is created and
is readable before attempting to modify with utime.

Closes-Bug: 1809123

Change-Id: Id68aa27a8ab08d9c00655e5ed6b48d194aa8e6f6
Signed-off-by: Tim Rozet <trozet@redhat.com>
This commit is contained in:
Tim Rozet
2018-12-17 19:44:54 -05:00
parent 48ad73e1fa
commit 525631d8dc
2 changed files with 12 additions and 6 deletions

View File

@@ -70,12 +70,10 @@ def chmod(path, mode):
def utime(path):
if not os.path.exists(path):
raise exception.FileNotFound(file_path=path)
# NOTE(mikal): the old version of this used execute(touch, ...), which
# would apparently fail on shared storage when multiple instances were
# being launched at the same time. If we see failures here, we might need
# to wrap this in a try / except.
os.utime(path, None)
# context wrapper ensures the file exists before trying to modify time
# which fixes a race condition with NFS image caching (see LP#1809123)
with open(path, 'a'):
os.utime(path, None)
@nova.privsep.sys_admin_pctxt.entrypoint

View File

@@ -0,0 +1,8 @@
---
fixes:
- |
Fixes a race condition when multiple instances are launched at the same
time, which leads to a failure when modifying the modified time of the
instance base image. This issue was noticed when using an NFS backend. For
more information see https://bugs.launchpad.net/nova/+bug/1809123