diff --git a/nova/privsep/path.py b/nova/privsep/path.py index c35e32ce54bb..680bce175179 100644 --- a/nova/privsep/path.py +++ b/nova/privsep/path.py @@ -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 diff --git a/releasenotes/notes/fix-image-utime-race-condition-3c404e272ea91b34.yaml b/releasenotes/notes/fix-image-utime-race-condition-3c404e272ea91b34.yaml new file mode 100644 index 000000000000..08aa6e4860f3 --- /dev/null +++ b/releasenotes/notes/fix-image-utime-race-condition-3c404e272ea91b34.yaml @@ -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 +