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
1 changed files with 9 additions and 2 deletions

View File

@ -24,6 +24,7 @@ import os
from io import BufferedReader
from hashlib import md5
from itertools import chain
from tempfile import NamedTemporaryFile
from swift.common.utils import hash_path, validate_configuration, json
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
# current time in the gzip output.
tempf = NamedTemporaryFile(dir=".", prefix=filename, delete=False)
try:
gz_file = GzipFile(filename, 'wb', mtime=1300507380.0)
gz_file = GzipFile(filename, mode='wb', fileobj=tempf,
mtime=1300507380.0)
except TypeError:
gz_file = GzipFile(filename, 'wb')
gz_file = GzipFile(filename, mode='wb', fileobj=tempf)
self.serialize_v1(gz_file)
gz_file.close()
tempf.flush()
os.fsync(tempf.fileno())
tempf.close()
os.rename(tempf.name, filename)
def to_dict(self):
return {'devs': self.devs,