ldap/schema/02common.ldif | 1 ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c | 156 +++++++++++++------------ ldap/servers/slapd/back-ldbm/ldif2ldbm.c | 70 ++++------- ldap/servers/slapd/back-ldbm/nextid.c | 15 ++ ldap/servers/slapd/back-ldbm/proto-back-ldbm.h | 5 ldap/servers/slapd/tools/dbscan.c | 41 ++++-- 6 files changed, 155 insertions(+), 133 deletions(-)
New commits: commit 666873df0752427eb187ce81c22b1d5db7914415 Author: Noriko Hosoi nhosoi@redhat.com Date: Thu Jul 29 18:04:48 2010 -0700
619595 - Upgrading sub suffix under non-normalized suffix disappears
https://bugzilla.redhat.com/show_bug.cgi?id=619595
Fix Description: The cause of this problem is the config attribute nsslapd-parent-suffix was not defined as an attribute of DN syntax. Because of the missing definition, the value is not the target of the DN normalization and the match fails after upgraded. Adding the attribute to the schema solves this problem.
Plus upgradedb does backup the DB before upgrade, and if it fails it restores from the backed up DB. Use dblayer_restore instead of copying DB files one by one.
diff --git a/ldap/schema/02common.ldif b/ldap/schema/02common.ldif index 5269d3b..d039be7 100644 --- a/ldap/schema/02common.ldif +++ b/ldap/schema/02common.ldif @@ -145,6 +145,7 @@ attributeTypes: ( 1.3.6.1.1.5 NAME 'vendorVersion' EQUALITY 1.3.6.1.4.1.1466.109 attributeTypes: ( 2.16.840.1.113730.3.1.3023 NAME 'nsViewFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' ) attributeTypes: ( 2.16.840.1.113730.3.1.2063 NAME 'nsEncryptionAlgorithm' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' ) attributeTypes: ( 2.16.840.1.113730.3.1.2093 NAME 'nsslapd-changelogsuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' ) +attributeTypes: ( 2.16.840.1.113730.3.1.2094 NAME 'nsslapd-parent-suffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' ) # # objectclasses: # diff --git a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c index 02faa82..ae59a77 100644 --- a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c +++ b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c @@ -2472,9 +2472,12 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) int server_running = 0; int rval = 0; int backup_rval = 0; + int upgrade_rval = 0; char *dest_dir = NULL; char *orig_dest_dir = NULL; char *home_dir = NULL; + char *src_dbversion = NULL; + char *dest_dbversion = NULL; int up_flags; int i; Slapi_Task *task; @@ -2649,7 +2652,7 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) inst_dir, MAXPATHLEN); backup_rval = dblayer_copy_directory(li, NULL /* task */, inst_dirp, dest_dir, 0/*backup*/, - &cnt, 0, 1, 0); + &cnt, 0, 0, 0); if (inst_dirp != inst_dir) slapi_ch_free_string(&inst_dirp); if (backup_rval < 0) @@ -2666,6 +2669,7 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) rval = upgradedb_delete_indices_4cmd(inst, up_flags); if (rval) { + upgrade_rval += rval; slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", "Can't clean up indices in %s\n", inst->inst_dir_name); continue; /* Need to make all backups; continue */ @@ -2676,6 +2680,7 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) rval = dblayer_delete_indices(inst); if (rval); { + upgrade_rval += rval; slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", "Can't clean up indices in %s\n", inst->inst_dir_name); continue; /* Need to make all backups; continue */ @@ -2685,6 +2690,7 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) rval = upgradedb_core(pb, inst); if (rval) { + upgrade_rval += rval; slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", "upgradedb: Failed to upgrade database %s\n", inst->inst_name); @@ -2698,7 +2704,13 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) /* copy transaction logs */ backup_rval += upgradedb_copy_logfiles(li, dest_dir, 0);
- if (rval) { + /* copy DBVERSION */ + home_dir = dblayer_get_home_dir(li, NULL); + src_dbversion = slapi_ch_smprintf("%s/%s", home_dir, DBVERSION_FILENAME); + dest_dbversion = slapi_ch_smprintf("%s/%s", dest_dir, DBVERSION_FILENAME); + backup_rval += dblayer_copyfile(src_dbversion, dest_dbversion, 0, 0600); + + if (upgrade_rval) { goto fail1; }
@@ -2708,8 +2720,6 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) replace_ldbm_config_value(CONFIG_IDL_SWITCH, "new", li); }
- home_dir = dblayer_get_home_dir(li, NULL); - /* write db version files */ dbversion_write(li, home_dir, NULL, DBVERSION_ALL);
@@ -2752,6 +2762,9 @@ int ldbm_back_upgradedb(Slapi_PBlock *pb) if (dest_dir != orig_dest_dir) slapi_ch_free_string(&dest_dir);
+ slapi_ch_free_string(&src_dbversion); + slapi_ch_free_string(&dest_dbversion); + return 0;
fail1: @@ -2759,7 +2772,7 @@ fail1: slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", "Failed to flush database\n");
- /* Ugly! (we started dblayer with DBLAYER_IMPORT_MODE) + /* we started dblayer with DBLAYER_IMPORT_MODE * We just want not to generate a guardian file... */ if (0 != dblayer_close(li,DBLAYER_ARCHIVE_MODE)) @@ -2769,52 +2782,25 @@ fail1: /* restore from the backup, if possible */ if (NULL != dest_dir) { - if (0 == backup_rval) /* only when the backup succeeded... */ + /* If the backup was successfull and ugrade failed... */ + if ((0 == backup_rval) && upgrade_rval) { - cnt = 0; - - for (inst_obj = objset_first_obj(li->li_instance_set); - inst_obj; - inst_obj = objset_next_obj(li->li_instance_set, inst_obj)) - { - char *restore_inst_dir = NULL; - inst = (ldbm_instance *)object_get_data(inst_obj); - restore_inst_dir = - slapi_ch_smprintf("%s/%s", dest_dir, inst->inst_dir_name); - backup_rval = dblayer_copy_directory(li, NULL /* task */, - restore_inst_dir, - inst->inst_dir_name, - 1/*restore*/, - &cnt, 0, 1, 0); - slapi_ch_free_string(&restore_inst_dir); - if (backup_rval < 0) - { - slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", - "Failed to restore index files " - "(instance %s; bakup dir: %s).\n", - inst->inst_name, dest_dir); - goto fail0; - } - } - - backup_rval = upgradedb_copy_logfiles(li, dest_dir, 1); - if (backup_rval < 0) - { - slapi_log_error(SLAPI_LOG_FATAL, "upgrade DB", - "Failed to restore log files.\n"); - goto fail0; - } + backup_rval = dblayer_restore(li, dest_dir, NULL, NULL); } - /* restore is done; clean up the backup dir */ - ldbm_delete_dirs(dest_dir); + if (0 == backup_rval) + { + ldbm_delete_dirs(dest_dir); + } } + slapi_ch_free_string(&src_dbversion); + slapi_ch_free_string(&dest_dbversion);
fail0: if (dest_dir != orig_dest_dir) slapi_ch_free_string(&dest_dir);
- return rval; + return rval + upgrade_rval; }
static void
commit baea677acb49c94b6204b26e7d7aeb20a9474f53 Author: Noriko Hosoi nhosoi@redhat.com Date: Tue Jul 27 15:35:39 2010 -0700
616608 - SIGBUS in RDN index reads on platforms with strict alignments
https://bugzilla.redhat.com/show_bug.cgi?id=616608
Fix description: Use the marshall/unmarshall technique for the entryrdn index data. Introduced sizeushort_internal_to_stored/sizeushort_stored_to_internal for the size data to store in 2 bytes.
Entryrdn related functions in the dbscan utility are also modified to support marshalled data.
Reviewed by ulf.weltman@hp.com and fixed bugs found by him.
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c index dc00d33..8b0a005 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c @@ -73,13 +73,15 @@ static int entryrdn_noancestorid = 0; #define RDN_STRINGID_LEN 64
typedef struct _rdn_elem { - PRUint32 rdn_elem_id; - PRUint16 rdn_elem_nrdn_len; /* including '\0' */ - PRUint16 rdn_elem_rdn_len; /* including '\0' */ - char rdn_elem_nrdn_rdn[1]; /* "normalized rdn" '\0' "rdn" '\0' */ + char rdn_elem_id[sizeof(ID)]; + char rdn_elem_nrdn_len[2]; /* ushort; length including '\0' */ + char rdn_elem_rdn_len[2]; /* ushort; length including '\0' */ + char rdn_elem_nrdn_rdn[1]; /* "normalized rdn" '\0' "rdn" '\0' */ } rdn_elem;
-#define RDN_ADDR(elem) ((elem)->rdn_elem_nrdn_rdn + (elem)->rdn_elem_nrdn_len) +#define RDN_ADDR(elem) \ + ((elem)->rdn_elem_nrdn_rdn + \ + sizeushort_stored_to_internal((elem)->rdn_elem_nrdn_len))
/* helper functions */ static rdn_elem *_entryrdn_new_rdn_elem(backend *be, ID id, Slapi_RDN *srdn, size_t *length); @@ -356,7 +358,7 @@ entryrdn_index_read(backend *be, if (rc) { goto bail; } - *id = elem->rdn_elem_id; + *id = id_stored_to_internal(elem->rdn_elem_id);
bail: /* Close the cursor */ @@ -423,6 +425,7 @@ entryrdn_rename_subtree(backend *be, size_t oldsupelemlen = 0; const Slapi_DN *mynewsupsdn = NULL; Slapi_RDN *mynewsrdn = NULL; + ID targetid = 0;
slapi_log_error(SLAPI_LOG_TRACE, ENTRYRDN_TAG, "--> entryrdn_rename_subtree\n"); @@ -568,6 +571,7 @@ entryrdn_rename_subtree(backend *be, slapi_sdn_get_dn(oldsdn), rc); goto bail; } + targetid = id_stored_to_internal(targetelem->rdn_elem_id); targetelemlen = _entryrdn_rdn_elem_size(targetelem); if (oldsupelem) { oldsupelemlen = _entryrdn_rdn_elem_size(oldsupelem); @@ -577,8 +581,8 @@ entryrdn_rename_subtree(backend *be, /* 2) update targetelem's child link, if renaming the target */ if (mynewsrdn) { /* remove the old elem; (1) rename targetelem */ - keybuf = slapi_ch_smprintf("%d:%s", - targetelem->rdn_elem_id, targetelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%u:%s", + targetid, targetelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -593,8 +597,8 @@ entryrdn_rename_subtree(backend *be, } if (childelems) { slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, - targetelem->rdn_elem_id, targetelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, + targetid, targetelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -614,8 +618,7 @@ entryrdn_rename_subtree(backend *be,
/* add the new elem */ slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%d:%s", - newelem->rdn_elem_id, newelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%u:%s", id, newelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -633,8 +636,8 @@ entryrdn_rename_subtree(backend *be, } if (childelems) { slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, - newelem->rdn_elem_id, newelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, id, + newelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -656,9 +659,8 @@ entryrdn_rename_subtree(backend *be, /* 3) update targetelem's parent link, if any */ if (oldsupelem) { slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, - targetelem->rdn_elem_id, - targetelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, + targetid, targetelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -676,9 +678,8 @@ entryrdn_rename_subtree(backend *be, if (mynewsrdn) { slapi_ch_free_string(&keybuf); key.flags = DB_DBT_USERMEM; - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, - newelem->rdn_elem_id, - newelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, + id, newelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1;
@@ -716,8 +717,9 @@ entryrdn_rename_subtree(backend *be, for (cep = childelems; cep && *cep; cep++) { /* remove the old elem */ slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, - (*cep)->rdn_elem_id, (*cep)->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, + id_stored_to_internal((*cep)->rdn_elem_id), + (*cep)->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -750,9 +752,9 @@ entryrdn_rename_subtree(backend *be, if (oldsupelem) { /* remove the old elem */ slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, - oldsupelem->rdn_elem_id, - oldsupelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, + id_stored_to_internal(oldsupelem->rdn_elem_id), + oldsupelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -769,9 +771,9 @@ entryrdn_rename_subtree(backend *be, /* add the new elem */ if (mynewsupsdn) { slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, - newsupelem->rdn_elem_id, - newsupelem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, + id_stored_to_internal(newsupelem->rdn_elem_id), + newsupelem->rdn_elem_nrdn_rdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -924,24 +926,24 @@ entryrdn_get_subordinates(backend *be, NULL, &childelems, db_txn);
for (cep = childelems; cep && *cep; cep++) { + ID childid = id_stored_to_internal((*cep)->rdn_elem_id); /* set direct children to the idlist */ - rc = idl_append_extend(subordinates, (*cep)->rdn_elem_id); + rc = idl_append_extend(subordinates, childid); if (rc) { slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, "entryrdn_get_subordinates: Appending %d to idl " - "for direct children failed (%d)\n", - (*cep)->rdn_elem_id, rc); + "for direct children failed (%d)\n", childid, rc); goto bail; }
/* set indirect subordinates to the idlist */ rc = _entryrdn_append_childidl(cursor, (*cep)->rdn_elem_nrdn_rdn, - (*cep)->rdn_elem_id, subordinates); + childid, subordinates); if (rc) { slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, "entryrdn_get_subordinates: Appending %d to idl " "for indirect children failed (%d)\n", - (*cep)->rdn_elem_id, rc); + childid, rc); goto bail; } } @@ -1062,7 +1064,7 @@ entryrdn_lookup_dn(backend *be, do { /* Setting up a key for the node to get its parent */ slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, workid, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, workid, nrdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -1118,7 +1120,7 @@ retry_get1: #endif slapi_ch_free_string(&nrdn); nrdn = slapi_ch_strdup(elem->rdn_elem_nrdn_rdn); - workid = elem->rdn_elem_id; + workid = id_stored_to_internal(elem->rdn_elem_id); /* 1 is byref, and the dup'ed rdn is freed with srdn */ slapi_rdn_add_rdn_to_all_rdns(srdn, slapi_ch_strdup(RDN_ADDR(elem)), 1); } while (workid); @@ -1228,7 +1230,7 @@ entryrdn_get_parent(backend *be,
/* Setting up a key for the node to get its parent */ slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, id, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, id, nrdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -1269,7 +1271,7 @@ retry_get1: #ifdef LDAP_DEBUG_ENTRYRDN _entryrdn_dump_rdn_elem(elem); #endif - *pid = elem->rdn_elem_id; + *pid = id_stored_to_internal(elem->rdn_elem_id); *prdn = slapi_ch_strdup(RDN_ADDR(elem)); bail: slapi_ch_free_string(&nrdn); @@ -1339,11 +1341,11 @@ _entryrdn_new_rdn_elem(backend *be, nrdn_len = strlen(nrdn) + 1; *length = sizeof(rdn_elem) + rdn_len + nrdn_len; re = (rdn_elem *)slapi_ch_malloc(*length); - re->rdn_elem_id = id; - re->rdn_elem_nrdn_len = nrdn_len; - re->rdn_elem_rdn_len = rdn_len; - PR_snprintf(re->rdn_elem_nrdn_rdn, re->rdn_elem_nrdn_len, nrdn); - PR_snprintf(RDN_ADDR(re), re->rdn_elem_rdn_len, rdn); + id_internal_to_stored(id, re->rdn_elem_id); + sizeushort_internal_to_stored(nrdn_len, re->rdn_elem_nrdn_len); + sizeushort_internal_to_stored(rdn_len, re->rdn_elem_rdn_len); + PR_snprintf(re->rdn_elem_nrdn_rdn, nrdn_len, nrdn); + PR_snprintf(RDN_ADDR(re), rdn_len, rdn);
slapi_log_error(SLAPI_LOG_TRACE, ENTRYRDN_TAG, "<-- _entryrdn_new_rdn_elem\n"); @@ -1363,7 +1365,8 @@ static size_t _entryrdn_rdn_elem_size(rdn_elem *elem) { size_t len = sizeof(rdn_elem); - len += elem->rdn_elem_rdn_len + elem->rdn_elem_nrdn_len; + len += sizeushort_stored_to_internal(elem->rdn_elem_rdn_len) + + sizeushort_stored_to_internal(elem->rdn_elem_nrdn_len); return len; }
@@ -1376,16 +1379,16 @@ _entryrdn_dump_rdn_elem(rdn_elem *elem) return; } slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, "RDN ELEMENT:\n"); - slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " ID: %d\n", - elem->rdn_elem_id); + slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " ID: %u\n", + id_stored_to_internal(elem->rdn_elem_id)); slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " RDN: "%s"\n", - RDN_ADDR(elem)); + RDN_ADDR(elem)); slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " RDN length: %u\n", - elem->rdn_elem_rdn_len); + sizeushort_stored_to_internal(elem->rdn_elem_rdn_len)); slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " Normalized RDN: "%s"\n", - elem->rdn_elem_nrdn_rdn); + elem->rdn_elem_nrdn_rdn); slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, " Normalized RDN length: %u\n", - elem->rdn_elem_nrdn_len); + sizeushort_stored_to_internal(elem->rdn_elem_nrdn_len)); return; } #endif @@ -1674,6 +1677,7 @@ _entryrdn_insert_key_elems(backend *be, char *keybuf = NULL; size_t len = 0; int rc = 0; + ID myid = 0;
slapi_log_error(SLAPI_LOG_TRACE, ENTRYRDN_TAG, "--> _entryrdn_insert_key_elems\n"); @@ -1702,11 +1706,13 @@ _entryrdn_insert_key_elems(backend *be, goto bail; }
+ myid = id_stored_to_internal(elem->rdn_elem_id); + /* adding RDN to the self key */ slapi_ch_free_string(&keybuf); /* Generate a key for self rdn */ /* E.g., 222:uid=tuser0 */ - keybuf = slapi_ch_smprintf("%d:%s", elem->rdn_elem_id, elem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%u:%s", myid, elem->rdn_elem_nrdn_rdn); key->data = keybuf; key->size = key->ulen = strlen(keybuf) + 1; key->flags = DB_DBT_USERMEM; @@ -1720,7 +1726,8 @@ _entryrdn_insert_key_elems(backend *be, slapi_ch_free_string(&keybuf); /* Generate a key for parent rdn */ /* E.g., P222:uid=tuser0 */ - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_PARENT, elem->rdn_elem_id, elem->rdn_elem_nrdn_rdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, + myid, elem->rdn_elem_nrdn_rdn); key->data = keybuf; key->size = key->ulen = strlen(keybuf) + 1; key->flags = DB_DBT_USERMEM; @@ -1857,7 +1864,7 @@ _entryrdn_insert_key(backend *be, goto bail; } /* workid: ID of suffix */ - workid = elem->rdn_elem_id; + workid = id_stored_to_internal(elem->rdn_elem_id); parentelem = elem; elem = NULL;
@@ -1869,7 +1876,7 @@ _entryrdn_insert_key(backend *be, &childnrdn, FLAG_ALL_NRDNS); /* Generate a key for child tree */ /* E.g., C1:dc=example,dc=com */ - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, workid, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, workid, nrdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -1913,7 +1920,7 @@ _entryrdn_insert_key(backend *be, /* keybuf (C#:<parent_rdn>) is consumed in _entryrdn_insert_key_elems */ /* set id to the elem to be added */ - elem->rdn_elem_id = id; + id_internal_to_stored(id, elem->rdn_elem_id); rc = _entryrdn_insert_key_elems(be, cursor, srdn, &key, parentelem, elem, len, db_txn); keybuf = NULL; @@ -1937,17 +1944,18 @@ _entryrdn_insert_key(backend *be, slapi_ch_free((void **)&tmpelem); goto bail; } else { /* rc == 0; succeeded to get an element */ + ID currid = 0; slapi_ch_free((void **)&elem); elem = tmpelem; + currid = id_stored_to_internal(elem->rdn_elem_id); if (0 == rdnidx) { /* Child is a Leaf RDN to be added */ - if (elem->rdn_elem_id == id) { + if (currid == id) { /* already in the file */ /* do nothing and return. */ rc = 0; slapi_log_error(SLAPI_LOG_TRACE, ENTRYRDN_TAG, - "_entryrdn_insert_key: ID %d is " - "already in the index. NOOP.\n", - elem->rdn_elem_id); + "_entryrdn_insert_key: ID %d is already " + "in the index. NOOP.\n", currid); } else { /* different id, error return */ char *dn = NULL; int tmprc = slapi_rdn_get_dn(srdn, &dn); @@ -1957,7 +1965,7 @@ _entryrdn_insert_key(backend *be, "is already in the %s file with different ID " "%d. Expected ID is %d.\n", tmprc?"rdn":"dn", tmprc?childnrdn:dn, - LDBM_ENTRYRDN_STR, elem->rdn_elem_id, id); + LDBM_ENTRYRDN_STR, currid, id); slapi_ch_free_string(&dn); /* returning special error code for the upgrade */ rc = LDBM_ERROR_FOUND_DUPDN; @@ -1965,7 +1973,7 @@ _entryrdn_insert_key(backend *be, goto bail; } else { /* if (0 != rdnidx) */ nrdn = childnrdn; - workid = elem->rdn_elem_id; + workid = currid; slapi_ch_free((void **)&parentelem); parentelem = elem; elem = NULL; @@ -2046,7 +2054,7 @@ _entryrdn_delete_key(backend *be, }
/* check if the target element has a child or not */ - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, id, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, id, nrdn); key.data = (void *)keybuf; key.size = key.ulen = strlen(nrdn) + 1; key.flags = DB_DBT_USERMEM; @@ -2082,7 +2090,7 @@ retry_get0: if (NULL == parentnrdn && NULL == selfnrdn) { /* First, deleting parent link */ /* E.g., P10:uid=tuser0 */ - keybuf = slapi_ch_smprintf("%c%d:%s", + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_PARENT, workid, nrdn); rc = slapi_rdn_partial_dup(srdn, &tmpsrdn, 1); if (rc) { @@ -2106,7 +2114,7 @@ retry_get0: } } else if (parentnrdn) { /* Then, the child link from the parent */ - keybuf = slapi_ch_smprintf("%c%d:%s", + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, workid, parentnrdn); elem = _entryrdn_new_rdn_elem(be, id, srdn, &len); if (NULL == elem) { @@ -2123,7 +2131,7 @@ retry_get0: if (issuffix) { keybuf = slapi_ch_smprintf("%s", selfnrdn); } else { - keybuf = slapi_ch_smprintf("%d:%s", workid, selfnrdn); + keybuf = slapi_ch_smprintf("%u:%s", workid, selfnrdn); } elem = _entryrdn_new_rdn_elem(be, id, srdn, &len); if (NULL == elem) { @@ -2170,7 +2178,7 @@ retry_get0: _entryrdn_dump_rdn_elem(elem); #endif parentnrdn = slapi_ch_strdup(elem->rdn_elem_nrdn_rdn); - workid = elem->rdn_elem_id; + workid = id_stored_to_internal(elem->rdn_elem_id);
/* deleteing the parent link */ /* the cursor is set at the parent link by _entryrdn_get_elem */ @@ -2318,7 +2326,7 @@ _entryrdn_index_read(backend *be, goto bail; } /* workid: ID of suffix */ - id = (*elem)->rdn_elem_id; + id = id_stored_to_internal((*elem)->rdn_elem_id);
do { slapi_ch_free_string(&keybuf); @@ -2374,7 +2382,7 @@ _entryrdn_index_read(backend *be,
/* Generate a key for child tree */ /* E.g., C1:dc=example,dc=com */ - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, id, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, id, nrdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -2410,7 +2418,7 @@ _entryrdn_index_read(backend *be, "_entryrdn_index_read: %s matched normalized child " "rdn %s\n", (*elem)->rdn_elem_nrdn_rdn, childnrdn); #endif - id = (*elem)->rdn_elem_id; + id = id_stored_to_internal((*elem)->rdn_elem_id); nrdn = childnrdn;
if (0 == id) { @@ -2426,7 +2434,7 @@ _entryrdn_index_read(backend *be, static char buffer[RDN_BULK_FETCH_BUFFER_SIZE];
slapi_ch_free_string(&keybuf); - keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, id, nrdn); + keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, id, nrdn); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; key.flags = DB_DBT_USERMEM; @@ -2510,7 +2518,7 @@ _entryrdn_append_childidl(DBC *cursor, IDList **affectedidl) { /* E.g., C5:ou=accounting */ - char *keybuf = slapi_ch_smprintf("%c%d:%s", RDN_INDEX_CHILD, id, nrdn); + char *keybuf = slapi_ch_smprintf("%c%u:%s", RDN_INDEX_CHILD, id, nrdn); DBT key, data; static char buffer[RDN_BULK_FETCH_BUFFER_SIZE]; int rc = 0; @@ -2549,6 +2557,7 @@ retry_get0: void *ptr; DB_MULTIPLE_INIT(ptr, &data); do { + ID myid = 0; myelem = NULL; memset(&dataret, 0, sizeof(dataret)); DB_MULTIPLE_NEXT(ptr, &data, dataret.data, dataret.size); @@ -2556,16 +2565,17 @@ retry_get0: break; } myelem = (rdn_elem *)dataret.data; - rc = idl_append_extend(affectedidl, myelem->rdn_elem_id); + myid = id_stored_to_internal(myelem->rdn_elem_id); + rc = idl_append_extend(affectedidl, myid); if (rc) { slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, "_entryrdn_append_childidl: Appending %d to " - "affectedidl failed (%d)\n", myelem->rdn_elem_id, rc); + "affectedidl failed (%d)\n", myid, rc); goto bail; } rc = _entryrdn_append_childidl(cursor, (const char *)myelem->rdn_elem_nrdn_rdn, - myelem->rdn_elem_id, affectedidl); + myid, affectedidl); if (rc) { goto bail; } diff --git a/ldap/servers/slapd/back-ldbm/nextid.c b/ldap/servers/slapd/back-ldbm/nextid.c index 02d381b..bc9ec3e 100644 --- a/ldap/servers/slapd/back-ldbm/nextid.c +++ b/ldap/servers/slapd/back-ldbm/nextid.c @@ -232,3 +232,18 @@ ID id_stored_to_internal(char* b) i |= ((ID)b[0]) << 24; return i; } + +void sizeushort_internal_to_stored(size_t i,char *b) +{ + PRUint16 ui = (PRUint16)(i & 0xffff); + b[0] = (char)(ui >> 8); + b[1] = (char)ui; +} + +size_t sizeushort_stored_to_internal(char* b) +{ + size_t i; + i = (PRUint16)b[1] & 0x000000ff; + i |= (((PRUint16)b[0]) << 8) & 0x0000ff00; + return i; +} diff --git a/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h b/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h index 5b77684..90ac570 100644 --- a/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h +++ b/ldap/servers/slapd/back-ldbm/proto-back-ldbm.h @@ -374,9 +374,8 @@ void next_id_return( backend *be, ID id ); ID next_id_get( backend *be ); void id_internal_to_stored(ID,char*); ID id_stored_to_internal(char*); -#if 0 -int write_dbversion( ldbm_instance *inst ); -#endif +void sizeushort_internal_to_stored(size_t i,char *b); +size_t sizeushort_stored_to_internal(char* b); void get_ids_from_disk(backend *be); void get_both_ids( struct ldbminfo *li, ID *nextid, ID *nextid2index );
diff --git a/ldap/servers/slapd/tools/dbscan.c b/ldap/servers/slapd/tools/dbscan.c index 320f5ed..69c693f 100644 --- a/ldap/servers/slapd/tools/dbscan.c +++ b/ldap/servers/slapd/tools/dbscan.c @@ -128,13 +128,16 @@ typedef struct {
#define RDN_BULK_FETCH_BUFFER_SIZE (8*1024) typedef struct _rdn_elem { - PRUint32 rdn_elem_id; - PRUint16 rdn_elem_nrdn_len; /* including '\0' */ - PRUint16 rdn_elem_rdn_len; /* including '\0' */ - char rdn_elem_nrdn_rdn[1]; /* "normalized rdn" '\0' "rdn" '\0' */ + char rdn_elem_id[sizeof(ID)]; + char rdn_elem_nrdn_len[2]; /* ushort; length including '\0' */ + char rdn_elem_rdn_len[2]; /* ushort; length including '\0' */ + char rdn_elem_nrdn_rdn[1]; /* "normalized rdn" '\0' "rdn" '\0' */ } rdn_elem;
-#define RDN_ADDR(elem) ((elem)->rdn_elem_nrdn_rdn + (elem)->rdn_elem_nrdn_len) + +#define RDN_ADDR(elem) \ + ((elem)->rdn_elem_nrdn_rdn + \ + sizeushort_stored_to_internal((elem)->rdn_elem_nrdn_len))
static void display_entryrdn_parent(DB *db, ID id, const char *nrdn, int indent); static void display_entryrdn_self(DB *db, ID id, const char *nrdn, int indent); @@ -443,6 +446,14 @@ static void id_internal_to_stored(ID i,char *b) b[3] = (char)i; }
+static size_t sizeushort_stored_to_internal(char* b) +{ + size_t i; + i = (PRUint16)b[1] & 0x000000ff; + i |= (((PRUint16)b[0]) << 8) & 0x0000ff00; + return i; +} + void _cl5ReadMod(char **buff) { char *pos = *buff; @@ -745,7 +756,7 @@ static void display_item(DBC *cursor, DBT *key, DBT *data) } else if (file_type & ENTRYTYPE) { /* id2entry file */ ID entry_id = id_stored_to_internal(key->data); - printf("id %d\n", entry_id); + printf("id %u\n", entry_id); printf("\t%s\n", format_entry(data->data, data->size, buf, buflen)); } else { /* user didn't tell us what kind of file, dump it raw */ @@ -765,8 +776,9 @@ _entryrdn_dump_rdn_elem(char *key, rdn_elem *elem, int indent) for (p = indentp; p < endp; p++) *p = ' '; *p = '\0'; printf("%s\n", key); - printf("%sID: %d; RDN: "%s"; NRDN: "%s"\n", - indentp, elem->rdn_elem_id, RDN_ADDR(elem), elem->rdn_elem_nrdn_rdn); + printf("%sID: %u; RDN: "%s"; NRDN: "%s"\n", + indentp, id_stored_to_internal(elem->rdn_elem_id), + RDN_ADDR(elem), elem->rdn_elem_nrdn_rdn); free(indentp); }
@@ -785,7 +797,7 @@ display_entryrdn_self(DB *db, ID id, const char *nrdn, int indent) printf("Can't create db cursor: %s\n", db_strerror(rc)); exit(1); } - snprintf(buffer, sizeof(buffer), "%d:%s", id, nrdn); + snprintf(buffer, sizeof(buffer), "%u:%s", id, nrdn); keybuf = strdup(buffer); key.data = keybuf; key.size = key.ulen = strlen(keybuf) + 1; @@ -803,9 +815,9 @@ display_entryrdn_self(DB *db, ID id, const char *nrdn, int indent)
elem = (rdn_elem *)data.data; _entryrdn_dump_rdn_elem(keybuf, elem, indent); - display_entryrdn_parent(db, elem->rdn_elem_id, + display_entryrdn_parent(db, id_stored_to_internal(elem->rdn_elem_id), elem->rdn_elem_nrdn_rdn, indent); - display_entryrdn_children(db, elem->rdn_elem_id, + display_entryrdn_children(db, id_stored_to_internal(elem->rdn_elem_id), elem->rdn_elem_nrdn_rdn, indent); bail: if (keybuf) { @@ -903,7 +915,7 @@ display_entryrdn_children(DB *db, ID id, const char *nrdn, int indent) for (;;) { elem = (rdn_elem *)data.data; _entryrdn_dump_rdn_elem(keybuf, elem, indent); - display_entryrdn_self(db, elem->rdn_elem_id, + display_entryrdn_self(db, id_stored_to_internal(elem->rdn_elem_id), elem->rdn_elem_nrdn_rdn, indent); rc = cursor->c_get(cursor, &key, &data, DB_NEXT_DUP); if (rc) { @@ -950,9 +962,8 @@ display_entryrdn_item(DB *db, DBC *cursor, DBT *key)
elem = (rdn_elem *)data.data; _entryrdn_dump_rdn_elem((char *)key->data, elem, indent); - display_entryrdn_children(db, elem->rdn_elem_id, - elem->rdn_elem_nrdn_rdn, - indent); + display_entryrdn_children(db, id_stored_to_internal(elem->rdn_elem_id), + elem->rdn_elem_nrdn_rdn, indent); } else { /* otherwise, display all from the HEAD to TAIL */ char buffer[RDN_BULK_FETCH_BUFFER_SIZE]; DBT dataret;
389-commits@lists.fedoraproject.org