Changeset 2695af9 in trunk for src/allmydata


Ignore:
Timestamp:
2009-10-26T16:28:09Z (16 years ago)
Author:
Brian Warner <warner@…>
Branches:
master
Children:
1be4d45
Parents:
768c76a
Message:

dirnode.pack_children(): add deep_immutable= argument

This will be used by DIR2:CHK to enforce the deep-immutability requirement.

Location:
src/allmydata
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/allmydata/dirnode.py

    r768c76a r2695af9  
    136136    # produce it for the sake of older readers.
    137137
    138 def pack_children(filenode, children):
     138class MustBeDeepImmutable(Exception):
     139    """You tried to add a non-deep-immutable node to a deep-immutable
     140    directory."""
     141
     142def pack_children(filenode, children, deep_immutable=False):
    139143    """Take a dict that maps:
    140144         children[unicode_name] = (IFileSystemNode, metadata_dict)
     
    143147    accept an AuxValueDict, in which case I'll use the auxilliary cached data
    144148    as the pre-packed entry, which is faster than re-packing everything each
    145     time."""
     149    time.
     150
     151    If deep_immutable is True, I will require that all my children are deeply
     152    immutable, and will raise a MustBeDeepImmutable exception if not.
     153    """
     154
    146155    has_aux = isinstance(children, AuxValueDict)
    147156    entries = []
     
    149158        assert isinstance(name, unicode)
    150159        entry = None
     160        (child, metadata) = children[name]
     161        if deep_immutable and child.is_mutable():
     162            # TODO: consider adding IFileSystemNode.is_deep_immutable()
     163            raise MustBeDeepImmutable("child '%s' is mutable" % (name,))
    151164        if has_aux:
    152165            entry = children.get_aux(name)
    153166        if not entry:
    154             (child, metadata) = children[name]
    155167            assert IFilesystemNode.providedBy(child), (name,child)
    156168            assert isinstance(metadata, dict)
  • TabularUnified src/allmydata/test/test_dirnode.py

    r768c76a r2695af9  
    761761        return d
    762762
     763class MinimalFakeMutableFile:
     764    def get_writekey(self):
     765        return "writekey"
     766
    763767class Packing(unittest.TestCase):
    764768    # This is a base32-encoded representation of the directory tree
     
    823827        self.failUnlessEqual(file1_rwcap,
    824828                             children[u'file1'][0].get_uri())
     829
     830    def _make_kids(self, nm, which):
     831        caps = {"imm": "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861",
     832                "lit": "URI:LIT:n5xgk", # LIT for "one"
     833                "write": "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq",
     834                "read": "URI:SSK-RO:e3mdrzfwhoq42hy5ubcz6rp3o4:ybyibhnp3vvwuq2vaw2ckjmesgkklfs6ghxleztqidihjyofgw7q",
     835                "dirwrite": "URI:DIR2:n6x24zd3seu725yluj75q5boaa:mm6yoqjhl6ueh7iereldqxue4nene4wl7rqfjfybqrehdqmqskvq",
     836                "dirread":  "URI:DIR2-RO:b7sr5qsifnicca7cbk3rhrhbvq:mm6yoqjhl6ueh7iereldqxue4nene4wl7rqfjfybqrehdqmqskvq",
     837                }
     838        kids = {}
     839        for name in which:
     840            kids[unicode(name)] = (nm.create_from_cap(caps[name]), {})
     841        return kids
     842
     843    def test_deep_immutable(self):
     844        nm = NodeMaker(None, None, None, None, None, None, {"k": 3, "n": 10},
     845                       None)
     846        fn = MinimalFakeMutableFile()
     847
     848        kids = self._make_kids(nm, ["imm", "lit", "write", "read",
     849                                    "dirwrite", "dirread"])
     850        packed = dirnode.pack_children(fn, kids, deep_immutable=False)
     851        self.failUnlessIn("lit", packed)
     852
     853        kids = self._make_kids(nm, ["imm", "lit"])
     854        packed = dirnode.pack_children(fn, kids, deep_immutable=True)
     855        self.failUnlessIn("lit", packed)
     856
     857        kids = self._make_kids(nm, ["imm", "lit", "write"])
     858        e = self.failUnlessRaises(dirnode.MustBeDeepImmutable,
     859                                  dirnode.pack_children,
     860                                  fn, kids, deep_immutable=True)
     861
     862        # read-only is not enough: all children must be immutable
     863        kids = self._make_kids(nm, ["imm", "lit", "read"])
     864        e = self.failUnlessRaises(dirnode.MustBeDeepImmutable,
     865                                  dirnode.pack_children,
     866                                  fn, kids, deep_immutable=True)
     867
     868        kids = self._make_kids(nm, ["imm", "lit", "dirwrite"])
     869        e = self.failUnlessRaises(dirnode.MustBeDeepImmutable,
     870                                  dirnode.pack_children,
     871                                  fn, kids, deep_immutable=True)
     872
     873        kids = self._make_kids(nm, ["imm", "lit", "dirread"])
     874        e = self.failUnlessRaises(dirnode.MustBeDeepImmutable,
     875                                  dirnode.pack_children,
     876                                  fn, kids, deep_immutable=True)
    825877
    826878class FakeMutableFile:
Note: See TracChangeset for help on using the changeset viewer.