[Checkins] SVN: zc.zk/trunk/src/zc/zk/ - ``delete_recursive`` now has a ``force`` argument to force deletion of

Jim Fulton jim at zope.com
Tue Jan 24 14:46:03 UTC 2012


Log message for revision 124154:
  - ``delete_recursive`` now has a ``force`` argument to force deletion of
    ephemeral nodes.
  
  - Fixed: the ``dry_run`` argument to ``delete_recursive`` didn't work
    properly.
  

Changed:
  U   zc.zk/trunk/src/zc/zk/README.txt
  U   zc.zk/trunk/src/zc/zk/__init__.py
  U   zc.zk/trunk/src/zc/zk/tests.py

-=-
Modified: zc.zk/trunk/src/zc/zk/README.txt
===================================================================
--- zc.zk/trunk/src/zc/zk/README.txt	2012-01-24 06:38:08 UTC (rev 124153)
+++ zc.zk/trunk/src/zc/zk/README.txt	2012-01-24 14:46:01 UTC (rev 124154)
@@ -413,8 +413,10 @@
           address = u'1.2.3.4:80'
           providers -> /cms/providers
 
-You can't delete nodes ephemeral nodes, or nodes that contain them::
 
+Bt default, ``delete_recursive`` won't delete ephemeral nodes, or
+nodes that contain them::
+
     >>> zk.delete_recursive('/fooservice')
     Not deleting /fooservice/providers/192.168.0.42:8080 because it's ephemeral.
     Not deleting /fooservice/providers/192.168.0.42:8081 because it's ephemeral.
@@ -422,6 +424,9 @@
     /fooservice/providers not deleted due to ephemeral descendent.
     /fooservice not deleted due to ephemeral descendent.
 
+You can use the ``force`` option to force ephemeral nodes to be
+deleted.
+
 Symbolic links
 ==============
 
@@ -818,10 +823,12 @@
     This should be called when cleanly shutting down servers to more
     quickly remove ephemeral nodes.
 
-``delete_recursive(path[, dry_run])``
+``delete_recursive(path[, dry_run[, force]])``
    Delete a node and all of it's sub-nodes.
 
-   Ephemeral nodes or nodes containing them are not deleted.
+   Ephemeral nodes or nodes containing them are not deleted by
+   default. To force deletion of ephemeral nodes, supply the ``force``
+   option with a true value.
 
    The dry_run option causes a summary of what would be deleted to be
    printed without actually deleting anything.
@@ -989,6 +996,15 @@
 Change History
 ==============
 
+0.6.0 (2012-01-??)
+------------------
+
+- ``delete_recursive`` now has a ``force`` argument to force deletion of
+  ephemeral nodes.
+
+- Fixed: the ``dry_run`` argument to ``delete_recursive`` didn't work
+  properly.
+
 0.5.2 (2012-01-06)
 ------------------
 

Modified: zc.zk/trunk/src/zc/zk/__init__.py
===================================================================
--- zc.zk/trunk/src/zc/zk/__init__.py	2012-01-24 06:38:08 UTC (rev 124153)
+++ zc.zk/trunk/src/zc/zk/__init__.py	2012-01-24 14:46:01 UTC (rev 124154)
@@ -423,15 +423,22 @@
                     self.create(cpath, data, acl)
             self._import_tree(cpath, child, acl, trim, dry_run)
 
-    def delete_recursive(self, path, dry_run=False):
+    def delete_recursive(self, path, dry_run=False, force=False):
+        self._delete_recursive(path, dry_run, force)
+
+    def _delete_recursive(self, path, dry_run, force):
+        ephemeral_child = None
         for name in sorted(self.get_children(path)):
-            self.delete_recursive(join(path, name))
+            ephemeral_child = (
+                self._delete_recursive(join(path, name), dry_run, force) or
+                ephemeral_child
+                )
 
-        if self.get_children(path):
+        if ephemeral_child:
             print "%s not deleted due to ephemeral descendent." % path
-            return
+            return ephemeral_child
 
-        ephemeral = self.get(path)[1]['ephemeralOwner']
+        ephemeral = self.get(path)[1]['ephemeralOwner'] and not force
         if dry_run:
             if ephemeral:
                 print "wouldn't delete %s because it's ephemeral." % path
@@ -443,6 +450,7 @@
             else:
                 logger.info('deleting %s', path)
                 self.delete(path)
+        return ephemeral
 
     def export_tree(self, path='/', ephemeral=False, name=None):
         output = []
@@ -597,6 +605,7 @@
                 if v is not None:
                     yield v
 
+ZK = ZooKeeper
 
 class NodeInfo:
 

Modified: zc.zk/trunk/src/zc/zk/tests.py
===================================================================
--- zc.zk/trunk/src/zc/zk/tests.py	2012-01-24 06:38:08 UTC (rev 124153)
+++ zc.zk/trunk/src/zc/zk/tests.py	2012-01-24 14:46:01 UTC (rev 124154)
@@ -1288,8 +1288,51 @@
     >>> zk.close()
     """
 
+def delete_recursive_dry_run():
+    """
+    >>> zk = zc.zk.ZooKeeper('zookeeper.example.com:2181')
+    >>> zk.delete_recursive('/fooservice', dry_run=True)
+    would delete /fooservice/providers.
+    would delete /fooservice.
 
+    >>> zk.print_tree()
+    /fooservice
+      database = u'/databases/foomain'
+      favorite_color = u'red'
+      threads = 1
+      /providers
 
+    >>> zk.close()
+    """
+
+def delete_recursive_force():
+    """
+    >>> zk = zc.zk.ZooKeeper('zookeeper.example.com:2181')
+    >>> zk.register_server('/fooservice/providers', 'a:b')
+
+    >>> zk.delete_recursive('/fooservice', dry_run=True, force=True)
+    would delete /fooservice/providers/a:b.
+    would delete /fooservice/providers.
+    would delete /fooservice.
+
+    >>> zk.print_tree()
+    /fooservice
+      database = u'/databases/foomain'
+      favorite_color = u'red'
+      threads = 1
+      /providers
+        /a:b
+          pid = 29093
+
+    >>> zk.delete_recursive('/fooservice', force=True)
+
+    >>> zk.print_tree()
+    <BLANKLINE>
+
+    >>> zk.close()
+    """
+
+
 # XXX
 # deleting linked node
 



More information about the checkins mailing list