RPM Community Forums

Mailing List Message of <rpm-devel>

Re: [CVS] RPM: rpm/ CHANGES rpm/rpmio/ librpmio.vers rpmdav.c rpmhash.c rp...

From: Jeff Johnson <n3npq@mac.com>
Date: Fri 08 Feb 2008 - 19:02:12 CET
Message-Id: <DFF58875-0266-4120-AA30-0A89D73FC92D@mac.com>
Um, this is a really deep hack that likely needs some context.

rpmio overloads standard system calls and library routines,  
permitting URI's instead of paths.

which mostly "works" or rpmio would have crashed and burned years ago.

what gets extremely slippery is devising URI analogues for intrinsically
per-system kernel values: devs, inodes, etc etc.

Specifically st->st_ino and dp->d_ino are used and needed for Stat/ 
Opendir/Glob/Fts
overloading.

this patch is the start of an attempt to use a hash on path as a  
persistent
constant value for st->st_ino and dp->d_ino on remote URI's. That's  
certainly
better than what was done before, incrementing a static integer to  
force uniqueness.

Any informed and forward looking comments/critique on the  
implementation are appreciated.

Yes, "." and ".." have incorrect values for both st->st_ino and dp- 
 >d_ino atm ;-)

73 de Jeff

On Feb 8, 2008, at 12:42 PM, Jeff Johnson wrote:

>   RPM Package Manager, CVS Repository
>   http://rpm5.org/cvs/
>    
> ______________________________________________________________________ 
> ______
>
>   Server: rpm5.org                         Name:   Jeff Johnson
>   Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
>   Module: rpm                              Date:   08-Feb-2008  
> 18:42:48
>   Branch: HEAD                             Handle: 2008020817424701
>
>   Modified files:
>     rpm                     CHANGES
>     rpm/rpmio               librpmio.vers rpmdav.c rpmhash.c rpmhash.h
>                             rpmrpc.c
>
>   Log:
>     - jbj: use hashFunctionString on URI path for st->st_ino/dp- 
> >d_ino values.
>     - jbj: rpmhash: expose hash{Equality,Function}String routines.
>
>   Summary:
>     Revision    Changes     Path
>     1.2153      +2  -0      rpm/CHANGES
>     2.36        +2  -0      rpm/rpmio/librpmio.vers
>     2.58        +24 -17     rpm/rpmio/rpmdav.c
>     1.10        +8  -23     rpm/rpmio/rpmhash.c
>     1.5         +24 -5      rpm/rpmio/rpmhash.h
>     2.65        +22 -16     rpm/rpmio/rpmrpc.c
>    
> ______________________________________________________________________ 
> ______
>
>   patch -p0 <<'@@ .'
>   Index: rpm/CHANGES
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.2152 -r1.2153 CHANGES
>   --- rpm/CHANGES	8 Feb 2008 16:31:43 -0000	1.2152
>   +++ rpm/CHANGES	8 Feb 2008 17:42:47 -0000	1.2153
>   @@ -1,4 +1,6 @@
>    5.0.0 -> 5.1a1:
>   +    - jbj: use hashFunctionString on URI path for st->st_ino/dp- 
> >d_ino values.
>   +    - jbj: rpmhash: expose hash{Equality,Function}String routines.
>        - jbj: tweak up tdir debugging spew, add a Fts(3) stopwatch,  
> append pesky /.
>        - jbj: tweak up tfts debugging spew, add a Fts(3) stopwatch,  
> append pesky /.
>        - jbj: rpmsw: add rpmswPrint to display stopwtch results.
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/librpmio.vers
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.35 -r2.36 librpmio.vers
>   --- rpm/rpmio/librpmio.vers	8 Feb 2008 15:08:14 -0000	2.35
>   +++ rpm/rpmio/librpmio.vers	8 Feb 2008 17:42:48 -0000	2.36
>   @@ -114,6 +114,8 @@
>        _Glob_pattern_p;
>        gnameToGid;
>        gzdio;
>   +    hashEqualityString;
>   +    hashFunctionString;
>        htAddEntry;
>        htCreate;
>        htFree;
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmdav.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.57 -r2.58 rpmdav.c
>   --- rpm/rpmio/rpmdav.c	8 Feb 2008 15:08:14 -0000	2.57
>   +++ rpm/rpmio/rpmdav.c	8 Feb 2008 17:42:48 -0000	2.58
>   @@ -63,8 +63,10 @@
>    #define _RPMDAV_INTERNAL
>    #include <rpmdav.h>
>
>   -#include "argv.h"
>   -#include "ugid.h"
>   +#include <rpmhash.h>
>   +#include <argv.h>
>   +#include <ugid.h>
>   +
>    #include "debug.h"
>
>    /* Should http OPTIONS be run only once? */
>   @@ -1469,12 +1471,9 @@
>        return buf;
>    }
>
>   -/*@unchecked@*/
>   -static unsigned int dav_st_ino = 0xdead0000;
>   -
>    int davStat(const char * path, /*@out@*/ struct stat *st)
>   -	/*@globals dav_st_ino, fileSystem, internalState @*/
>   -	/*@modifies *st, dav_st_ino, fileSystem, internalState @*/
>   +	/*@globals fileSystem, internalState @*/
>   +	/*@modifies *st, fileSystem, internalState @*/
>    {
>        struct fetch_context_s * ctx = NULL;
>        char buf[1024];
>   @@ -1507,9 +1506,10 @@
>    	st->st_mode |= 0644;
>        }
>
>   -    /* XXX fts(3) needs/uses st_ino, make something up for now. */
>   +    /* XXX Fts(3) needs/uses st_ino. */
>   +    /* Hash the path to generate a st_ino analogue. */
>        if (st->st_ino == 0)
>   -	st->st_ino = dav_st_ino++;
>   +	st->st_ino = hashFunctionString(0, path, 0);
>
>    exit:
>    if (_dav_debug < 0)
>   @@ -1519,8 +1519,8 @@
>    }
>
>    int davLstat(const char * path, /*@out@*/ struct stat *st)
>   -	/*@globals dav_st_ino, fileSystem, internalState @*/
>   -	/*@modifies *st, dav_st_ino, fileSystem, internalState @*/
>   +	/*@globals fileSystem, internalState @*/
>   +	/*@modifies *st, fileSystem, internalState @*/
>    {
>        struct fetch_context_s * ctx = NULL;
>        char buf[1024];
>   @@ -1552,9 +1552,11 @@
>    	st->st_mode |= 0644;
>        }
>
>   -    /* XXX fts(3) needs/uses st_ino, make something up for now. */
>   +    /* XXX fts(3) needs/uses st_ino. */
>   +    /* Hash the path to generate a st_ino analogue. */
>        if (st->st_ino == 0)
>   -	st->st_ino = dav_st_ino++;
>   +	st->st_ino = hashFunctionString(0, path, 0);
>   +
>    if (_dav_debug < 0)
>    fprintf(stderr, "*** davLstat(%s) rc %d\n%s\n", path, rc, statstr 
> (st, buf));
>    exit:
>   @@ -1673,7 +1675,9 @@
>
>        /* XXX glob(3) uses REAL_DIR_ENTRY(dp) test on d_ino */
>    /*@-type@*/
>   -    dp->d_ino = i + 1;		/* W2DO? */
>   +    /* Hash the name (starting with parent hash) for a d_ino  
> analogue. */
>   +    dp->d_ino = hashFunctionString(avdir->filepos, dp->d_name, 0);
>   +
>    #if !defined(__DragonFly__) && !defined(__CYGWIN__)
>        dp->d_reclen = 0;		/* W2DO? */
>    #endif
>   @@ -1724,7 +1728,8 @@
>        avdir->allocation = nb;
>        avdir->size = ac;
>        avdir->offset = -1;
>   -    avdir->filepos = 0;
>   +    /* Hash the directory path for a d_ino analogue. */
>   +    avdir->filepos = hashFunctionString(0, path, 0);
>
>    #if defined(HAVE_PTHREAD_H)
>    /*@-moduncon -noeffectuncon -nullpass @*/
>   @@ -1795,7 +1800,8 @@
>
>        /* XXX glob(3) uses REAL_DIR_ENTRY(dp) test on d_ino */
>    /*@-type@*/
>   -    dp->d_ino = i + 1;		/* W2DO? */
>   +    /* Hash the name (starting with parent hash) for a d_ino  
> analogue. */
>   +    dp->d_ino = hashFunctionString(avdir->filepos, dp->d_name, 0);
>    #if !defined(__DragonFly__) && !defined(__CYGWIN__)
>        dp->d_reclen = 0;		/* W2DO? */
>    #endif
>   @@ -1876,7 +1882,8 @@
>        avdir->allocation = nb;
>        avdir->size = ac;
>        avdir->offset = -1;
>   -    avdir->filepos = 0;
>   +    /* Hash the directory path for a d_ino analogue. */
>   +    avdir->filepos = hashFunctionString(0, path, 0);
>
>    #if defined(HAVE_PTHREAD_H)
>    /*@-moduncon -noeffectuncon -nullpass @*/
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmhash.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.9 -r1.10 rpmhash.c
>   --- rpm/rpmio/rpmhash.c	16 Dec 2007 22:54:40 -0000	1.9
>   +++ rpm/rpmio/rpmhash.c	8 Feb 2008 17:42:48 -0000	1.10
>   @@ -67,15 +67,14 @@
>        return b;
>    }
>
>   -/**
>   - * Return hash value of a string.
>   - * @param h		hash initial value
>   - * @param data		data on which to calculate hash value
>   - * @param size		size of data in bytes
>   - * @return		hash value
>   - */
>   -static uint32_t hashFunctionString(uint32_t h, const void *  
> data, size_t size)
>   -	/*@*/
>   +int hashEqualityString(const void * key1, const void * key2)
>   +{
>   +    const char *k1 = (const char *)key1;
>   +    const char *k2 = (const char *)key2;
>   +    return strcmp(k1, k2);
>   +}
>   +
>   +uint32_t hashFunctionString(uint32_t h, const void * data,  
> size_t size)
>    {
>        const char *key = data;
>
>   @@ -142,20 +141,6 @@
>        return h;
>    }
>
>   -/**
>   - * Compare two hash table entries for equality.
>   - * @param key1          entry 1
>   - * @param key2          entry 2
>   - * @return		0 if entries are equal
>   - */
>   -static int hashEqualityString(const void * key1, const void * key2)
>   -	/*@*/
>   -{
>   -    const char *k1 = (const char *)key1;
>   -    const char *k2 = (const char *)key2;
>   -    return strcmp(k1, k2);
>   -}
>   -
>    hashTable htCreate(int numBuckets, size_t keySize, int freeData,
>    		hashFunctionType fn, hashEqualityType eq)
>    {
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmhash.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.4 -r1.5 rpmhash.h
>   --- rpm/rpmio/rpmhash.h	4 Nov 2007 01:14:29 -0000	1.4
>   +++ rpm/rpmio/rpmhash.h	8 Feb 2008 17:42:48 -0000	1.5
>   @@ -15,6 +15,24 @@
>    #endif
>
>    /**
>   + * Compare two hash table entries for equality.
>   + * @param key1          entry 1
>   + * @param key2          entry 2
>   + * @return		0 if entries are equal
>   + */
>   +typedef int (*hashEqualityType) (const void * key1, const void *  
> key2)
>   +	/*@*/;
>   +
>   +/**
>   + * Compare two hash table entries for equality.
>   + * @param key1          entry 1
>   + * @param key2          entry 2
>   + * @return		0 if entries are equal
>   + */
>   +int hashEqualityString(const void * key1, const void * key2)
>   +	/*@*/;
>   +
>   +/**
>     * Return hash value.
>     * @param h		hash initial value
>     * @param data		data on which to calculate hash value
>   @@ -25,12 +43,13 @@
>    	/*@*/;
>
>    /**
>   - * Compare two hash table entries for equality.
>   - * @param key1          entry 1
>   - * @param key2          entry 2
>   - * @return		0 if entries are equal
>   + * Return hash value of a string.
>   + * @param h		hash initial value
>   + * @param data		data on which to calculate hash value
>   + * @param size		size of data in bytes (0 will use strlen(data))
>   + * @return		hash value
>     */
>   -typedef int (*hashEqualityType) (const void * key1, const void *  
> key2)
>   +uint32_t hashFunctionString(uint32_t h, const void * data,  
> size_t size)
>    	/*@*/;
>
>    /**
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmrpc.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.64 -r2.65 rpmrpc.c
>   --- rpm/rpmio/rpmrpc.c	7 Feb 2008 19:29:33 -0000	2.64
>   +++ rpm/rpmio/rpmrpc.c	8 Feb 2008 17:42:48 -0000	2.65
>   @@ -4,13 +4,15 @@
>
>    #include "system.h"
>
>   -#include "rpmio_internal.h"
>   -#include "rpmmacro.h"
>   +#include <rpmio_internal.h>
>   +#include <rpmmacro.h>
>
>    #define	_RPMDAV_INTERNAL
>   -#include "rpmdav.h"
>   +#include <rpmdav.h>
>   +
>   +#include <rpmhash.h>
>   +#include <ugid.h>
>
>   -#include "ugid.h"
>    #include "debug.h"
>
>    /*@access DIR @*/
>   @@ -1157,20 +1159,20 @@
>        return buf;
>    }
>
>   -/*@unchecked@*/
>   -static int ftp_st_ino = 0xdead0000;
>   -
>    /* FIXME: borked for path with trailing '/' */
>    static int ftpStat(const char * path, /*@out@*/ struct stat *st)
>   -	/*@globals ftp_st_ino, h_errno, fileSystem, internalState @*/
>   -	/*@modifies *st, ftp_st_ino, fileSystem, internalState @*/
>   +	/*@globals h_errno, fileSystem, internalState @*/
>   +	/*@modifies *st, fileSystem, internalState @*/
>    {
>        char buf[1024];
>        int rc;
>        rc = ftpNLST(path, DO_FTP_STAT, st, NULL, 0);
>   -    /* XXX fts(3) needs/uses st_ino, make something up for now. */
>   +
>   +    /* XXX fts(3) needs/uses st_ino. */
>   +    /* Hash the path to generate a st_ino analogue. */
>        if (st->st_ino == 0)
>   -	st->st_ino = ftp_st_ino++;
>   +	st->st_ino = hashFunctionString(0, path, 0);
>   +
>    if (_ftp_debug)
>    fprintf(stderr, "*** ftpStat(%s) rc %d\n%s", path, rc, statstr 
> (st, buf));
>        return rc;
>   @@ -1178,15 +1180,18 @@
>
>    /* FIXME: borked for path with trailing '/' */
>    static int ftpLstat(const char * path, /*@out@*/ struct stat *st)
>   -	/*@globals ftp_st_ino, h_errno, fileSystem, internalState @*/
>   -	/*@modifies *st, ftp_st_ino, fileSystem, internalState @*/
>   +	/*@globals h_errno, fileSystem, internalState @*/
>   +	/*@modifies *st, fileSystem, internalState @*/
>    {
>        char buf[1024];
>        int rc;
>        rc = ftpNLST(path, DO_FTP_LSTAT, st, NULL, 0);
>   -    /* XXX fts(3) needs/uses st_ino, make something up for now. */
>   +
>   +    /* XXX fts(3) needs/uses st_ino. */
>   +    /* Hash the path to generate a st_ino analogue. */
>        if (st->st_ino == 0)
>   -	st->st_ino = ftp_st_ino++;
>   +	st->st_ino = hashFunctionString(0, path, 0);
>   +
>    if (_ftp_debug)
>    fprintf(stderr, "*** ftpLstat(%s) rc %d\n%s\n", path, rc, statstr 
> (st, buf));
>        return rc;
>   @@ -1272,7 +1277,8 @@
>        avdir->allocation = nb;
>        avdir->size = ac;
>        avdir->offset = -1;
>   -    avdir->filepos = 0;
>   +    /* Hash the directory path for a d_ino analogue. */
>   +    avdir->filepos = hashFunctionString(0, path, 0);
>
>    #if defined(HAVE_PTHREAD_H)
>    /*@-moduncon -noeffectuncon@*/
>   @@ .
> ______________________________________________________________________
> RPM Package Manager                                    http://rpm5.org
> CVS Sources Repository                                rpm-cvs@rpm5.org
Received on Fri Feb 8 19:02:35 2008
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.