summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2010-12-28 13:19:22 +0100
committerMichael Adam <obnox@samba.org>2011-03-14 13:35:51 +0100
commit6506314c4af7ca2bcc0fe08017376159f1a77b6d (patch)
tree3cfeaf862d2099cecc8b32fb9285da14e761974f
parent1924d0d365e10ac8f2157198fb08d76708c8b5bc (diff)
downloadsamba-6506314c4af7ca2bcc0fe08017376159f1a77b6d.tar.gz
samba-6506314c4af7ca2bcc0fe08017376159f1a77b6d.tar.xz
samba-6506314c4af7ca2bcc0fe08017376159f1a77b6d.zip
ctdb_ltdb_store_server: add ability to send SCHEDULE_FOR_DELETION control to ctdb_ltdb_store.
(This used to be ctdb commit ab2711701999a5ecc23a36b3d9ba8e94f92e4c87)
-rw-r--r--ctdb/server/ctdb_ltdb_server.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/ctdb/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c
index 48b0852777..c919b73109 100644
--- a/ctdb/server/ctdb_ltdb_server.c
+++ b/ctdb/server/ctdb_ltdb_server.c
@@ -55,7 +55,8 @@ static int ctdb_fetch_func(struct ctdb_call_info *call)
*
* This is the server-variant of the ctdb_ltdb_store function.
* It contains logic to determine whether a record should be
- * stored or deleted.
+ * stored or deleted. It also sends SCHEDULE_FOR_DELETION
+ * controls to the local ctdb daemon if apporpriate.
*/
static int ctdb_ltdb_store_server(struct ctdb_db_context *ctdb_db,
TDB_DATA key,
@@ -67,6 +68,7 @@ static int ctdb_ltdb_store_server(struct ctdb_db_context *ctdb_db,
int ret;
bool seqnum_suppressed = false;
bool keep = false;
+ bool schedule_for_deletion = false;
uint32_t lmaster;
if (ctdb->flags & CTDB_FLAG_TORTURE) {
@@ -127,6 +129,14 @@ static int ctdb_ltdb_store_server(struct ctdb_db_context *ctdb_db,
keep = true;
}
+ if (keep &&
+ (data.dsize == 0) &&
+ !ctdb_db->persistent &&
+ (ctdb_db->ctdb->pnn == header->dmaster))
+ {
+ schedule_for_deletion = true;
+ }
+
store:
/*
* The VACUUM_MIGRATED flag is only set temporarily for
@@ -195,6 +205,8 @@ store:
ctdb_db->db_name,
keep?"store":"delete", ret,
tdb_errorstr(ctdb_db->ltdb->tdb)));
+
+ schedule_for_deletion = false;
}
if (seqnum_suppressed) {
tdb_add_flags(ctdb_db->ltdb->tdb, TDB_SEQNUM);
@@ -202,6 +214,14 @@ store:
talloc_free(rec.dptr);
+ if (schedule_for_deletion) {
+ int ret2;
+ ret2 = ctdb_local_schedule_for_deletion(ctdb_db, header, key);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR, (__location__ " ctdb_local_schedule_for_deletion failed.\n"));
+ }
+ }
+
return ret;
}