s4-dsdb: Add/Update SCHEMA_SEQ_NUM key in the metadata.tdb after schemaUpdateNow
authorMatthieu Patou <mat@matws.net>
Wed, 30 May 2012 17:43:27 +0000 (10:43 -0700)
committerMatthieu Patou <mat@matws.net>
Sat, 23 Jun 2012 06:22:04 +0000 (23:22 -0700)
The idea is to signal to other process accessing the database that the
schema was forced to be reloaded and so they should reload as well.

source4/dsdb/samdb/ldb_modules/partition.c
source4/dsdb/samdb/ldb_modules/partition_metadata.c
source4/dsdb/samdb/ldb_modules/schema_load.c
source4/dsdb/samdb/samdb.h

index e4659a7f43af296e8e0aded59cb3e9e12df5fd0c..d4f020fc5e2e7f5e4a999244832ea509cdeaf989 100644 (file)
@@ -1215,6 +1215,13 @@ static int partition_extended(struct ldb_module *module, struct ldb_request *req
                return ldb_next_request(module, req);
        }
 
+       if (strcmp(req->op.extended.oid, DSDB_EXTENDED_SCHEMA_UPDATE_NOW_OID) == 0) {
+               /* Update the metadata.tdb to increment the schema version if needed*/
+               DEBUG(10, ("Incrementing the sequence_number after schema_update_now\n"));
+               ret = partition_metadata_inc_schema_sequence(module);
+               return ldb_module_done(req, NULL, NULL, ret);
+       }
+
        /* see if we are still up-to-date */
        ret = partition_reload_if_required(module, data, req);
        if (ret != LDB_SUCCESS) {
index 8e97b528027aa011849a9b143aefc518d257ed63..0bf7a406401eb82140ad396dce84814e223be65c 100644 (file)
@@ -139,6 +139,38 @@ static int partition_metadata_set_uint64(struct ldb_module *module,
        return LDB_SUCCESS;
 }
 
+int partition_metadata_inc_schema_sequence(struct ldb_module *module)
+{
+       struct partition_private_data *data;
+       int ret;
+       uint64_t value;
+
+       data = talloc_get_type_abort(ldb_module_get_private(module),
+                                   struct partition_private_data);
+       if (!data || !data->metadata) {
+               return ldb_module_error(module, LDB_ERR_OPERATIONS_ERROR,
+                                       "partition_metadata: metadata not initialized");
+       }
+
+       if (data->metadata->in_transaction == 0) {
+               return ldb_module_error(module, LDB_ERR_OPERATIONS_ERROR,
+                                       "partition_metadata: increment sequence number without transaction");
+       }
+       ret = partition_metadata_get_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, &value, 0);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+
+       value++;
+       ret = partition_metadata_set_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, value, false);
+       if (ret == LDB_ERR_OPERATIONS_ERROR) {
+               /* Modify failed, let's try the add */
+               ret = partition_metadata_set_uint64(module, DSDB_METADATA_SCHEMA_SEQ_NUM, value, true);
+       }
+       return ret;
+}
+
+
 
 /*
  * Open sam.ldb.d/metadata.tdb.
index f922aabba90e2e96c02b5245e56bf505fcd7e935..9ae99a44b29f6a5bcb773dc9b7a8e9c258ae2678 100644 (file)
@@ -363,8 +363,8 @@ static int schema_load_extended(struct ldb_module *module, struct ldb_request *r
        *lastts = 0;
        ldb_set_opaque(ldb, DSDB_OPAQUE_LAST_SCHEMA_UPDATE_MSG_OPAQUE_NAME, lastts);
 
-       /* This is a no-op.  We reload as soon as we can */
-       return ldb_module_done(req, NULL, NULL, LDB_SUCCESS);
+       /* Pass to next module, the partition one should finish the chain */
+       return ldb_next_request(module, req);
 }
 
 
index 73da3e20cfcac83c70ccd1289b1960c2b081bbe4..3e2f4a2e7929a449fe00a99493670b39b00d2a9e 100644 (file)
@@ -218,4 +218,6 @@ struct dsdb_fsmo_extended_op {
 };
 
 #define DSDB_ACL_CHECKS_DIRSYNC_FLAG 0x1
+
+#define DSDB_METADATA_SCHEMA_SEQ_NUM   "SCHEMA_SEQ_NUM"
 #endif /* __SAMDB_H__ */