vacuum: add ctdb_local_remove_from_delete_queue()
authorMichael Adam <obnox@samba.org>
Thu, 7 Apr 2011 10:17:16 +0000 (12:17 +0200)
committerMichael Adam <obnox@samba.org>
Fri, 23 Dec 2011 16:39:00 +0000 (17:39 +0100)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

include/ctdb_private.h
server/ctdb_vacuum.c

index 9e5e188c4910dfc42b397ce551a2739b7824d4f7..547ad388c9e50918c74c3d24e64e4c478e43bf46 100644 (file)
@@ -1427,6 +1427,10 @@ int32_t ctdb_local_schedule_for_deletion(struct ctdb_db_context *ctdb_db,
                                         const struct ctdb_ltdb_header *hdr,
                                         TDB_DATA key);
 
+void ctdb_local_remove_from_delete_queue(struct ctdb_db_context *ctdb_db,
+                                        const struct ctdb_ltdb_header *hdr,
+                                        const TDB_DATA key);
+
 struct ctdb_ltdb_header *ctdb_header_from_record_handle(struct ctdb_record_handle *h);
 
 /* For unit testing ctdb_transaction.c. */
index 5be8abe42019d1166ac0d31cf7ef6022e9f3e317..2b85e7174c3ab85bdf498ce7c0714d0cd0e76277 100644 (file)
@@ -1301,6 +1301,42 @@ int ctdb_vacuum_init(struct ctdb_db_context *ctdb_db)
        return 0;
 }
 
+static void remove_record_from_delete_queue(struct ctdb_db_context *ctdb_db,
+                                           const struct ctdb_ltdb_header *hdr,
+                                           const TDB_DATA key)
+{
+       struct delete_record_data *kd;
+       uint32_t hash;
+
+       hash = (uint32_t)ctdb_hash(&key);
+
+       DEBUG(DEBUG_DEBUG, (__location__
+                           " remove_record_from_delete_queue: db[%s] "
+                           "db_id[0x%08x] "
+                           "key_hash[0x%08x] "
+                           "lmaster[%u] "
+                           "migrated_with_data[%s]\n",
+                            ctdb_db->db_name, ctdb_db->db_id,
+                            hash,
+                            ctdb_lmaster(ctdb_db->ctdb, &key),
+                            hdr->flags & CTDB_REC_FLAG_MIGRATED_WITH_DATA ? "yes" : "no"));
+
+       kd = (struct delete_record_data *)trbt_lookup32(ctdb_db->delete_queue, hash);
+       if (kd == NULL) {
+               return;
+       }
+       if (kd->key.dsize != key.dsize) {
+               return;
+       }
+       if (memcmp(kd->key.dptr, key.dptr, key.dsize) != 0) {
+               return;
+       }
+
+       talloc_free(kd);
+
+       return;
+}
+
 /**
  * Insert a record into the ctdb_db context's delete queue,
  * handling hash collisions.
@@ -1435,3 +1471,20 @@ int32_t ctdb_local_schedule_for_deletion(struct ctdb_db_context *ctdb_db,
 
        return ret;
 }
+
+void ctdb_local_remove_from_delete_queue(struct ctdb_db_context *ctdb_db,
+                                        const struct ctdb_ltdb_header *hdr,
+                                        const TDB_DATA key)
+{
+       if (ctdb_db->ctdb->ctdbd_pid != getpid()) {
+               /*
+                * Only remove the record from the delete queue if called
+                * in the main daemon.
+                */
+               return;
+       }
+
+       remove_record_from_delete_queue(ctdb_db, hdr, key);
+
+       return;
+}