Hi-

(Sorry for the length, it's a pretty wonky problem).

I'm working with the IETF NFSv4 working group on a schema for storing file 
system referral information in LDAP, as part of the FedFS standard (RFC 5716).  
I'm looking for some opinions about certain details of the schema.

A "referral" is a file server response that conveys a table of file server 
hostname and export pathname pairs that are replicas of the local file set on 
that file server.  When a referral is encountered, a file system client chooses 
a row from this table and mounts that export automatically as it continues to 
traverse the file system name space.  Referrals are a standard part of both the 
NFSv4 and SMB protocols.

FedFS provides a standard way to store these rows in an LDAP database.  Each 
row is contained in a single LDAP record, called a File Set Location record.  A 
group of these records that live under the same parent record is retrieved by a 
file server to generate the table in a referral response.

Today an FSL record for an NFS referral contains among other things a UTF-8 
string server hostname, an integer port number, and a binary blob containing an 
XDR-marshalled representation of the export pathname.  Note that both the 
pathname components and hostname are represented in UTF-8 in the NFS protocol, 
which is why they are stored as UTF-8 in LDAP.

XDR was chosen because the file server doesn't have to alter the pathname data 
it reads from the LDAP server; it can just turn it around and send it 
immediately on to NFS clients.  The pathname's components are UTF-8 strings.  
The pathname is expressed as an ordered variable-length list of these strings.

The pathname separator is not stored in the XDR blob, since physical file 
systems can use different characters for this purpose (HFS+ on Mac OS uses ":", 
POSIX uses "/", and Windows uses "\").  NFS typically performs single component 
lookups on the wire, so NFS clients are never concerned with how a file server 
might separate its pathname components.

The downside of using a binary XDR blob is that it's not observable or editable 
via typical LDAP tools.  Plus, ewww.

It's been suggested that we use a file URL to represent export pathnames.  A 
file URL is expressed in US-ASCII with escaping, and the pathname separator is 
stored in the string.  A file URL also has the ability to store a hostname.

  "file://hostname/path/to/some/file"

I'm not sure this is the best fit for our purpose.  We're especially concerned 
about some of the complexities of converting escaped US-ASCII to UTF-8, and the 
use of a fixed pathname separator character.  Can we represent the full range 
of the UTF-8 code set with a US-ASCII file URL?

We could also use an NFS URL, which would allow us to express the server 
hostname, a port number, and the pathname in a single string.  But both the 
hostname and pathname are enocded in US-ASCII, not UTF-8, and the NFS URL 
format employs a fixed pathname separator character.

An alternative we have considered would store the pathname in a single-valued 
UTF-8 string attribute, including pathname separators, but also store the 
pathname separator character in a separate attribute.  A simple escaping 
mechanism would be used to represent a separator character embedded in a 
component.

We'd like to have a schema that represents referral data in a way that is 
considered natural for LDAP, can store the full richness that an NFS referral 
is capable of, and is easy to access and update with typical LDAP client tools 
like ldapmodify.

Are there other ideas we haven't considered?  What is a practical way to store 
an ordered variable-length list of strings in an LDAP attribute?  Is there a 
similar CIFS URL format that might be used to store SMB share information?

Thanks very much for your consideration.

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com


Reply via email to