[Fedora-directory-commits] ldapserver/ldap/servers/slapd/back-ldbm ldif2ldbm.c, 1.7, 1.7.2.1 vlv_srch.c, 1.6, 1.6.2.1

Noriko Hosoi (nhosoi) fedora-directory-commits at redhat.com
Fri Jan 11 00:44:41 UTC 2008


Author: nhosoi

Update of /cvs/dirsec/ldapserver/ldap/servers/slapd/back-ldbm
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv24438

Modified Files:
      Tag: Directory71RtmBranch
	ldif2ldbm.c vlv_srch.c 
Log Message:
Resolves: #243820
Summary: Online browsing indexing hangs
Description: applied the patch to Directory71RtmBranch



Index: ldif2ldbm.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/back-ldbm/ldif2ldbm.c,v
retrieving revision 1.7
retrieving revision 1.7.2.1
diff -u -r1.7 -r1.7.2.1
--- ldif2ldbm.c	19 Apr 2005 22:07:38 -0000	1.7
+++ ldif2ldbm.c	11 Jan 2008 00:44:38 -0000	1.7.2.1
@@ -188,7 +188,7 @@
 		 int *status)
 {
     backend *be;
-    const char *pdn;
+    char *pdn;
     ID pid = 0;
 
     slapi_pblock_get(pb, SLAPI_BACKEND, &be);
@@ -216,7 +216,7 @@
 	 * suffix entry, or its erroneous. So, we signal this to the
 	 * caller via the status parameter.
 	 */
-        bv.bv_val = (char *)pdn;
+        bv.bv_val = pdn;
 	bv.bv_len = strlen(pdn);
 	if ( (idl = index_read( be, "entrydn", indextype_EQUALITY, &bv, NULL,
 				&err )) != NULL ) {
@@ -225,7 +225,7 @@
 	} else if ( 0 != err ) {
 	    if (DB_NOTFOUND != err ) {
 		LDAPDebug( LDAP_DEBUG_ANY, "database error %d\n", err, 0, 0 );
-		slapi_ch_free( (void**)&pdn );
+		slapi_ch_free_string( &pdn );
 		return( -1 );
 	    } else {
 		if (NULL != status) {
@@ -233,7 +233,7 @@
 		}
 	    }
 	}
-	slapi_ch_free( (void**)&pdn );
+	slapi_ch_free_string( &pdn );
     } else {
 	if (NULL != status) {
 	    *status = IMPORT_ADD_OP_ATTRS_NO_PARENT;
@@ -315,7 +315,7 @@
      * let's do it so we can reuse the modify routines) */
     cache_lock_entry( &inst->inst_cache, e );
     modify_init(&mc,e);
-    sprintf(value_buffer,"%lu",sub_count);
+    sprintf(value_buffer,"%u",sub_count);
     /* attr numsubordinates could already exist in the entry,
        let's check whether it's already there or not */
     isreplace = (attrlist_find(e->ep_entry->e_attrs, numsubordinates) != NULL);
@@ -1252,7 +1252,7 @@
               "ldbm2index: Unknown VLV Index named '%s'\n", index, 0, 0);
     LDAPDebug(LDAP_DEBUG_ANY,
               "ldbm2index: Known VLV Indexes are: %s\n", text, 0, 0);
-    slapi_ch_free((void**)&text);
+    slapi_ch_free_string(&text);
 }
 
 /*
@@ -1276,20 +1276,25 @@
     IDList           *idl = NULL; /* optimization for vlv index creation */
     int              numvlv = 0;
     int              return_value = -1;
+    int              rc = -1;
     ID               temp_id;
-    int              i, j;
+    int              i, j, vlvidx;
     ID               lastid;
-    struct backentry *ep;
+    struct backentry *ep = NULL;
     char             *type;
     NIDS             idindex = 0;
     int              count = 0;
     Slapi_Attr       *attr;
     Slapi_Task       *task;
-    int              ret = 0;
     int              isfirst = 1;
     int              index_aid = 0;          /* index ancestorid */
+    struct vlvIndex  *vlvip = NULL;
+    back_txn         txn;
 
     LDAPDebug( LDAP_DEBUG_TRACE, "=> ldbm_back_ldbm2index\n", 0, 0, 0 );
+    if ( g_get_shutdown() || c_get_shutdown() ) {
+        return return_value;
+    }
         
     slapi_pblock_get(pb, SLAPI_BACKEND_INSTANCE_NAME, &instance_name);
     slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &li);
@@ -1301,6 +1306,7 @@
         /* No ldbm backend exists until we process the config info. */
         li->li_flags |= TASK_RUNNING_FROM_COMMANDLINE;
         ldbm_config_load_dse_info(li);
+        txn.back_txn_txn = NULL;    /* no transaction */
     }
 
     inst = ldbm_instance_find_by_name(li, instance_name);
@@ -1311,7 +1317,7 @@
         }
         LDAPDebug(LDAP_DEBUG_ANY, "Unknown ldbm instance %s\n",
                   instance_name, 0, 0);
-        return -1;
+        return return_value;
     }
     be = inst->inst_be;
     slapi_pblock_set(pb, SLAPI_BACKEND, be);
@@ -1326,14 +1332,14 @@
         if (0 != dblayer_start(li,DBLAYER_INDEX_MODE)) {
             LDAPDebug( LDAP_DEBUG_ANY,
                        "ldbm2index: Failed to init database\n", 0, 0, 0 );
-            return( -1 );
+            return return_value;
         }
 
         /* dblayer_instance_start will init the id2entry index. */
         if (0 != dblayer_instance_start(be, DBLAYER_INDEX_MODE)) {
-            LDAPDebug(LDAP_DEBUG_ANY, "db2ldif: Failed to init instance\n",
+            LDAPDebug(LDAP_DEBUG_ANY, "ldbm2index: Failed to init instance\n",
                       0, 0, 0);
-            return -1;
+            return return_value;
         }
 
         /* Initialise the Virtual List View code */
@@ -1345,34 +1351,31 @@
         LDAPDebug(LDAP_DEBUG_ANY, "ldbm: '%s' is already in the middle of "
                   "another task and cannot be disturbed.\n",
                   inst->inst_name, 0, 0);
-        return -1;
+        return return_value;
     }
 
     if ((( dblayer_get_id2entry( be, &db )) != 0 ) || (db == NULL)) {
         LDAPDebug( LDAP_DEBUG_ANY, "Could not open/create id2entry\n",
                    0, 0, 0 );
-        instance_set_not_busy(inst);
-        return( -1 );
+        goto err_min;
     }
 
     /* get a cursor to we can walk over the table */
-    return_value = db->cursor(db, NULL, &dbc, 0);
-    if (0 != return_value ) {
+    rc = db->cursor(db, NULL, &dbc, 0);
+    if (0 != rc ) {
         LDAPDebug( LDAP_DEBUG_ANY,
                    "Failed to get cursor for ldbm2index\n", 0, 0, 0 );
-        dblayer_release_id2entry(be, db);
-        instance_set_not_busy(inst);
-        return( -1 );
+        goto err_min;
     }
 
     /* ask for the last id so we can give cute percentages */
     key.flags = DB_DBT_MALLOC;
     data.flags = DB_DBT_MALLOC;
-    return_value = dbc->c_get(dbc, &key, &data, DB_LAST);
-    if (return_value == DB_NOTFOUND) {
+    rc = dbc->c_get(dbc, &key, &data, DB_LAST);
+    if (rc == DB_NOTFOUND) {
         lastid = 0;
         isfirst = 0;  /* neither a first nor a last */
-    } else if (return_value == 0) {
+    } else if (rc == 0) {
         lastid = id_stored_to_internal((char *)key.data);
         free(key.data);
         free(data.data);
@@ -1381,10 +1384,7 @@
         LDAPDebug(LDAP_DEBUG_ANY,
                   "Failed to seek within id2entry (BAD %d)\n", 
                   return_value, 0 ,0);
-        dbc->c_close(dbc);
-        dblayer_release_id2entry(be, db);
-        instance_set_not_busy(inst);
-        return( -1 );
+        goto err_out;
     }
 
     /* Work out which indexes we should build */
@@ -1395,11 +1395,13 @@
      */
     {
         char **attrs = NULL;
-        struct vlvIndex *p = NULL;
         struct attrinfo *ai = NULL;
 
         slapi_pblock_get(pb, SLAPI_DB2INDEX_ATTRS, &attrs);
         for (i = 0; attrs[i] != NULL; i++) {
+            if ( g_get_shutdown() || c_get_shutdown() ) {
+                goto err_out;
+			}
             switch(attrs[i][0]) {
             case 't':        /* attribute type to index */
                 db2index_add_indexed_attr(be, attrs[i]);
@@ -1427,13 +1429,11 @@
                 dblayer_erase_index_file(be, ai, i/* chkpt; 1st time only */);
                 break;
             case 'T':        /* VLV Search to index */
-                p = vlv_find_searchname((attrs[i])+1, be);
-                if (p == NULL) {
+                vlvip = vlv_find_searchname((attrs[i])+1, be);
+                if (vlvip == NULL) {
                     ldbm2index_bad_vlv(task, inst, attrs[i]+1);
-                    ret = -1;
-                    goto out;
                 } else {
-                    vlvIndex_go_offline(p, be);
+                    vlvIndex_go_offline(vlvip, be);
                     if (pvlv == NULL) {
                         pvlv = (struct vlvIndex **)slapi_ch_calloc(1,
                                                      sizeof(struct vlvIndex *));
@@ -1441,10 +1441,10 @@
                         pvlv = (struct vlvIndex **)slapi_ch_realloc((char*)pvlv,
                                           (numvlv+1)*sizeof(struct vlvIndex *));
                     }
-                    pvlv[numvlv] = p;
+                    pvlv[numvlv] = vlvip;
                     numvlv++;
                     /* Get rid of the index if it already exists */
-                    PR_Delete(vlvIndex_filename(p));
+                    PR_Delete(vlvIndex_filename(vlvip));
                     if (task) {
                         slapi_task_log_notice(task, "%s: Indexing VLV: %s",
                                               inst->inst_name, attrs[i]+1);
@@ -1462,12 +1462,12 @@
      * entire database.
      */
     if (!indexAttrs && !index_aid && pvlv) {
-        int i, err;
+        int err;
         char **suffix_list = NULL;
 
         /* create suffix list */
-        for (i = 0; i < numvlv; i++) {
-            char *s = slapi_ch_strdup(slapi_sdn_get_dn(vlvIndex_getBase(pvlv[i])));
+        for (vlvidx = 0; vlvidx < numvlv; vlvidx++) {
+            char *s = slapi_ch_strdup(slapi_sdn_get_dn(vlvIndex_getBase(pvlv[vlvidx])));
 
             s = slapi_dn_normalize_case(s);
             charray_add(&suffix_list, s);
@@ -1503,11 +1503,10 @@
         idindex = 0;
     }
 
-    /* Bug 603120: slapd dumps core while indexing and deleting the db at the
-     * same time. Now added the lock for the indexing code too.
-     */
-    vlv_acquire_lock(be);
     while (1) {
+        if ( g_get_shutdown() || c_get_shutdown() ) {
+            goto err_out;
+        }
         if (idl) {
             if (idindex >= idl->b_nids)
                 break;
@@ -1516,12 +1515,11 @@
             key.size = sizeof(temp_id);
             data.flags = DB_DBT_MALLOC;
 
-            return_value = db->get(db, NULL, &key, &data, 0);
-            if (return_value) {
+            rc = db->get(db, NULL, &key, &data, 0);
+            if (rc) {
                 LDAPDebug(LDAP_DEBUG_ANY, "%s: Failed "
                           "to read database, errno=%d (%s)\n",
-                          inst->inst_name, return_value,
-                          dblayer_strerror(return_value));
+                          inst->inst_name, rc, dblayer_strerror(return_value));
                 if (task) {
                     slapi_task_log_notice(task,
                         "%s: Failed to read database, err %d (%s)",
@@ -1537,27 +1535,24 @@
             key.flags = DB_DBT_MALLOC;
             data.flags = DB_DBT_MALLOC;
             if (isfirst) {
-                return_value = dbc->c_get(dbc, &key, &data, DB_FIRST);
+                rc = dbc->c_get(dbc, &key, &data, DB_FIRST);
                 isfirst = 0;
             } else{
-                return_value = dbc->c_get(dbc, &key, &data, DB_NEXT);
+                rc = dbc->c_get(dbc, &key, &data, DB_NEXT);
             }
 
-            if (0 != return_value) {
-                if (DB_NOTFOUND == return_value) {
-                    break;
-                } else {
-                    LDAPDebug(LDAP_DEBUG_ANY, "%s: Failed to read database, "
-                              "errno=%d (%s)\n", inst->inst_name, return_value,
-                              dblayer_strerror(return_value));
-                    if (task) {
-                        slapi_task_log_notice(task,
+            if (DB_NOTFOUND == rc) {
+                break;
+            } else if (0 != rc) {
+                LDAPDebug(LDAP_DEBUG_ANY, "%s: Failed to read database, "
+                          "errno=%d (%s)\n", inst->inst_name, rc,
+                          dblayer_strerror(rc));
+                if (task) {
+                    slapi_task_log_notice(task,
                             "%s: Failed to read database, err %d (%s)",
-                            inst->inst_name, return_value,
-                            dblayer_strerror(return_value));
-                    }
-                    break;
+                            inst->inst_name, rc, dblayer_strerror(rc));
                 }
+                break;
             }
             temp_id = id_stored_to_internal((char *)key.data);
             free(key.data);
@@ -1594,9 +1589,7 @@
             LDAPDebug(LDAP_DEBUG_ANY,
                 "%s: ERROR: Could not add op attrs to entry (id %lu)\n",
                 inst->inst_name, (u_long)ep->ep_id, 0);
-            backentry_free( &ep );
-            ret = -1;
-            goto out;
+            goto err_out;
         }
 
         /*
@@ -1606,21 +1599,17 @@
             for (i = slapi_entry_first_attr(ep->ep_entry, &attr); i == 0;
                  i = slapi_entry_next_attr(ep->ep_entry, attr, &attr)) {
                 Slapi_Value **svals;
-                int rc = 0;
 
                 slapi_attr_get_type( attr, &type );
                 for ( j = 0; indexAttrs[j] != NULL; j++ ) {
+                    if ( g_get_shutdown() || c_get_shutdown() ) {
+                        goto err_out;
+                    }
                     if (slapi_attr_type_cmp(indexAttrs[j], type,
                                             SLAPI_TYPE_CMP_SUBTYPE) == 0 ) {
-                        back_txn txn;
                         svals = attr_get_present_values(attr);
 
-                        if (run_from_cmdline)
-                        {
-                            txn.back_txn_txn = NULL;
-                        }
-                        else
-                        {
+                        if (!run_from_cmdline) {
                             rc = dblayer_txn_begin(li, NULL, &txn);
                             if (0 != rc) {
                                 LDAPDebug(LDAP_DEBUG_ANY,
@@ -1637,8 +1626,8 @@
                                         inst->inst_name, indexAttrs[j], rc,
                                         dblayer_strerror(rc));
                                 }
-                                ret = -2;
-                                goto out;
+                                return_value = -2;
+                                goto err_out;
                             }
                         }
                         rc = index_addordel_values_sv(
@@ -1657,13 +1646,13 @@
                                     "(err %d: %s)", inst->inst_name,
                                     indexAttrs[j], rc, dblayer_strerror(rc));
                             }
-                            if (!run_from_cmdline)
-                                   dblayer_txn_abort(li, &txn);
-                            ret = -2;
-                            goto out;
+                            if (!run_from_cmdline) {
+                                dblayer_txn_abort(li, &txn);
+                            }
+                            return_value = -2;
+                            goto err_out;
                         }
-                        if (!run_from_cmdline)
-                        {
+                        if (!run_from_cmdline) {
                             rc = dblayer_txn_commit(li, &txn);
                             if (0 != rc) {
                                 LDAPDebug(LDAP_DEBUG_ANY,
@@ -1680,8 +1669,8 @@
                                         "(err %d: %s)", inst->inst_name,
                                         indexAttrs[j], rc, dblayer_strerror(rc));
                                 }
-                                ret = -2;
-                                goto out;
+                                return_value = -2;
+                                goto err_out;
                             }
                         }
                     }
@@ -1692,21 +1681,16 @@
         /*
          * Update the Virtual List View indexes
          */
-        for ( j = 0; j<numvlv; j++ ) {
-            back_txn txn;
-            int rc = 0;
-            if (run_from_cmdline)
-            {
-                txn.back_txn_txn = NULL;
+        for ( vlvidx = 0; vlvidx < numvlv; vlvidx++ ) {
+            if ( g_get_shutdown() || c_get_shutdown() ) {
+                goto err_out;
             }
-            else
-            if (!run_from_cmdline)
-            {
+            if (!run_from_cmdline) {
                 rc = dblayer_txn_begin(li, NULL, &txn);
                 if (0 != rc) {
                     LDAPDebug(LDAP_DEBUG_ANY,
                       "%s: ERROR: failed to begin txn for update index '%s'\n",
-                      inst->inst_name, indexAttrs[j], 0);
+                      inst->inst_name, indexAttrs[vlvidx], 0);
                     LDAPDebug(LDAP_DEBUG_ANY,
                         "%s: Error %d: %s\n", inst->inst_name, rc,
                         dblayer_strerror(rc));
@@ -1714,20 +1698,26 @@
                         slapi_task_log_notice(task,
                          "%s: ERROR: failed to begin txn for update index '%s' "
                          "(err %d: %s)", inst->inst_name,
-                         indexAttrs[j], rc, dblayer_strerror(rc));
+                         indexAttrs[vlvidx], rc, dblayer_strerror(rc));
                     }
-                    ret = -2;
-                    goto out;
+                    return_value = -2;
+                    goto err_out;
                 }
             }
-            vlv_update_index(pvlv[j], &txn, li, pb, NULL, ep);
+            /*
+             * lock is needed around vlv_update_index to protect the
+             * vlv structure.
+             */
+            vlv_acquire_lock(be);
+            vlv_update_index(pvlv[vlvidx], &txn, li, pb, NULL, ep);
+			vlv_release_lock(be);
             if (!run_from_cmdline)
             {
                 rc = dblayer_txn_commit(li, &txn);
                 if (0 != rc) {
                     LDAPDebug(LDAP_DEBUG_ANY,
                       "%s: ERROR: failed to commit txn for update index '%s'\n",
-                      inst->inst_name, indexAttrs[j], 0);
+                      inst->inst_name, indexAttrs[vlvidx], 0);
                     LDAPDebug(LDAP_DEBUG_ANY,
                         "%s: Error %d: %s\n", inst->inst_name, rc,
                         dblayer_strerror(rc));
@@ -1735,10 +1725,10 @@
                         slapi_task_log_notice(task,
                         "%s: ERROR: failed to commit txn for update index '%s' "
                         "(err %d: %s)", inst->inst_name,
-                        indexAttrs[j], rc, dblayer_strerror(rc));
+                        indexAttrs[vlvidx], rc, dblayer_strerror(rc));
                     }
-                    ret = -2;
-                    goto out;
+                    return_value = -2;
+                    goto err_out;
                 }
             }
         }
@@ -1747,8 +1737,6 @@
          * Update the ancestorid index
          */
         if (index_aid) {
-            int rc;
-
             rc = ldbm_ancestorid_index_entry(be, ep, BE_INDEX_ADD, NULL);
             if (rc != 0) {
                 LDAPDebug(LDAP_DEBUG_ANY,
@@ -1763,8 +1751,8 @@
                         "(err %d: %s)", inst->inst_name,
                         rc, dblayer_strerror(rc));
                 }
-                ret = -2;
-                goto out;
+                return_value = -2;
+                goto err_out;
             }
         }
 
@@ -1792,7 +1780,6 @@
 
         backentry_free( &ep );
     }
-    vlv_release_lock(be);
 
     /* if we got here, we finished successfully */
 
@@ -1804,8 +1791,8 @@
         PR_ASSERT(ai != NULL);
         ai->ai_indexmask &= ~INDEX_OFFLINE;
     }
-    for (i = 0; i < numvlv; i++) {
-        vlvIndex_go_online(pvlv[i], be);
+    for (vlvidx = 0; vlvidx < numvlv; vlvidx++) {
+        vlvIndex_go_online(pvlv[vlvidx], be);
     }
 
     if (task) {
@@ -1816,19 +1803,27 @@
     }
     LDAPDebug(LDAP_DEBUG_ANY, "%s: Finished indexing.\n",
               inst->inst_name, 0, 0);
-
-out:
+    return_value = 0; /* success */
+err_out:
+    backentry_free( &ep ); /* if ep or *ep is NULL, it does nothing */
     if (idl) {
         idl_free(idl);
     } else {
         dbc->c_close(dbc);
     }
-    dblayer_release_id2entry( be, db );
-
+    if (return_value < 0) {/* error case: undo vlv indexing */
+        /* if jumped to out due to an error, vlv lock has not been released */
+        for ( vlvidx = 0; vlvidx < numvlv; vlvidx++ ) {
+            vlvIndex_go_offline(pvlv[vlvidx], be);
+            vlv_acquire_lock(be);
+            vlvIndex_delete(&pvlv[vlvidx]);
+            vlv_release_lock(be);
+        }
+    }
+err_min:
+    dblayer_release_id2entry( be, db ); /* nope */
     instance_set_not_busy(inst);
 
-    LDAPDebug( LDAP_DEBUG_TRACE, "<= ldbm_back_ldbm2index\n", 0, 0, 0 );
-
     if (run_from_cmdline) {
         if (0 != dblayer_flush(li)) {
             LDAPDebug(LDAP_DEBUG_ANY,
@@ -1844,8 +1839,13 @@
     if (indexAttrs) {
         slapi_ch_free((void **)&indexAttrs);
     }
+    if (pvlv) {
+        slapi_ch_free((void **)&pvlv);
+    }
+
+    LDAPDebug( LDAP_DEBUG_TRACE, "<= ldbm_back_ldbm2index\n", 0, 0, 0 );
 
-    return (ret);
+    return return_value;
 }
 
 /*
@@ -1887,7 +1887,7 @@
     attr_index_config(be, "from db2index()", 0, argc, nsslapd_index_value, 0);
 
     for ( i=0; i<argc; i++ ) {
-        slapi_ch_free((void **)&nsslapd_index_value[i]);
+        slapi_ch_free_string(&nsslapd_index_value[i]);
     }
     return(0);
 }


Index: vlv_srch.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/back-ldbm/vlv_srch.c,v
retrieving revision 1.6
retrieving revision 1.6.2.1
diff -u -r1.6 -r1.6.2.1
--- vlv_srch.c	19 Apr 2005 22:07:38 -0000	1.6
+++ vlv_srch.c	11 Jan 2008 00:44:38 -0000	1.6.2.1
@@ -564,6 +564,8 @@
         }
         ldap_free_sort_keylist((*ppvs)->vlv_sortkey);
         attrinfo_delete(&((*ppvs)->vlv_attrinfo));
+        slapi_ch_free((void**)&((*ppvs)->vlv_name));
+        slapi_ch_free((void**)&((*ppvs)->vlv_filename));
         slapi_ch_free((void**)&((*ppvs)->vlv_mrpb));
         slapi_ch_free((void**)&((*ppvs)->vlv_syntax_plugin));
         PR_DestroyLock((*ppvs)->vlv_indexlength_lock);




More information about the Fedora-directory-commits mailing list