From 837666a15e9b45b996e9e0f87a37fe24ecc5bcd1 Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Fri, 26 Jul 2019 16:38:05 -0400 Subject: [PATCH] Revamp renamekey function The function had numerous bugs and didn't work. Fix them up. --- node-daemon/pvcd/zkhandler.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/node-daemon/pvcd/zkhandler.py b/node-daemon/pvcd/zkhandler.py index bed2b1ef..e58fc45d 100644 --- a/node-daemon/pvcd/zkhandler.py +++ b/node-daemon/pvcd/zkhandler.py @@ -83,15 +83,16 @@ def writedata(zk_conn, kv): # Key rename function def renamekey(zk_conn, kv): - # Start up a transaction - zk_transaction = zk_conn.transaction() + # This one is not transactional because, inexplicably, transactions don't + # support either the recursive delete or recursive create operations that + # we need. Why? No explanation in the docs that I can find. # Proceed one KV pair at a time for key in sorted(kv): old_name = key new_name = kv[key] - old_data = zk_conn.get(old_name) + old_data = zk_conn.get(old_name)[0] # Find the children of old_name recursively child_keys = list() @@ -99,34 +100,26 @@ def renamekey(zk_conn, kv): children = zk_conn.get_children(key) if not children: child_keys.append(key) - return else: for ckey in children: - get_children(key) + get_children('{}/{}'.format(key, ckey)) get_children(old_name) # Get the data out of each of the child keys child_data = dict() for ckey in child_keys: - child_data[ckey] = zk_conn.get(ckey) + child_data[ckey] = zk_conn.get(ckey)[0] # Create the new parent key - zk_transaction.create(new_name, old_data) + zk_conn.create(new_name, old_data, makepath=True) # For each child key, create the key and add the data for ckey in child_keys: new_ckey_name = ckey.replace(old_name, new_name) - zk_transaction.create(new_ckey_name, child_data[ckey]) + zk_conn.create(new_ckey_name, child_data[ckey], makepath=True) # Remove recursively the old key - zk_transaction.delete(old_name, recursive=True) - - # Commit the transaction - try: - zk_transaction.commit() - return True - except Exception: - return False + zk_conn.delete(old_name, recursive=True) # Write lock function def writelock(zk_conn, key):