/* * Note: when we add the new object, we have a reference to it. We hold * on to this reference until the agreement is deleted (or until the * server is shut down). */ int add_new_agreement(Slapi_Entry *e) { int rc = 0; Repl_Agmt *ra = agmt_new_from_entry(e); Slapi_DN *replarea_sdn = NULL; Replica *replica = NULL; Object *repl_obj = NULL; Object *ro = NULL; /* tell search result handler callback this entry was not sent */ if (ra == NULL) return 1; ro = object_new((void *)ra, agmt_delete); objset_add_obj(agmt_set, ro); object_release(ro); /* Object now owned by objset */ /* get the replica for this agreement */ replarea_sdn = agmt_get_replarea(ra); repl_obj = replica_get_replica_from_dn(replarea_sdn); slapi_sdn_free(&replarea_sdn); if (repl_obj) { replica = (Replica*)object_get_data (repl_obj); } rc = replica_start_agreement(replica, ra); if (repl_obj) object_release(repl_obj); return rc; }
/* Creates and initializes a new ldbm_instance structure. * Also sets up some default indexes for the new instance. */ int ldbm_instance_create(backend *be, char *name) { struct ldbminfo *li = (struct ldbminfo *) be->be_database->plg_private; ldbm_instance *inst = NULL; int rc = 0; /* Allocate storage for the ldbm_instance structure. Information specific * to this instance of the ldbm backend will be held here. */ inst = (ldbm_instance *) slapi_ch_calloc(1, sizeof(ldbm_instance)); /* Record the name of this instance. */ inst->inst_name = slapi_ch_strdup(name); /* initialize the entry cache */ if (! cache_init(&(inst->inst_cache), DEFAULT_CACHE_SIZE, DEFAULT_CACHE_ENTRIES, CACHE_TYPE_ENTRY)) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "cache_init failed\n"); rc = -1; goto error; } /* * initialize the dn cache * We do so, regardless of the subtree-rename value. * It is needed when converting the db from DN to RDN format. */ if (! cache_init(&(inst->inst_dncache), DEFAULT_DNCACHE_SIZE, DEFAULT_DNCACHE_MAXCOUNT, CACHE_TYPE_DN)) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "dn cache_init failed\n"); rc = -1; goto error; } /* Lock for the list of open db handles */ inst->inst_handle_list_mutex = PR_NewLock(); if (NULL == inst->inst_handle_list_mutex) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "PR_NewLock failed\n"); rc = -1; goto error; } /* Lock used to synchronize modify operations. */ inst->inst_db_mutex = PR_NewMonitor(); if (NULL == inst->inst_db_mutex) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "PR_NewMonitor failed\n"); rc = -1; goto error; } if ((inst->inst_config_mutex = PR_NewLock()) == NULL) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "PR_NewLock failed\n"); rc = -1; goto error; } if ((inst->inst_nextid_mutex = PR_NewLock()) == NULL) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "PR_NewLock failed\n"); rc = -1; goto error; } if ((inst->inst_indexer_cv = PR_NewCondVar(inst->inst_nextid_mutex)) == NULL) { slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_create", "PR_NewCondVar failed\n"); rc = -1; goto error; } /* Keeps track of how many operations are currently using this instance */ inst->inst_ref_count = slapi_counter_new(); inst->inst_be = be; inst->inst_li = li; be->be_instance_info = inst; /* Initialize the fields with some default values. */ ldbm_instance_config_setup_default(inst); /* Add this new instance to the the set of instances */ { Object *instance_obj; instance_obj = object_new((void *) inst, &ldbm_instance_destructor); objset_add_obj(li->li_instance_set, instance_obj); object_release(instance_obj); } goto done; error: slapi_ch_free_string(&inst->inst_name); slapi_ch_free((void**)&inst); done: return rc; }