Diff for /servers/slapd/overlays/syncprov.c between versions 1.290 and 1.298

version 1.290, 2009/11/10 18:02:33 version 1.298, 2009/11/19 10:17:53
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.289 2009/10/29 22:46:10 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.297 2009/11/15 09:38:13 hyc Exp $ */
 /* syncprov.c - syncrepl provider */  /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
Line 124  typedef struct sessionlog { Line 124  typedef struct sessionlog {
 typedef struct syncprov_info_t {  typedef struct syncprov_info_t {
         syncops         *si_ops;          syncops         *si_ops;
         BerVarray       si_ctxcsn;      /* ldapsync context */          BerVarray       si_ctxcsn;      /* ldapsync context */
           struct berval   si_contextdn;
         int             *si_sids;          int             *si_sids;
         int             si_numcsns;          int             si_numcsns;
         int             si_chkops;      /* checkpointing info */          int             si_chkops;      /* checkpointing info */
Line 854  syncprov_sendresp( Operation *op, opcook Line 855  syncprov_sendresp( Operation *op, opcook
         }          }
         /* In case someone else freed it already? */          /* In case someone else freed it already? */
         if ( rs.sr_ctrls ) {          if ( rs.sr_ctrls ) {
                 op->o_tmpfree( rs.sr_ctrls[0], op->o_tmpmemctx );                  int i;
                   for ( i=0; rs.sr_ctrls[i]; i++ ) {
                           if ( rs.sr_ctrls[i] == ctrls[0] ) {
                                   op->o_tmpfree( ctrls[0]->ldctl_value.bv_val, op->o_tmpmemctx );
                                   ctrls[0]->ldctl_value.bv_val = NULL;
                                   break;
                           }
                   }
                 rs.sr_ctrls = NULL;                  rs.sr_ctrls = NULL;
         }          }
   
Line 1190  syncprov_matchops( Operation *op, opcook Line 1198  syncprov_matchops( Operation *op, opcook
                 if ( ss->s_op->o_abandon )                  if ( ss->s_op->o_abandon )
                         continue;                          continue;
   
                 /* First time thru, check for possible skips */                  /* Don't send ops back to the originator */
                 if ( saveit || op->o_tag == LDAP_REQ_ADD ) {                  if ( opc->osid > 0 && opc->osid == ss->s_sid ) {
                           Debug( LDAP_DEBUG_SYNC, "syncprov_matchops: skipping original sid %03x\n",
                         /* Don't send ops back to the originator */                                  opc->osid, 0, 0 );
                         if ( opc->osid > 0 && opc->osid == ss->s_sid ) {                          continue;
                                 Debug( LDAP_DEBUG_SYNC, "syncprov_matchops: skipping original sid %03x\n",                  }
                                         opc->osid, 0, 0 );  
                                 continue;  
                         }  
   
                         /* Don't send ops back to the messenger */                  /* Don't send ops back to the messenger */
                         if ( opc->rsid > 0 && opc->rsid == ss->s_sid ) {                  if ( opc->rsid > 0 && opc->rsid == ss->s_sid ) {
                                 Debug( LDAP_DEBUG_SYNC, "syncprov_matchops: skipping relayed sid %03x\n",                          Debug( LDAP_DEBUG_SYNC, "syncprov_matchops: skipping relayed sid %03x\n",
                                         opc->rsid, 0, 0 );                                  opc->rsid, 0, 0 );
                                 continue;                          continue;
                         }  
                 }                  }
   
                 /* validate base */                  /* validate base */
Line 1361  syncprov_checkpoint( Operation *op, Slap Line 1365  syncprov_checkpoint( Operation *op, Slap
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
         BackendDB be;          BackendDB be;
   
 #ifdef CHECK_CSN  #ifdef CHECK_CSN
         Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;          Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
   
Line 1387  syncprov_checkpoint( Operation *op, Slap Line 1392  syncprov_checkpoint( Operation *op, Slap
                 be = *on->on_info->oi_origdb;                  be = *on->on_info->oi_origdb;
                 opm.o_bd = &be;                  opm.o_bd = &be;
         }          }
         opm.o_req_dn = opm.o_bd->be_suffix[0];          opm.o_req_dn = si->si_contextdn;
         opm.o_req_ndn = opm.o_bd->be_nsuffix[0];          opm.o_req_ndn = si->si_contextdn;
         opm.o_bd->bd_info = on->on_info->oi_orig;          opm.o_bd->bd_info = on->on_info->oi_orig;
         opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;          opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;
         opm.o_no_schema_check = 1;          opm.o_no_schema_check = 1;
         opm.o_bd->be_modify( &opm, &rsm );          opm.o_bd->be_modify( &opm, &rsm );
   
           if ( rsm.sr_err == LDAP_NO_SUCH_OBJECT &&
                   SLAP_SYNC_SUBENTRY( opm.o_bd )) {
                   const char      *text;
                   char txtbuf[SLAP_TEXT_BUFLEN];
                   size_t textlen = sizeof txtbuf;
                   Entry *e = slap_create_context_csn_entry( opm.o_bd, NULL );
                   slap_mods2entry( &mod, &e, 0, 1, &text, txtbuf, textlen);
                   opm.ora_e = e;
                   opm.o_bd->be_add( &opm, &rsm );
                   if ( e == opm.ora_e )
                           be_entry_release_w( &opm, opm.ora_e );
           }
   
         if ( mod.sml_next != NULL ) {          if ( mod.sml_next != NULL ) {
                 slap_mods_free( mod.sml_next, 1 );                  slap_mods_free( mod.sml_next, 1 );
         }          }
Line 1763  syncprov_op_response( Operation *op, Sla Line 1782  syncprov_op_response( Operation *op, Sla
                          * it will deadlock                           * it will deadlock
                          */                           */
                         if ( op->o_tag != LDAP_REQ_ADD ||                          if ( op->o_tag != LDAP_REQ_ADD ||
                                 !dn_match( &op->o_req_ndn, &op->o_bd->be_nsuffix[0] )) {                                  !dn_match( &op->o_req_ndn, &si->si_contextdn )) {
                                 if ( si->si_chkops && si->si_numops >= si->si_chkops ) {                                  if ( si->si_chkops && si->si_numops >= si->si_chkops ) {
                                         do_check = 1;                                          do_check = 1;
                                         si->si_numops = 0;                                          si->si_numops = 0;
Line 1837  syncprov_op_compare( Operation *op, Slap Line 1856  syncprov_op_compare( Operation *op, Slap
         syncprov_info_t         *si = on->on_bi.bi_private;          syncprov_info_t         *si = on->on_bi.bi_private;
         int rc = SLAP_CB_CONTINUE;          int rc = SLAP_CB_CONTINUE;
   
         if ( dn_match( &op->o_req_ndn, op->o_bd->be_nsuffix ) &&          if ( dn_match( &op->o_req_ndn, &si->si_contextdn ) &&
                 op->oq_compare.rs_ava->aa_desc == slap_schema.si_ad_contextCSN )                  op->oq_compare.rs_ava->aa_desc == slap_schema.si_ad_contextCSN )
         {          {
                 Entry e = {0};                  Entry e = {0};
                 Attribute a = {0};                  Attribute a = {0};
   
                 e.e_name = op->o_bd->be_suffix[0];                  e.e_name = si->si_contextdn;
                 e.e_nname = op->o_bd->be_nsuffix[0];                  e.e_nname = si->si_contextdn;
                 e.e_attrs = &a;                  e.e_attrs = &a;
   
                 a.a_desc = slap_schema.si_ad_contextCSN;                  a.a_desc = slap_schema.si_ad_contextCSN;
Line 2583  syncprov_operational( Line 2602  syncprov_operational(
                 return SLAP_CB_CONTINUE;                  return SLAP_CB_CONTINUE;
   
         if ( rs->sr_entry &&          if ( rs->sr_entry &&
                 dn_match( &rs->sr_entry->e_nname, op->o_bd->be_nsuffix )) {                  dn_match( &rs->sr_entry->e_nname, &si->si_contextdn )) {
   
                 if ( SLAP_OPATTRS( rs->sr_attr_flags ) ||                  if ( SLAP_OPATTRS( rs->sr_attr_flags ) ||
                         ad_inlist( slap_schema.si_ad_contextCSN, rs->sr_attrs )) {                          ad_inlist( slap_schema.si_ad_contextCSN, rs->sr_attrs )) {
Line 2870  syncprov_db_open( Line 2889  syncprov_db_open(
         }          }
   
         thrctx = ldap_pvt_thread_pool_context();          thrctx = ldap_pvt_thread_pool_context();
         connection_fake_init( &conn, &opbuf, thrctx );          connection_fake_init2( &conn, &opbuf, thrctx, 0 );
         op = &opbuf.ob_op;          op = &opbuf.ob_op;
         op->o_bd = be;          op->o_bd = be;
         op->o_dn = be->be_rootdn;          op->o_dn = be->be_rootdn;
         op->o_ndn = be->be_rootndn;          op->o_ndn = be->be_rootndn;
   
         rc = overlay_entry_get_ov( op, be->be_nsuffix, NULL,          if ( SLAP_SYNC_SUBENTRY( be )) {
                   build_new_dn( &si->si_contextdn, be->be_nsuffix,
                           (struct berval *)&slap_ldapsync_cn_bv, NULL );
           } else {
                   si->si_contextdn = be->be_nsuffix[0];
           }
           rc = overlay_entry_get_ov( op, &si->si_contextdn, NULL,
                 slap_schema.si_ad_contextCSN, 0, &e, on );                  slap_schema.si_ad_contextCSN, 0, &e, on );
   
         if ( e ) {          if ( e ) {
Line 2949  syncprov_db_close( Line 2974  syncprov_db_close(
                 void *thrctx;                  void *thrctx;
   
                 thrctx = ldap_pvt_thread_pool_context();                  thrctx = ldap_pvt_thread_pool_context();
                 connection_fake_init( &conn, &opbuf, thrctx );                  connection_fake_init2( &conn, &opbuf, thrctx, 0 );
                 op = &opbuf.ob_op;                  op = &opbuf.ob_op;
                 op->o_bd = be;                  op->o_bd = be;
                 op->o_dn = be->be_rootdn;                  op->o_dn = be->be_rootdn;

Removed from v.1.290  
changed lines
  Added in v.1.298


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org