Merge "Write out ring.gz's in a safer fashion"
This commit is contained in:
commit
4b075c1072
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user