[fedfs-utils] [PATCH 1/6] libnsdb: Check all NCEs an NSDB might have

Chuck Lever chuck.lever at oracle.com
Wed May 4 15:12:51 PDT 2011


When checking for an FSN that doesn't exist, the NSDB library returns
FEDFS_ERR_NONCE, which is incorrect.  It should return
FEDFS_ERR_NOFSN.

The loop that walks the naming contexts looking for NCE prefixes is
not correct.  A separate loop is needed to construct a list of NSDB
container entries first.  Only if this loop fails to discover any NCEs
should we return FEDFS_ERR_NONCE.

This logic now matches the algorithm described in sections 5.2.1 and
5.2.2 of the NSDB protocol draft.

Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
---

 src/libnsdb/fileserver.c |   85 +++++++++++++++++++++++++++++++---------------
 1 files changed, 58 insertions(+), 27 deletions(-)

diff --git a/src/libnsdb/fileserver.c b/src/libnsdb/fileserver.c
index 47980fa..aa1079e 100644
--- a/src/libnsdb/fileserver.c
+++ b/src/libnsdb/fileserver.c
@@ -944,9 +944,9 @@ FedFsStatus
 nsdb_resolve_fsn_s(nsdb_t host, const char *nce, const char *fsn_uuid,
 		struct fedfs_fsl **fsls, unsigned int *ldap_err)
 {
-	char **contexts, *try;
+	char **contexts, **nce_list;
 	FedFsStatus retval;
-	int i;
+	int i, j;
 
 	if (host->fn_ldap == NULL) {
 		xlog(L_ERROR, "%s: NSDB not open", __func__);
@@ -958,26 +958,43 @@ nsdb_resolve_fsn_s(nsdb_t host, const char *nce, const char *fsn_uuid,
 						fsn_uuid, fsls, ldap_err);
 
 	/*
-	 * Caller did not provide an nce.  Discover the server's NSDB
-	 * container entry.
+	 * Caller did not provide an nce.  Generate a list
+	 * of the server's NSDB container entries.
 	 */
 	retval = nsdb_get_naming_contexts_s(host, &contexts, ldap_err);
 	if (retval != FEDFS_OK)
 		return retval;
 
-	for (i = 0; contexts[i] != NULL; i++) {
-		retval = nsdb_get_nceprefix_s(host, contexts[i], &try, ldap_err);
-		if (retval == FEDFS_OK) {
-			retval = nsdb_resolve_fsn_find_entry_s(host->fn_ldap, try,
-							fsn_uuid, fsls, ldap_err);
-			free(try);
-			if (retval == FEDFS_OK)
-				break;
-		} else if (retval != FEDFS_ERR_NSDB_NONCE)
+	for (i = 0; contexts[i] != NULL; i++);
+	nce_list = calloc(i + 1, sizeof(char *));
+	if (nce_list == NULL) {
+		retval = FEDFS_ERR_SVRFAULT;
+		goto out;
+	}
+
+	/*
+	 * Query only naming contexts that have an NCE prefix
+	 */
+	for (i = 0, j = 0; contexts[i] != NULL; i++) {
+		retval = nsdb_get_nceprefix_s(host, contexts[i],
+						&nce_list[j], ldap_err);
+		if (retval == FEDFS_OK)
+			j++;
+	}
+	if (j == 0)
+		goto out;
+
+	for (j = 0; nce_list[j] != NULL; j++) {
+		retval = nsdb_resolve_fsn_find_entry_s(host->fn_ldap,
+							nce_list[j], fsn_uuid,
+							fsls, ldap_err);
+		if (retval == FEDFS_OK)
 			break;
 	}
-	nsdb_free_string_array(contexts);
 
+out:
+	nsdb_free_string_array(nce_list);
+	nsdb_free_string_array(contexts);
 	return retval;
 }
 
@@ -1180,9 +1197,9 @@ out:
 FedFsStatus
 nsdb_list_s(nsdb_t host, const char *nce, char ***fsns, unsigned int *ldap_err)
 {
-	char **contexts, *try;
+	char **contexts, **nce_list;
 	FedFsStatus retval;
-	int i;
+	int i, j;
 
 	if (host->fn_ldap == NULL) {
 		xlog(L_ERROR, "%s: NSDB not open", __func__);
@@ -1202,18 +1219,32 @@ nsdb_list_s(nsdb_t host, const char *nce, char ***fsns, unsigned int *ldap_err)
 	if (retval != FEDFS_OK)
 		return retval;
 
-	for (i = 0; contexts[i] != NULL; i++) {
-		retval = nsdb_get_nceprefix_s(host, contexts[i], &try, ldap_err);
-		if (retval == FEDFS_OK) {
-			retval = nsdb_list_find_entries_s(host->fn_ldap, try, fsns,
-								ldap_err);
-			free(try);
-			if (retval == FEDFS_OK)
-				break;
-		} else if (retval != FEDFS_ERR_NSDB_NONCE)
-			break;
+	for (i = 0; contexts[i] != NULL; i++);
+	nce_list = calloc(i + 1, sizeof(char *));
+	if (nce_list == NULL) {
+		retval = FEDFS_ERR_SVRFAULT;
+		goto out;
 	}
-	nsdb_free_string_array(contexts);
 
+	/*
+	 * List only naming contexts that have an NCE prefix
+	 */
+	for (i = 0, j = 0; contexts[i] != NULL; i++) {
+		retval = nsdb_get_nceprefix_s(host, contexts[i],
+						&nce_list[j], ldap_err);
+		if (retval == FEDFS_OK)
+			j++;
+	}
+	if (j == 0)
+		goto out;
+
+	for (j = 0; nce_list[j] != NULL; j++)
+		nsdb_list_find_entries_s(host->fn_ldap, nce_list[j],
+						fsns, ldap_err);
+	retval = FEDFS_OK;
+
+out:
+	nsdb_free_string_array(nce_list);
+	nsdb_free_string_array(contexts);
 	return retval;
 }




More information about the fedfs-utils-devel mailing list