From patchwork Fri Feb 1 17:20:45 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 217534 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "aserp1040.oracle.com", Issuer "VeriSign Class 3 International Server CA - G3" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 906862C0297 for ; Sat, 2 Feb 2013 04:20:53 +1100 (EST) Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r11HKoK3025112 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 1 Feb 2013 17:20:50 GMT Received: from oss.oracle.com (oss-external.oracle.com [137.254.96.51]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r11HKnFP006834 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 1 Feb 2013 17:20:49 GMT Received: from localhost ([127.0.0.1] helo=oss.oracle.com) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1U1KID-0006eb-J6; Fri, 01 Feb 2013 09:20:49 -0800 Received: from acsinet22.oracle.com ([141.146.126.238]) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1U1KIC-0006eT-BQ for fedfs-utils-devel@oss.oracle.com; Fri, 01 Feb 2013 09:20:48 -0800 Received: from userp1020.oracle.com (userp1020.oracle.com [156.151.31.79]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r11HKlKn018792 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 1 Feb 2013 17:20:48 GMT Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by userp1020.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r11HKk66023903 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Fri, 1 Feb 2013 17:20:47 GMT Received: by mail-ie0-f174.google.com with SMTP id k10so3609989iea.5 for ; Fri, 01 Feb 2013 09:20:46 -0800 (PST) X-Received: by 10.50.170.4 with SMTP id ai4mr1820970igc.40.1359739246722; Fri, 01 Feb 2013 09:20:46 -0800 (PST) Received: from seurat.1015granger.net (adsl-99-26-161-222.dsl.sfldmi.sbcglobal.net. [99.26.161.222]) by mx.google.com with ESMTPS id k5sm3266048igq.9.2013.02.01.09.20.45 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 01 Feb 2013 09:20:46 -0800 (PST) From: Chuck Lever To: fedfs-utils-devel@oss.oracle.com Date: Fri, 01 Feb 2013 12:20:45 -0500 Message-ID: <20130201172045.63192.8162.stgit@seurat.1015granger.net> In-Reply-To: <20130201171714.63192.68358.stgit@seurat.1015granger.net> References: <20130201171714.63192.68358.stgit@seurat.1015granger.net> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 X-Flow-Control-Info: class=Default reputation=ipRepBelow100 ip=209.85.223.174 ct-class=R5 ct-vol1=0 ct-vol2=8 ct-vol3=8 ct-risk=47 ct-spam1=76 ct-spam2=5 ct-bulk=5 rcpts=1 size=4345 X-MM-CT-Classification: not spam X-MM-CT-RefID: str=0001.0A090207.510BF96F.006E,ss=1,re=0.000,fgs=0 Subject: [fedfs-utils] [PATCH 07/13] libnsdb: nsdb_resolve_fsn_s() should return NOFSN if FSN record doesn't exist X-BeenThere: fedfs-utils-devel@oss.oracle.com X-Mailman-Version: 2.1.9 Precedence: list Reply-To: fedfs-utils Developers List-Id: fedfs-utils Developers List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: fedfs-utils-devel-bounces@oss.oracle.com Errors-To: fedfs-utils-devel-bounces@oss.oracle.com X-Source-IP: acsinet21.oracle.com [141.146.126.237] Currently nsdb_resolve_fsn_s() returns FEDFS_ERR_NOFSL if the requested FSN UUID cannot be resolved because it does not exist. Arguably, this is correct: after all, there are no FSL records for a non-existant FSN. However, a better error return would be FEDFS_ERR_NOFSN because that more precisely reflects the failure. At one point in the past, nsdb_resolve_fsn_s() did indeed return NOFSN if the FSN didn't exist. For example, there is logic to return that error code when the LDAP server returns LDAP_NO_SUCH_OBJECT. But our client no longer receives that LDAP result because of the particular search filter now used. The search base is now the NCE, which should always exist. Thus NO_SUCH_OBJECT is never returned by the LDAP server. The NSDB protocol document recommends slightly different search terms when resolving an FSN. Using the FSN record's DN as the search base will continue to return the FSN's FSL records, as before, but will result in LDAP_NO_SUCH_OBJECT if the FSN itself does not exist. Signed-off-by: Chuck Lever --- src/libnsdb/fileserver.c | 35 ++++++++++++++++------------------- 1 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/libnsdb/fileserver.c b/src/libnsdb/fileserver.c index ee339b0..d3f7560 100644 --- a/src/libnsdb/fileserver.c +++ b/src/libnsdb/fileserver.c @@ -67,7 +67,7 @@ __nsdb_search_nsdb_all_s(const char *func, LDAP *ld, const char *base, char *uri; if (ldap_get_option(ld, LDAP_OPT_URI, &uri) == LDAP_OPT_SUCCESS) { - xlog(D_CALL, "%s:\n ldapsearch -H %s -b \"%s\" -s %s '%s' *", + xlog(D_CALL, "%s:\n ldapsearch -H %s -b \"%s\" -s %s '%s' *", func, uri, base, nsdb_printable_scope(scope), filter); ldap_memfree(uri); } else { @@ -1010,8 +1010,7 @@ nsdb_resolve_fsn_parse_entry(LDAP *ld, LDAPMessage *entry, * * @verbatim - ldapsearch -b "nce" -s sub - (&(objectClass=fedfsFsl)(fedfsFsnUuid="fsn_uuid")) + ldapsearch -b fedfsFsnUuid="fsn_uuid","nce" -s one (objectClass=fedfsFsl) @endverbatim */ static FedFsStatus @@ -1022,19 +1021,19 @@ nsdb_resolve_fsn_find_entry_s(nsdb_t host, const char *nce, const char *fsn_uuid LDAP *ld = host->fn_ldap; struct fedfs_fsl *tmp; FedFsStatus retval; - char filter[128]; + char base[256]; int len, rc; /* watch out for buffer overflow */ - len = snprintf(filter, sizeof(filter), - "(&(objectClass=fedfsFsl)(fedfsFsnUuid=%s))", fsn_uuid); - if (len < 0 || (size_t)len > sizeof(filter)) { - xlog(D_GENERAL, "%s: filter is too long", __func__); + len = snprintf(base, sizeof(base), + "fedfsFsnUuid=%s,%s", fsn_uuid,nce); + if (len < 0 || (size_t)len > sizeof(base)) { + xlog(D_GENERAL, "%s: base DN is too long", __func__); return FEDFS_ERR_INVAL; } - rc = nsdb_search_nsdb_all_s(ld, nce, LDAP_SCOPE_SUBTREE, - filter, &response); + rc = nsdb_search_nsdb_all_s(ld, base, LDAP_SCOPE_ONE, + "(objectClass=fedfsFsl)", &response); switch (rc) { case LDAP_SUCCESS: case LDAP_REFERRAL: @@ -1323,8 +1322,7 @@ nsdb_get_fsn_parse_entry(LDAP *ld, LDAPMessage *entry, * * @verbatim - ldapsearch -b "nce" -s one - (&(objectClass=fedfsFsn)(fedfsFsnUuid="fsn_uuid")) + ldapsearch -b fedfsFsnUuid="fsn_uuid","nce" -s one (objectClass=fedfsFsn) @endverbatim */ static FedFsStatus @@ -1335,19 +1333,18 @@ nsdb_get_fsn_find_entry_s(nsdb_t host, const char *nce, const char *fsn_uuid, LDAP *ld = host->fn_ldap; struct fedfs_fsn *tmp; FedFsStatus retval; - char filter[128]; + char base[256]; int len, rc; /* watch out for buffer overflow */ - len = snprintf(filter, sizeof(filter), - "(&(objectClass=fedfsFsn)(fedfsFsnUuid=%s))", fsn_uuid); - if (len < 0 || (size_t)len > sizeof(filter)) { - xlog(D_GENERAL, "%s: filter is too long", __func__); + len = snprintf(base, sizeof(base), "fedfsFsnUuid=%s,%s", fsn_uuid, nce); + if (len < 0 || (size_t)len > sizeof(base)) { + xlog(D_GENERAL, "%s: base DN is too long", __func__); return FEDFS_ERR_INVAL; } - rc = nsdb_search_nsdb_all_s(ld, nce, LDAP_SCOPE_ONE, - filter, &response); + rc = nsdb_search_nsdb_all_s(ld, base, LDAP_SCOPE_ONE, + "(objectClass=fedfsFsn)", &response); switch (rc) { case LDAP_SUCCESS: case LDAP_REFERRAL: