Merge "Write out ring.gz's in a safer fashion"

This commit is contained in:
Jenkins 2014-03-27 21:23:50 +00:00 committed by Gerrit Code Review
commit 4b075c1072

View File

@ -24,6 +24,7 @@ import os
from io import BufferedReader from io import BufferedReader
from hashlib import md5 from hashlib import md5
from itertools import chain from itertools import chain
from tempfile import NamedTemporaryFile
from swift.common.utils import hash_path, validate_configuration, json from swift.common.utils import hash_path, validate_configuration, json
from swift.common.ring.utils import tiers_for_dev from swift.common.ring.utils import tiers_for_dev
@ -108,12 +109,18 @@ class RingData(object):
# #
# This only works on Python 2.7; on 2.6, we always get the # This only works on Python 2.7; on 2.6, we always get the
# current time in the gzip output. # current time in the gzip output.
tempf = NamedTemporaryFile(dir=".", prefix=filename, delete=False)
try: try:
gz_file = GzipFile(filename, 'wb', mtime=1300507380.0) gz_file = GzipFile(filename, mode='wb', fileobj=tempf,
mtime=1300507380.0)
except TypeError: except TypeError:
gz_file = GzipFile(filename, 'wb') gz_file = GzipFile(filename, mode='wb', fileobj=tempf)
self.serialize_v1(gz_file) self.serialize_v1(gz_file)
gz_file.close() gz_file.close()
tempf.flush()
os.fsync(tempf.fileno())
tempf.close()
os.rename(tempf.name, filename)
def to_dict(self): def to_dict(self):
return {'devs': self.devs, return {'devs': self.devs,