From 4b8f43aaa6e612d3233ed87ed82b3e1229a9c17d Mon Sep 17 00:00:00 2001 From: Jeffrey C Honig Date: Mon, 16 Jul 2012 20:48:57 -0400 Subject: 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 Signed-off-by: Richard Purdie --- bitbake/lib/bb/siggen.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'bitbake/lib') diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index edd98fcfc0..02a426864f 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py @@ -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: -- cgit v1.2.3-54-g00ecf