/* consumer connection extension destructor */ void consumer_connection_extension_destructor (void *ext, void *object, void *parent) { PRUint64 connid = 0; if (ext) { /* Check to see if this replication session has acquired * a replica. If so, release it here. */ consumer_connection_extension *connext = (consumer_connection_extension *)ext; if (NULL != connext->replica_acquired) { Replica *r = object_get_data ((Object*)connext->replica_acquired); /* If a total update was in progress, abort it */ if (REPL_PROTOCOL_50_TOTALUPDATE == connext->repl_protocol_version) { Slapi_PBlock *pb = slapi_pblock_new(); const Slapi_DN *repl_root_sdn = replica_get_root(r); PR_ASSERT(NULL != repl_root_sdn); if (NULL != repl_root_sdn) { slapi_pblock_set(pb, SLAPI_CONNECTION, connext->connection); slapi_pblock_set(pb, SLAPI_TARGET_SDN, (void*)repl_root_sdn); slapi_pblock_get(pb, SLAPI_CONN_ID, &connid); slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "Aborting total update in progress for replicated " "area %s connid=%" NSPRIu64 "\n", slapi_sdn_get_dn(repl_root_sdn), connid); slapi_stop_bulk_import(pb); } else { slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "consumer_connection_extension_destructor: can't determine root " "of replicated area.\n"); } slapi_pblock_destroy(pb); /* allow reaping again */ replica_set_tombstone_reap_stop(r, PR_FALSE); } replica_relinquish_exclusive_access(r, connid, -1); object_release ((Object*)connext->replica_acquired); connext->replica_acquired = NULL; } if (connext->supplier_ruv) { ruv_destroy ((RUV **)&connext->supplier_ruv); } connext->connection = NULL; slapi_ch_free((void **)&ext); } }
Object* agmtlist_get_next_agreement_for_replica (Replica *r, Object *prev) { const Slapi_DN *replica_root; Slapi_DN *agmt_root; Object *obj; Repl_Agmt *agmt; if (r == NULL) { /* ONREPL - log error */ return NULL; } replica_root = replica_get_root(r); if (prev) obj = objset_next_obj(agmt_set, prev); else obj = objset_first_obj(agmt_set); while (obj) { agmt = (Repl_Agmt*)object_get_data (obj); PR_ASSERT (agmt); agmt_root = agmt_get_replarea(agmt); PR_ASSERT (agmt_root); if (slapi_sdn_compare (replica_root, agmt_root) == 0) { slapi_sdn_free (&agmt_root); return obj; } slapi_sdn_free (&agmt_root); obj = objset_next_obj(agmt_set, obj); } return NULL; }