]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blobdiff - src/allmydata/nodemaker.py
Add comment explaining fix to #1679. refs #1679
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / nodemaker.py
index 6fdaf47988f1e813c0be522dbcf63f029f252727..d0c002461e0383538f056a15b088015cc585719b 100644 (file)
@@ -1,7 +1,7 @@
 import weakref
 from zope.interface import implements
 from allmydata.util.assertutil import precondition
-from allmydata.interfaces import INodeMaker, SDMF_VERSION
+from allmydata.interfaces import INodeMaker
 from allmydata.immutable.literal import LiteralFileNode
 from allmydata.immutable.filenode import ImmutableFileNode, CiphertextFileNode
 from allmydata.immutable.upload import Data
@@ -18,14 +18,15 @@ class NodeMaker:
 
     def __init__(self, storage_broker, secret_holder, history,
                  uploader, terminator,
-                 default_encoding_parameters, key_generator,
-                 blacklist=None):
+                 default_encoding_parameters, mutable_file_default,
+                 key_generator, blacklist=None):
         self.storage_broker = storage_broker
         self.secret_holder = secret_holder
         self.history = history
         self.uploader = uploader
         self.terminator = terminator
         self.default_encoding_parameters = default_encoding_parameters
+        self.mutable_file_default = mutable_file_default
         self.key_generator = key_generator
         self.blacklist = blacklist
 
@@ -71,12 +72,16 @@ class NodeMaker:
             cap = uri.from_string(bigcap, deep_immutable=deep_immutable,
                                   name=name)
             node = self._create_from_single_cap(cap)
-            if node:
-                self._node_cache[memokey] = node  # note: WeakValueDictionary
-            else:
+
+            # node is None for an unknown URI, otherwise it is a type for which
+            # is_mutable() is known. We avoid cacheing mutable nodes due to
+            # ticket #1679.
+            if node is None:
                 # don't cache UnknownNode
                 node = UnknownNode(writecap, readcap,
                                    deep_immutable=deep_immutable, name=name)
+            elif node.is_mutable():
+                self._node_cache[memokey] = node  # note: WeakValueDictionary
 
         if self.blacklist:
             si = node.get_storage_index()
@@ -111,7 +116,7 @@ class NodeMaker:
 
     def create_mutable_file(self, contents=None, keysize=None, version=None):
         if version is None:
-            version = SDMF_VERSION
+            version = self.mutable_file_default
         n = MutableFileNode(self.storage_broker, self.secret_holder,
                             self.default_encoding_parameters, self.history)
         d = self.key_generator.generate(keysize)
@@ -138,6 +143,7 @@ class NodeMaker:
         packed = pack_children(children, None, deep_immutable=True)
         uploadable = Data(packed, convergence)
         d = self.uploader.upload(uploadable)
-        d.addCallback(lambda results: self.create_from_cap(None, results.uri))
+        d.addCallback(lambda results:
+                      self.create_from_cap(None, results.get_uri()))
         d.addCallback(self._create_dirnode)
         return d