Browse Source

BaseStorage.set_node_data allows deleting entries by setting data=None

To support removing of aliased nodes, we need to be able to delete
(merged) nodes from the storage. Setting the node's data to None is a
safe method as basic storage implementations can simply save 'None' as
value, resulting in 'None' being returned on get_node_data() calls
indicating a non-existing node.
Helge Jung 9 years ago
parent
commit
088de69882
2 changed files with 8 additions and 1 deletions
  1. 4 1
      ffstatus/basestorage.py
  2. 4 0
      ffstatus/redisstorage.py

+ 4 - 1
ffstatus/basestorage.py

@@ -264,7 +264,10 @@ class BaseStorage(object):
             return 'offline'
 
     def set_node_data(self, key, data):
-        """Overwrite data for the node with the given key."""
+        """
+        Overwrite data for the node with the given key.
+        Specifying 'None' as data effectively means deleting the key.
+        """
         raise NotImplementedError("set_node_data was not overridden")
 
     def check_vpn_key(self, key):

+ 4 - 0
ffstatus/redisstorage.py

@@ -40,6 +40,10 @@ class RedisStorage(BaseStorage):
         return nodes
 
     def set_node_data(self, key, data):
+        if data is None or len(data) == 0:
+            self.db.delete('node_' + key)
+            return
+
         thedata = {}
         for item in data:
             payload = data[item]