dirnode.py: Fix bug that caused 'tahoe' fields, 'ctime' and 'mtime' not to be updated when new metadata is present.
This commit is contained in:
parent
53f7d2c7fe
commit
4f58355a0e
|
@ -29,11 +29,11 @@ def update_metadata(metadata, new_metadata, now):
|
||||||
Timestamps are set according to the time 'now'."""
|
Timestamps are set according to the time 'now'."""
|
||||||
|
|
||||||
if metadata is None:
|
if metadata is None:
|
||||||
metadata = {"ctime": now,
|
metadata = {'ctime': now,
|
||||||
"mtime": now,
|
'mtime': now,
|
||||||
"tahoe": {
|
'tahoe': {
|
||||||
"linkcrtime": now,
|
'linkcrtime': now,
|
||||||
"linkmotime": now,
|
'linkmotime': now,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,28 +42,36 @@ def update_metadata(metadata, new_metadata, now):
|
||||||
newmd = new_metadata.copy()
|
newmd = new_metadata.copy()
|
||||||
|
|
||||||
# Except 'tahoe'.
|
# Except 'tahoe'.
|
||||||
if newmd.has_key('tahoe'):
|
if 'tahoe' in newmd:
|
||||||
del newmd['tahoe']
|
del newmd['tahoe']
|
||||||
if metadata.has_key('tahoe'):
|
if 'tahoe' in metadata:
|
||||||
newmd['tahoe'] = metadata['tahoe']
|
newmd['tahoe'] = metadata['tahoe']
|
||||||
|
|
||||||
|
# For backwards compatibility with Tahoe < 1.4.0:
|
||||||
|
if 'ctime' not in newmd:
|
||||||
|
if 'ctime' in metadata:
|
||||||
|
newmd['ctime'] = metadata['ctime']
|
||||||
|
else:
|
||||||
|
newmd['ctime'] = now
|
||||||
|
if 'mtime' not in newmd:
|
||||||
|
newmd['mtime'] = now
|
||||||
|
|
||||||
metadata = newmd
|
metadata = newmd
|
||||||
else:
|
else:
|
||||||
# For backwards compatibility with Tahoe < 1.4.0:
|
# For backwards compatibility with Tahoe < 1.4.0:
|
||||||
if "ctime" not in metadata:
|
if 'ctime' not in metadata:
|
||||||
metadata["ctime"] = now
|
metadata['ctime'] = now
|
||||||
metadata["mtime"] = now
|
metadata['mtime'] = now
|
||||||
|
|
||||||
# update timestamps
|
# update timestamps
|
||||||
sysmd = metadata.get('tahoe', {})
|
sysmd = metadata.get('tahoe', {})
|
||||||
if not 'linkcrtime' in sysmd:
|
if 'linkcrtime' not in sysmd:
|
||||||
if "ctime" in metadata:
|
# In Tahoe < 1.4.0 we used the word 'ctime' to mean what Tahoe >= 1.4.0
|
||||||
# In Tahoe < 1.4.0 we used the word "ctime" to mean what Tahoe >= 1.4.0
|
# calls 'linkcrtime'.
|
||||||
# calls "linkcrtime".
|
assert 'ctime' in metadata
|
||||||
sysmd["linkcrtime"] = metadata["ctime"]
|
sysmd['linkcrtime'] = metadata['ctime']
|
||||||
else:
|
sysmd['linkmotime'] = now
|
||||||
sysmd["linkcrtime"] = now
|
metadata['tahoe'] = sysmd
|
||||||
sysmd["linkmotime"] = now
|
|
||||||
|
|
||||||
return metadata
|
return metadata
|
||||||
|
|
||||||
|
|
|
@ -754,7 +754,8 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
fake_file_uri, fake_file_uri,
|
fake_file_uri, fake_file_uri,
|
||||||
{}))
|
{}))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"c2"))
|
d.addCallback(lambda res: n.get_metadata_for(u"c2"))
|
||||||
d.addCallback(lambda metadata: self.failUnlessEqual(metadata.keys(), ['tahoe']))
|
d.addCallback(lambda metadata:
|
||||||
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
|
|
||||||
# You can't override the link timestamps.
|
# You can't override the link timestamps.
|
||||||
d.addCallback(lambda res: n.set_uri(u"c2",
|
d.addCallback(lambda res: n.set_uri(u"c2",
|
||||||
|
@ -772,8 +773,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
fake_file_uri, fake_file_uri))
|
fake_file_uri, fake_file_uri))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"c3"))
|
d.addCallback(lambda res: n.get_metadata_for(u"c3"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnlessEqual(set(metadata.keys()),
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
set(["tahoe", "ctime", "mtime"])))
|
|
||||||
|
|
||||||
# or we can add specific metadata at set_uri() time, which
|
# or we can add specific metadata at set_uri() time, which
|
||||||
# overrides the timestamps
|
# overrides the timestamps
|
||||||
|
@ -782,7 +782,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
{"key": "value"}))
|
{"key": "value"}))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"c4"))
|
d.addCallback(lambda res: n.get_metadata_for(u"c4"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
|
self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
|
||||||
(metadata['key'] == "value"), metadata))
|
(metadata['key'] == "value"), metadata))
|
||||||
|
|
||||||
d.addCallback(lambda res: n.delete(u"c2"))
|
d.addCallback(lambda res: n.delete(u"c2"))
|
||||||
|
@ -799,14 +799,14 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
n.set_node, u"d2", n2,
|
n.set_node, u"d2", n2,
|
||||||
overwrite=False))
|
overwrite=False))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"d2"))
|
d.addCallback(lambda res: n.get_metadata_for(u"d2"))
|
||||||
d.addCallback(lambda metadata: self.failUnlessEqual(metadata.keys(), ['tahoe']))
|
d.addCallback(lambda metadata:
|
||||||
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
|
|
||||||
# if we don't set any defaults, the child should get timestamps
|
# if we don't set any defaults, the child should get timestamps
|
||||||
d.addCallback(lambda res: n.set_node(u"d3", n))
|
d.addCallback(lambda res: n.set_node(u"d3", n))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"d3"))
|
d.addCallback(lambda res: n.get_metadata_for(u"d3"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnlessEqual(set(metadata.keys()),
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
set(["tahoe", "ctime", "mtime"])))
|
|
||||||
|
|
||||||
# or we can add specific metadata at set_node() time, which
|
# or we can add specific metadata at set_node() time, which
|
||||||
# overrides the timestamps
|
# overrides the timestamps
|
||||||
|
@ -814,8 +814,8 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
{"key": "value"}))
|
{"key": "value"}))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"d4"))
|
d.addCallback(lambda res: n.get_metadata_for(u"d4"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
|
self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
|
||||||
(metadata['key'] == "value"), metadata))
|
(metadata["key"] == "value"), metadata))
|
||||||
|
|
||||||
d.addCallback(lambda res: n.delete(u"d2"))
|
d.addCallback(lambda res: n.delete(u"d2"))
|
||||||
d.addCallback(lambda res: n.delete(u"d3"))
|
d.addCallback(lambda res: n.delete(u"d3"))
|
||||||
|
@ -845,15 +845,14 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
d.addCallback(lambda children: self.failIf(u"new" in children))
|
d.addCallback(lambda children: self.failIf(u"new" in children))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"e1"))
|
d.addCallback(lambda res: n.get_metadata_for(u"e1"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnlessEqual(set(metadata.keys()),
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
set(["tahoe", "ctime", "mtime"])))
|
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"e2"))
|
d.addCallback(lambda res: n.get_metadata_for(u"e2"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnlessEqual(set(metadata.keys()), set(['tahoe'])))
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"e3"))
|
d.addCallback(lambda res: n.get_metadata_for(u"e3"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless((set(metadata.keys()) == set(["key", "tahoe"]))
|
self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
|
||||||
and (metadata['key'] == "value"), metadata))
|
(metadata["key"] == "value"), metadata))
|
||||||
|
|
||||||
d.addCallback(lambda res: n.delete(u"e1"))
|
d.addCallback(lambda res: n.delete(u"e1"))
|
||||||
d.addCallback(lambda res: n.delete(u"e2"))
|
d.addCallback(lambda res: n.delete(u"e2"))
|
||||||
|
@ -877,15 +876,14 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
d.addCallback(lambda children: self.failIf(u"new" in children))
|
d.addCallback(lambda children: self.failIf(u"new" in children))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"f1"))
|
d.addCallback(lambda res: n.get_metadata_for(u"f1"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnlessEqual(set(metadata.keys()),
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
set(["tahoe", "ctime", "mtime"])))
|
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"f2"))
|
d.addCallback(lambda res: n.get_metadata_for(u"f2"))
|
||||||
d.addCallback(
|
d.addCallback(lambda metadata:
|
||||||
lambda metadata: self.failUnlessEqual(set(metadata.keys()), set(['tahoe'])))
|
self.failUnlessEqual(set(metadata.keys()), set(["tahoe", "ctime", "mtime"])))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"f3"))
|
d.addCallback(lambda res: n.get_metadata_for(u"f3"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
|
self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
|
||||||
(metadata['key'] == "value"), metadata))
|
(metadata["key"] == "value"), metadata))
|
||||||
|
|
||||||
d.addCallback(lambda res: n.delete(u"f1"))
|
d.addCallback(lambda res: n.delete(u"f1"))
|
||||||
d.addCallback(lambda res: n.delete(u"f2"))
|
d.addCallback(lambda res: n.delete(u"f2"))
|
||||||
|
@ -896,12 +894,10 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
n.set_metadata_for(u"child",
|
n.set_metadata_for(u"child",
|
||||||
{"tags": ["web2.0-compatible"], "tahoe": {"bad": "mojo"}}))
|
{"tags": ["web2.0-compatible"], "tahoe": {"bad": "mojo"}}))
|
||||||
d.addCallback(lambda n1: n1.get_metadata_for(u"child"))
|
d.addCallback(lambda n1: n1.get_metadata_for(u"child"))
|
||||||
def _check_metadata(md):
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless("tags" in md, md)
|
self.failUnless((set(metadata.keys()) == set(["tags", "tahoe", "ctime", "mtime"])) and
|
||||||
self.failUnlessEqual(md["tags"], ["web2.0-compatible"])
|
metadata["tags"] == ["web2.0-compatible"] and
|
||||||
self.failUnless("tahoe" in md, md)
|
"bad" not in metadata["tahoe"], metadata))
|
||||||
self.failIf("bad" in md["tahoe"], md)
|
|
||||||
d.addCallback(_check_metadata)
|
|
||||||
|
|
||||||
def _start(res):
|
def _start(res):
|
||||||
self._start_timestamp = time.time()
|
self._start_timestamp = time.time()
|
||||||
|
@ -996,7 +992,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
self.failUnless(IImmutableFileNode.providedBy(newnode)))
|
self.failUnless(IImmutableFileNode.providedBy(newnode)))
|
||||||
d.addCallback(lambda res: n.get_metadata_for(u"newfile-metadata"))
|
d.addCallback(lambda res: n.get_metadata_for(u"newfile-metadata"))
|
||||||
d.addCallback(lambda metadata:
|
d.addCallback(lambda metadata:
|
||||||
self.failUnless((set(metadata.keys()) == set(["key", "tahoe"])) and
|
self.failUnless((set(metadata.keys()) == set(["key", "tahoe", "ctime", "mtime"])) and
|
||||||
(metadata['key'] == "value"), metadata))
|
(metadata['key'] == "value"), metadata))
|
||||||
d.addCallback(lambda res: n.delete(u"newfile-metadata"))
|
d.addCallback(lambda res: n.delete(u"newfile-metadata"))
|
||||||
|
|
||||||
|
@ -1058,6 +1054,21 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||||
d.addErrback(self.explain_error)
|
d.addErrback(self.explain_error)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
def test_update_metadata(self):
|
||||||
|
(t1, t2, t3) = (626644800, 634745640, 892226160)
|
||||||
|
|
||||||
|
md1 = dirnode.update_metadata({}, {"ctime": t1}, t2)
|
||||||
|
self.failUnlessEqual(md1, {"ctime": t1, "mtime": t2,
|
||||||
|
"tahoe":{"linkcrtime": t1, "linkmotime": t2}})
|
||||||
|
|
||||||
|
md2 = dirnode.update_metadata(md1, {"key": "value", "tahoe": {"bad": "mojo"}}, t3)
|
||||||
|
self.failUnlessEqual(md2, {"key": "value", "ctime": t1, "mtime": t3,
|
||||||
|
"tahoe":{"linkcrtime": t1, "linkmotime": t3}})
|
||||||
|
|
||||||
|
md3 = dirnode.update_metadata({}, None, t3)
|
||||||
|
self.failUnlessEqual(md3, {"ctime": t3, "mtime": t3,
|
||||||
|
"tahoe":{"linkcrtime": t3, "linkmotime": t3}})
|
||||||
|
|
||||||
def test_create_subdirectory(self):
|
def test_create_subdirectory(self):
|
||||||
self.basedir = "dirnode/Dirnode/test_create_subdirectory"
|
self.basedir = "dirnode/Dirnode/test_create_subdirectory"
|
||||||
self.set_up_grid()
|
self.set_up_grid()
|
||||||
|
|
Loading…
Reference in New Issue