bitbake: siggen.py: Insure .siginfo files writes into shared sstate cache are atomic

Use tempfile.mkstemp to create a temporary file in the sstate dir and move it
   into place after closing.  The previous code would fail in the chmod() if two
   users were running jobs that touched the same signature file.

(Bitbake rev: ff11e9ac5eba2d957917664a7b91b1277d8ad548)

Signed-off-by: Jeffrey C Honig <jeffrey.honig@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Jeffrey C Honig 2012-07-16 20:48:57 -04:00 committed by Richard Purdie
parent 05e5ec2be8
commit 4b8f43aaa6
1 changed files with 15 additions and 4 deletions

View File

@ -2,6 +2,7 @@ import hashlib
import logging
import os
import re
import tempfile
import bb.data
logger = logging.getLogger('BitBake.SigGen')
@ -236,10 +237,20 @@ class SignatureGeneratorBasic(SignatureGenerator):
if taint:
data['taint'] = taint
with open(sigfile, "wb") as f:
p = pickle.Pickler(f, -1)
p.dump(data)
os.chmod(sigfile, 0664)
fd, tmpfile = tempfile.mkstemp(dir=os.path.dirname(sigfile), prefix="sigtask.")
try:
with os.fdopen(fd, "wb") as stream:
p = pickle.dump(data, stream, -1)
stream.flush()
os.fsync(fd)
os.chmod(tmpfile, 0664)
os.rename(tmpfile, sigfile)
except (OSError, IOError), err:
try:
os.unlink(tmpfile)
except OSError:
pass
raise err
def dump_sigs(self, dataCache):
for fn in self.taskdeps: