summaryrefslogtreecommitdiffstats
path: root/ctdb/server/ctdb_lock.c
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2013-04-30 13:23:59 +1000
committerAmitay Isaacs <amitay@gmail.com>2013-05-24 09:06:38 +1000
commit4581582a5ef061558a51710521d7cf89e4314583 (patch)
treea45571332e4099421b63648517ac1afc3265856a /ctdb/server/ctdb_lock.c
parent0c9d72eb189721f025a4ffdafaedfdcf94023ad3 (diff)
downloadsamba-4581582a5ef061558a51710521d7cf89e4314583.tar.gz
samba-4581582a5ef061558a51710521d7cf89e4314583.tar.xz
samba-4581582a5ef061558a51710521d7cf89e4314583.zip
locking: Refactor code to iterate over databases based on priority
Signed-off-by: Amitay Isaacs <amitay@gmail.com> (This used to be ctdb commit a3275854812aca86032704134fdf6a129069c86a)
Diffstat (limited to 'ctdb/server/ctdb_lock.c')
-rw-r--r--ctdb/server/ctdb_lock.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c
index bdf3257fe2b..46fc57ae33f 100644
--- a/ctdb/server/ctdb_lock.c
+++ b/ctdb/server/ctdb_lock.c
@@ -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
*/