From ed5b13cab68f82ae6a1abe03bf41eb7369c30f2c Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Jul 20 2020 13:34:54 +0000 Subject: Issue 51000 - Separate the BDB backend monitors Bug Description: While trying to remove duplicate code from the backend and BDB backend code, I found that we were not correctly separating the BDB monitors from the core backend code. Fix Description: Move all the monitor registering to the db_layer private structure. This way we have fully isolated the monitors for each backend implementation/library. This also removed some duplicate code from the core backend and BDB code. relates: https://pagure.io/389-ds-base/issue/51000 Reviewed by: spichugi(Thanks!) --- diff --git a/dirsrvtests/tests/suites/monitor/monitor_test.py b/dirsrvtests/tests/suites/monitor/monitor_test.py index 5786903..98dd62d 100644 --- a/dirsrvtests/tests/suites/monitor/monitor_test.py +++ b/dirsrvtests/tests/suites/monitor/monitor_test.py @@ -2,6 +2,7 @@ import logging import pytest import os from lib389.monitor import * +from lib389.backend import Backends, DatabaseConfig from lib389._constants import * from lib389.topologies import topology_st as topo @@ -63,6 +64,87 @@ def test_monitor(topo): log.info('dtablesize: {0[0]},readwaiters: {0[1]},entriessent: {0[2]},bytessent: {0[3]},currenttime: {0[4]},starttime: {0[5]}'.format(stats)) +pytestmark = pytest.mark.tier1 +def test_monitor_ldbm(topo): + """This test is to check if we are getting the correct monitor entry + + :id: e62ba369-32f5-4b03-8865-f597a5bb6a70 + :setup: Single instance + :steps: + 1. Get the backend library (bdb, ldbm, etc) + 2. Get the database monitor + 3. Check for expected attributes in output + 4. Check for expected DB library specific attributes + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Success + """ + + # Are we using BDB? + db_config = DatabaseConfig(topo.standalone) + db_lib = db_config.get_db_lib() + + # Get the database monitor entry + monitor = MonitorLDBM(topo.standalone).get_status() + + # Check that known attributes exist (only NDN cache stats) + assert 'normalizeddncachehits' in monitor + + # Check for library specific attributes + if db_lib == 'bdb': + assert 'dbcachehits' in monitor + assert 'nsslapd-db-configured-locks' in monitor + elif db_lib == 'lmdb': + pass + else: + # Unknown - the server would probably fail to start but check it anyway + log.fatal(f'Unknown backend library: {db_lib}') + assert False + + +pytestmark = pytest.mark.tier1 +def test_monitor_backend(topo): + """This test is to check if we are getting the correct backend monitor entry + + :id: 27b0534f-a18c-4c95-aa2b-936bc1886a7b + :setup: Single instance + :steps: + 1. Get the backend library (bdb, ldbm, etc) + 2. Get the backend monitor + 3. Check for expected attributes in output + 4. Check for expected DB library specific attributes + :expectedresults: + 1. Success + 2. Success + 3. Success + 4. Success + """ + + # Are we using BDB? + db_config = DatabaseConfig(topo.standalone) + db_lib = db_config.get_db_lib() + + # Get the backend monitor + be = Backends(topo.standalone).list()[0] + monitor = be.get_monitor().get_status() + + # Check for expected attributes + assert 'entrycachehits' in monitor + assert 'dncachehits' in monitor + + # Check for library specific attributes + if db_lib == 'bdb': + assert 'dbfilename-0' in monitor + elif db_lib == 'lmdb': + pass + else: + # Unknown - the server would probably fail to start but check it anyway + log.fatal(f'Unknown backend library: {db_lib}') + assert False + + if __name__ == '__main__': # Run isolated # -s for DEBUG mode diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_config.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_config.c index 7c05d2f..738b841 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_config.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_config.c @@ -88,6 +88,7 @@ int bdb_init(struct ldbminfo *li, config_info *config_array) priv->instance_postdel_config_fn = &bdb_instance_post_delete_instance_entry_callback; priv->instance_cleanup_fn = &bdb_instance_cleanup; priv->instance_create_fn = &bdb_instance_create; + priv->instance_register_monitor_fn = &bdb_instance_register_monitor; priv->instance_search_callback_fn = &bdb_instance_search_callback; priv->dblayer_auto_tune_fn = &bdb_start_autotune; return 0; @@ -1530,6 +1531,7 @@ bail: } return rval; } + /* Reads in any config information held in the dse for the bdb * implementation of the ldbm plugin. * Creates dse entries used to configure the ldbm plugin and dblayer @@ -1640,7 +1642,7 @@ retry: * Now still using ldbm functions */ slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_monitor_search, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_monitor_search, (void *)li); slapi_ch_free_string(&dn); @@ -1656,7 +1658,7 @@ retry: goto bail; } slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_dbmonitor_search, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_dbmonitor_search, (void *)li); bail: @@ -1664,6 +1666,72 @@ bail: return rval; } +/* general-purpose callback to deny an operation */ +static int +bdb_deny_config(Slapi_PBlock *pb __attribute__((unused)), + Slapi_Entry *e __attribute__((unused)), + Slapi_Entry *entryAfter __attribute__((unused)), + int *returncode, + char *returntext __attribute__((unused)), + void *arg __attribute__((unused))) +{ + *returncode = LDAP_UNWILLING_TO_PERFORM; + return SLAPI_DSE_CALLBACK_ERROR; +} + +int +bdb_instance_register_monitor(ldbm_instance *inst) { + struct ldbminfo *li = inst->inst_li; + char *dn = NULL; + + dn = slapi_create_dn_string("cn=monitor,cn=%s,cn=%s,cn=plugins,cn=config", + inst->inst_name, li->li_plugin->plg_name); + if (NULL == dn) { + slapi_log_err(SLAPI_LOG_ERR, + "bdb_instance_register_monitor", + "failed create monitor instance dn for plugin %s, " + "instance %s\n", + inst->inst_li->li_plugin->plg_name, inst->inst_name); + return 1; + } + /* make callback on search; deny add/modify/delete */ + slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_monitor_instance_search, + (void *)inst); + slapi_config_register_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_SUBTREE, "(objectclass=*)", bdb_deny_config, + (void *)inst); + slapi_config_register_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_deny_config, + (void *)inst); + slapi_ch_free_string(&dn); + + return 0; +} + +void +bdb_instance_unregister_monitor(ldbm_instance *inst) { + struct ldbminfo *li = inst->inst_li; + char *dn = NULL; + + dn = slapi_create_dn_string("cn=monitor,cn=%s,cn=%s,cn=plugins,cn=config", + inst->inst_name, li->li_plugin->plg_name); + if (NULL == dn) { + slapi_log_err(SLAPI_LOG_ERR, + "bdb_instance_unregister_monitor", + "Failed create monitor instance dn for plugin %s, " + "instance %s\n", + inst->inst_li->li_plugin->plg_name, inst->inst_name); + return; + } + slapi_config_remove_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_monitor_instance_search); + slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_SUBTREE, "(objectclass=*)", bdb_deny_config); + slapi_config_remove_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, dn, + LDAP_SCOPE_BASE, "(objectclass=*)", bdb_deny_config); + slapi_ch_free_string(&dn); +} /* Utility function used in creating config entries. Using the * config_info, this function gets info and formats in the correct diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_instance_config.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_instance_config.c index 6a21c22..0ac3694 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_instance_config.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_instance_config.c @@ -197,6 +197,8 @@ bdb_instance_post_delete_instance_entry_callback(struct ldbminfo *li, struct ldb if (inst_dirp != inst_dir) { slapi_ch_free_string(&inst_dirp); } + /* unregister the monitor */ + bdb_instance_unregister_monitor(inst); } /* non-null pEnv */ return SLAPI_DSE_CALLBACK_OK; } diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h index d729327..bf00d2e 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h @@ -150,7 +150,6 @@ int bdb_back_ok_to_dump(const char *dn, char **include, char **exclude); int bdb_back_fetch_incl_excl(Slapi_PBlock *pb, char ***include, char ***exclude); PRUint64 bdb_get_id2entry_size(ldbm_instance *inst); - /* bdb version functions */ int bdb_version_write(struct ldbminfo *li, const char *directory, const char *dataversion, PRUint32 flags); int bdb_version_read(struct ldbminfo *li, const char *directory, char **ldbmversion, char **dataversion); @@ -162,3 +161,10 @@ int bdb_instance_post_delete_instance_entry_callback(struct ldbminfo *li, struct int bdb_instance_add_instance_entry_callback(struct ldbminfo *li, struct ldbm_instance *inst); int bdb_instance_postadd_instance_entry_callback(struct ldbminfo *li, struct ldbm_instance *inst); void bdb_config_setup_default(struct ldbminfo *li); + +/* monitor functions */ +int bdb_monitor_instance_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); +int bdb_monitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); +int bdb_dbmonitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); +int bdb_instance_register_monitor(ldbm_instance *inst); +void bdb_instance_unregister_monitor(ldbm_instance *inst); diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c index 9ffd877..506c285 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c @@ -3145,7 +3145,7 @@ bdb_upgradednformat(Slapi_PBlock *pb) run_from_cmdline = (task_flags & SLAPI_TASK_RUNNING_FROM_COMMANDLINE); slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &li); if (run_from_cmdline) { - ldbm_config_load_dse_info(li); + bdb_config_load_dse_info(li); if (bdb_check_and_set_import_cache(li) < 0) { return -1; } diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_monitor.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_monitor.c index ac3479d..8f954c4 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_monitor.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_monitor.c @@ -33,12 +33,12 @@ /* DSE callback to monitor stats for a particular instance */ int -ldbm_back_monitor_instance_search(Slapi_PBlock *pb __attribute__((unused)), - Slapi_Entry *e, - Slapi_Entry *entryAfter __attribute__((unused)), - int *returncode, - char *returntext __attribute__((unused)), - void *arg) +bdb_monitor_instance_search(Slapi_PBlock *pb __attribute__((unused)), + Slapi_Entry *e, + Slapi_Entry *entryAfter __attribute__((unused)), + int *returncode, + char *returntext __attribute__((unused)), + void *arg) { ldbm_instance *inst = (ldbm_instance *)arg; struct ldbminfo *li = NULL; @@ -150,8 +150,8 @@ ldbm_back_monitor_instance_search(Slapi_PBlock *pb __attribute__((unused)), continue; /* Since the filenames are now relative, we need to construct an absolute version - * for the purpose of stat() etc below... - */ + * for the purpose of stat() etc below... + */ slapi_ch_free_string(&absolute_pathname); absolute_pathname = slapi_ch_smprintf("%s%c%s", inst->inst_parent_dir_name, get_sep(inst->inst_parent_dir_name), mpfstat[i]->file_name); @@ -159,10 +159,10 @@ ldbm_back_monitor_instance_search(Slapi_PBlock *pb __attribute__((unused)), if (stat(absolute_pathname, &astat)) continue; /* If the file has been re-created after been deleted - * We should show only statistics for the last instance - * Since SleepyCat returns the statistic of the last open file first, - * we should only display the first statistic record for a given file - */ + * We should show only statistics for the last instance + * Since SleepyCat returns the statistic of the last open file first, + * we should only display the first statistic record for a given file + */ for (j = 0; j < i; j++) if (!strcmp(mpfstat[i]->file_name, mpfstat[j]->file_name)) break; @@ -194,7 +194,7 @@ ldbm_back_monitor_instance_search(Slapi_PBlock *pb __attribute__((unused)), /* monitor global ldbm stats */ int -ldbm_back_monitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg) +bdb_monitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg) { struct ldbminfo *li = (struct ldbminfo *)arg; struct berval val; @@ -288,7 +288,7 @@ ldbm_back_monitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAft /* monitor global ldbm database stats */ int -ldbm_back_dbmonitor_search(Slapi_PBlock *pb __attribute__((unused)), +bdb_dbmonitor_search(Slapi_PBlock *pb __attribute__((unused)), Slapi_Entry *e, Slapi_Entry *entryAfter __attribute__((unused)), int *returncode, diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_verify.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_verify.c index 32933a8..42d1cd1 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_verify.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_verify.c @@ -171,7 +171,7 @@ bdb_verify(Slapi_PBlock *pb) slapi_pblock_get(pb, SLAPI_SEQ_TYPE, &verbose); slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &li); slapi_pblock_get(pb, SLAPI_DBVERIFY_DBDIR, &dbdir); - ldbm_config_load_dse_info(li); + bdb_config_load_dse_info(li); bdb_config_internal_set(li, CONFIG_DB_TRANSACTION_LOGGING, "off"); /* no write needed; choose EXPORT MODE */ diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c index c9f43c7..05cc5b8 100644 --- a/ldap/servers/slapd/back-ldbm/dblayer.c +++ b/ldap/servers/slapd/back-ldbm/dblayer.c @@ -273,10 +273,9 @@ dblayer_setup(struct ldbminfo *li) } ldbm_config_load_dse_info(li); - priv = (dblayer_private *)li->li_dblayer_private; - rc = priv->dblayer_load_dse_fn(li); + return rc; } diff --git a/ldap/servers/slapd/back-ldbm/dblayer.h b/ldap/servers/slapd/back-ldbm/dblayer.h index 8e156dd..cd53f25 100644 --- a/ldap/servers/slapd/back-ldbm/dblayer.h +++ b/ldap/servers/slapd/back-ldbm/dblayer.h @@ -147,6 +147,7 @@ struct dblayer_private instance_config_entry_callback_fn_t *instance_postdel_config_fn; instance_cleanup_fn_t *instance_cleanup_fn; instance_create_fn_t *instance_create_fn; + instance_create_fn_t *instance_register_monitor_fn; instance_search_callback_fn_t *instance_search_callback_fn; dblayer_auto_tune_fn_t *dblayer_auto_tune_fn; }; diff --git a/ldap/servers/slapd/back-ldbm/ldbm_config.c b/ldap/servers/slapd/back-ldbm/ldbm_config.c index 88c1863..3fe86d5 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_config.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_config.c @@ -1113,38 +1113,6 @@ ldbm_config_load_dse_info(struct ldbminfo *li) (void *)li); slapi_ch_free_string(&dn); - /* setup the dse callback functions for the ldbm backend monitor entry */ - dn = slapi_create_dn_string("cn=monitor,cn=%s,cn=plugins,cn=config", - li->li_plugin->plg_name); - if (NULL == dn) { - slapi_log_err(SLAPI_LOG_ERR, - "ldbm_config_load_dse_info", - "failed to create monitor dn for %s\n", - li->li_plugin->plg_name); - rval = 1; - goto bail; - } - slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_monitor_search, - (void *)li); - slapi_ch_free_string(&dn); - - /* And the ldbm backend database monitor entry */ - dn = slapi_create_dn_string("cn=database,cn=monitor,cn=%s,cn=plugins,cn=config", - li->li_plugin->plg_name); - if (NULL == dn) { - slapi_log_err(SLAPI_LOG_ERR, - "ldbm_config_load_dse_info", - "failed create monitor database dn for %s\n", - li->li_plugin->plg_name); - rval = 1; - goto bail; - } - slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_dbmonitor_search, - (void *)li); - slapi_ch_free_string(&dn); - /* setup the dse callback functions for the ldbm backend instance * entries */ dn = slapi_create_dn_string("cn=%s,cn=plugins,cn=config", diff --git a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c index 36ec112..56bf35f 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c @@ -675,32 +675,6 @@ ldbm_instance_config_load_dse_info(ldbm_instance *inst) LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_instance_deny_config, (void *)inst); /* delete is handled by a callback set in ldbm_config.c */ - - slapi_ch_free_string(&dn); - - /* don't forget the monitor! */ - dn = slapi_create_dn_string("cn=monitor,cn=%s,cn=%s,cn=plugins,cn=config", - inst->inst_name, li->li_plugin->plg_name); - if (NULL == dn) { - slapi_log_err(SLAPI_LOG_ERR, - "ldbm_instance_config_load_dse_info", - "failed create monitor instance dn for plugin %s, " - "instance %s\n", - inst->inst_li->li_plugin->plg_name, inst->inst_name); - rval = 1; - goto bail; - } - /* make callback on search; deny add/modify/delete */ - slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_monitor_instance_search, - (void *)inst); - slapi_config_register_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_SUBTREE, "(objectclass=*)", ldbm_instance_deny_config, - (void *)inst); - slapi_config_register_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_instance_deny_config, - (void *)inst); - /* delete is okay */ slapi_ch_free_string(&dn); /* Callbacks to handle indexes */ @@ -908,6 +882,7 @@ static int ldbm_instance_generate(struct ldbminfo *li, char *instance_name, Slapi_Backend **ret_be) { Slapi_Backend *new_be = NULL; + dblayer_private *priv = (dblayer_private *)li->li_dblayer_private; int rc = 0; /* Create a new instance, process config info for it, @@ -922,6 +897,8 @@ ldbm_instance_generate(struct ldbminfo *li, char *instance_name, Slapi_Backend * } ldbm_instance_config_load_dse_info(new_be->be_instance_info); + priv->instance_register_monitor_fn(new_be->be_instance_info); + ldbm_instance_create_default_indexes(new_be); /* if USN plugin is enabled, set slapi_counter */ @@ -984,24 +961,6 @@ ldbm_instance_unregister_callbacks(ldbm_instance *inst) ldbm_instance_deny_config); slapi_ch_free_string(&dn); - /* now the cn=monitor entry */ - dn = slapi_create_dn_string("cn=monitor,cn=%s,cn=%s,cn=plugins,cn=config", - inst->inst_name, li->li_plugin->plg_name); - if (NULL == dn) { - slapi_log_err(SLAPI_LOG_ERR, - "ldbm_instance_unregister_callbacks", - "Failed create monitor instance dn for plugin %s, " - "instance %s\n", - inst->inst_li->li_plugin->plg_name, inst->inst_name); - goto bail; - } - slapi_config_remove_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_back_monitor_instance_search); - slapi_config_remove_callback(SLAPI_OPERATION_ADD, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_SUBTREE, "(objectclass=*)", ldbm_instance_deny_config); - slapi_config_remove_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, dn, - LDAP_SCOPE_BASE, "(objectclass=*)", ldbm_instance_deny_config); - slapi_ch_free_string(&dn); /* now the cn=index entries */ dn = slapi_create_dn_string("cn=index,cn=%s,cn=%s,cn=plugins,cn=config", diff --git a/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h b/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h index 43793f6..5d618a8 100644 --- a/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h +++ b/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h @@ -480,14 +480,6 @@ void ldbm_back_prev_search_results(Slapi_PBlock *pb); int ldbm_back_isinitialized(void); /* - * monitor.c - */ - -int ldbm_back_monitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); -int ldbm_back_monitor_instance_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); -int ldbm_back_dbmonitor_search(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg); - -/* * vlv.c */ struct vlv_request diff --git a/src/lib389/lib389/backend.py b/src/lib389/lib389/backend.py index e4938b2..13177ca 100644 --- a/src/lib389/lib389/backend.py +++ b/src/lib389/lib389/backend.py @@ -1035,6 +1035,10 @@ class DatabaseConfig(DSLdapObject): vo = vo[0] self._instance.log.info(f'{k}: {vo}') + def get_db_lib(self): + """Return the backend library, bdb, lmdb, etc""" + return self._db_lib + def set(self, value_pairs): for attr, val in value_pairs: attr = attr.lower()