locking: Refactor code to iterate over databases based on priority
authorAmitay Isaacs <amitay@gmail.com>
Tue, 30 Apr 2013 03:23:59 +0000 (13:23 +1000)
committerAmitay Isaacs <amitay@gmail.com>
Thu, 23 May 2013 23:06:38 +0000 (09:06 +1000)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
server/ctdb_lock.c

index bdf3257fe2bed4122fc7cddbf6bf39ead80764ad..46fc57ae33fdec4857c6709a44190b5835ab4ab2 100644 (file)
@@ -113,6 +113,48 @@ static bool later_db(struct ctdb_context *ctdb, const char *name)
        return false;
 }
 
+typedef int (*db_handler_t)(struct ctdb_db_context *ctdb_db,
+                           uint32_t priority,
+                           void *private_data);
+
+static int ctdb_db_iterator(struct ctdb_context *ctdb, uint32_t priority,
+                           db_handler_t handler, void *private_data)
+{
+       struct ctdb_db_context *ctdb_db;
+       int ret;
+
+       for (ctdb_db = ctdb->db_list; ctdb_db; ctdb_db = ctdb_db->next) {
+               if (ctdb_db->priority != priority) {
+                       continue;
+               }
+               if (later_db(ctdb, ctdb_db->db_name)) {
+                       continue;
+               }
+               ret = handler(ctdb_db, priority, private_data);
+               if (ret != 0) {
+                       return -1;
+               }
+       }
+
+       /* If priority != 1, later_db check is not required and can return */
+       if (priority != 1) {
+               return 0;
+       }
+
+       for (ctdb_db = ctdb->db_list; ctdb_db; ctdb_db = ctdb_db->next) {
+               if (!later_db(ctdb, ctdb_db->db_name)) {
+                       continue;
+               }
+               ret = handler(ctdb_db, priority, private_data);
+               if (ret != 0) {
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
+
 /*
  * lock all databases
  */