s3: Add the "ctdb locktime warn threshold" parameter
[amitay/samba.git] / source3 / lib / dbwrap_ctdb.c
index 938a3126579da5a84b9e2bc14381640edae31d1f..bef91cb1ec6e5d7f33d6b2ffd556d6a5b0f99df3 100644 (file)
@@ -50,6 +50,7 @@ struct db_ctdb_ctx {
 struct db_ctdb_rec {
        struct db_ctdb_ctx *ctdb_ctx;
        struct ctdb_ltdb_header header;
+       struct timeval lock_time;
 };
 
 static NTSTATUS tdb_error_to_ntstatus(struct tdb_context *tdb)
@@ -898,6 +899,7 @@ static int db_ctdb_record_destr(struct db_record* data)
 {
        struct db_ctdb_rec *crec = talloc_get_type_abort(
                data->private_data, struct db_ctdb_rec);
+       int threshold;
 
        DEBUG(10, (DEBUGLEVEL > 10
                   ? "Unlocking db %u key %s\n"
@@ -911,6 +913,14 @@ static int db_ctdb_record_destr(struct db_record* data)
                return -1;
        }
 
+       threshold = lp_ctdb_locktime_warn_threshold();
+       if (threshold != 0) {
+               double timediff = timeval_elapsed(&crec->lock_time);
+               if ((timediff * 1000) > threshold) {
+                       DEBUG(0, ("Held tdb lock %f seconds\n", timediff));
+               }
+       }
+
        return 0;
 }
 
@@ -1011,6 +1021,8 @@ again:
                          migrate_attempts));
        }
 
+       GetTimeOfDay(&crec->lock_time);
+
        memcpy(&crec->header, ctdb_data.dptr, sizeof(crec->header));
 
        result->value.dsize = ctdb_data.dsize - sizeof(crec->header);