RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   13-Oct-2009 01:05:39
  Branch: HEAD                             Handle: 2009101223053900

  Modified files:
    rpm/lib                 fsm.c
    rpm/rpmdb               logio.h logio.src logio_rec.c rpmdb.h

  Log:
    - dbi: log content for unlink/rename undo.

  Summary:
    Revision    Changes     Path
    2.192       +59 -7      rpm/lib/fsm.c
    1.8         +3  -3      rpm/rpmdb/logio.h
    1.7         +10 -3      rpm/rpmdb/logio.src
    1.6         +44 -2      rpm/rpmdb/logio_rec.c
    1.117       +37 -21     rpm/rpmdb/rpmdb.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/lib/fsm.c
  ============================================================================
  $ cvs diff -u -r2.191 -r2.192 fsm.c
  --- rpm/lib/fsm.c     12 Oct 2009 02:35:30 -0000      2.191
  +++ rpm/lib/fsm.c     12 Oct 2009 23:05:39 -0000      2.192
  @@ -981,6 +981,17 @@
       int rc = 0;
       int xx;
   
  +    {        const char * fn = fsm->path;
  +     mode_t mode = st->st_mode;
  +     uint8_t * b = (uint8_t *)"";
  +     size_t blen = 1;
  +     const uint8_t * d = fsm->digest;
  +     size_t dlen = fsm->digestlen;
  +     uint32_t dalgo = fsm->fdigestalgo;
  +
  +     xx = rpmlioCreat(rpmtsGetRdb(fsmGetTs(fsm)), fn, mode, b, blen, d, 
dlen, dalgo);
  +    }
  +
       rc = fsmNext(fsm, IOSM_WOPEN);
       if (rc)
        goto exit;
  @@ -988,9 +999,6 @@
       if (st->st_size > 0 && (fsm->fdigest != NULL || fsm->digest != NULL))
        fdInitDigest(fsm->wfd, fsm->fdigestalgo, 0);
   
  -    rc = rpmlioCreat(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode,
  -             fsm->digest, fsm->digestlen, fsm->fdigestalgo);
  -
       while (left) {
   
        fsm->wrlen = (left > fsm->wrsize ? fsm->wrsize : left);
  @@ -1035,6 +1043,7 @@
   
   exit:
       (void) fsmNext(fsm, IOSM_WCLOSE);
  +
       return rc;
   }
   /*...@=compdef@*/
  @@ -2269,11 +2278,54 @@
        /*...@notreached@*/ break;
   
       case IOSM_UNLINK:
  -     rc = rpmlioUnlink(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode);
  -     goto iosmcall;
  +    {        const char * fn = fsm->path;
  +     uint8_t * b = (uint8_t *)"";
  +     size_t blen = 0;
  +     uint8_t * d = NULL;
  +     size_t dlen = 0;
  +     uint32_t dalgo = 0;
  +     FD_t fd = NULL;
  +     struct stat sb;
  +     mode_t mode;
  +     sb.st_mode = 0;
  +     if (!Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
  +         fd = Fopen(fn, "r.fdio");
  +         blen = sb.st_size;
  +         b = mmap(NULL, blen, PROT_READ, MAP_SHARED, Fileno(fd), 0);
  +     }
  +     mode = sb.st_mode;
  +     rc = rpmlioUnlink(rpmtsGetRdb(fsmGetTs(fsm)), fn, mode, b, blen, d, 
dlen, dalgo);
  +     if (fd != NULL) {
  +         (void)munmap(b, blen);
  +         (void) Fclose(fd);
  +         fd = NULL;
  +     }
  +    }        goto iosmcall;
       case IOSM_RENAME:
  -     rc = rpmlioRename(rpmtsGetRdb(fsmGetTs(fsm)), fsm->opath, fsm->path);
  -     goto iosmcall;
  +    {        const char * ofn = fsm->opath;
  +     const char * fn = fsm->path;
  +     uint8_t * b = NULL;
  +     size_t blen = 0;
  +     uint8_t * d = NULL;
  +     size_t dlen = 0;
  +     uint32_t dalgo = 0;
  +     FD_t fd = NULL;
  +     struct stat sb;
  +     mode_t mode;
  +     sb.st_mode = 0;
  +     if (!Lstat(fn, &sb) && S_ISREG(sb.st_mode)) {
  +         fd = Fopen(fn, "r.fdio");
  +         blen = sb.st_size;
  +         b = mmap(NULL, blen, PROT_READ, MAP_SHARED, Fileno(fd), 0);
  +     }
  +     mode = sb.st_mode;
  +     rc = rpmlioRename(rpmtsGetRdb(fsmGetTs(fsm)), ofn, fn, mode, b, blen, 
d, dlen, dalgo);
  +     if (fd != NULL) {
  +         (void)munmap(b, blen);
  +         (void) Fclose(fd);
  +         fd = NULL;
  +     }
  +    }        goto iosmcall;
       case IOSM_MKDIR:
        rc = rpmlioMkdir(rpmtsGetRdb(fsmGetTs(fsm)), fsm->path, st->st_mode);
        goto iosmcall;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/logio.h
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 logio.h
  --- rpm/rpmdb/logio.h 12 Oct 2009 19:03:48 -0000      1.7
  +++ rpm/rpmdb/logio.h 12 Oct 2009 23:05:39 -0000      1.8
  @@ -12,15 +12,15 @@
        __P((DB_ENV *, DBT *, DB_LSN *, db_recops))
   
   int logio_Creat_log
  -     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, 
mode_t));
  +     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const 
DBT *, const DBT *, uint32_t));
   _LOGIO_PROTO(Creat);
   
   int logio_Unlink_log
  -     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, 
mode_t));
  +     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, const 
DBT *, const DBT *, uint32_t));
   _LOGIO_PROTO(Unlink);
   
   int logio_Rename_log
  -     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, 
const DBT *));
  +     __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT *, 
mode_t, const DBT *, const DBT *, uint32_t));
   _LOGIO_PROTO(Rename);
   
   int logio_Mkdir_log
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/logio.src
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 logio.src
  --- rpm/rpmdb/logio.src       12 Oct 2009 19:03:48 -0000      1.6
  +++ rpm/rpmdb/logio.src       12 Oct 2009 23:05:39 -0000      1.7
  @@ -14,23 +14,30 @@
   
   /* Creat(2) */
   BEGIN Creat  48      10000
  -DBT  fid             DBT             s
   DBT  path            DBT             s
   ARG  mode            mode_t          o
  +DBT  content         DBT             s
  +DBT  digest          DBT             s
  +ARG  dalgo           uint32_t        lu
   END
   
   /* Unlink(2) */
   BEGIN Unlink 48      10001
  -DBT  fid             DBT             s
   DBT  path            DBT             s
   ARG  mode            mode_t          o
  +DBT  content         DBT             s
  +DBT  digest          DBT             s
  +ARG  dalgo           uint32_t        lu
   END
   
   /* Rename(2) */
   BEGIN Rename 48      10002
  -DBT  fid             DBT             s
   DBT  oldpath         DBT             s
   DBT  newpath         DBT             s
  +ARG  mode            mode_t          o
  +DBT  content         DBT             s
  +DBT  digest          DBT             s
  +ARG  dalgo           uint32_t        lu
   END
   
   /* Mkdir(2) */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/logio_rec.c
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 logio_rec.c
  --- rpm/rpmdb/logio_rec.c     12 Oct 2009 02:35:29 -0000      1.5
  +++ rpm/rpmdb/logio_rec.c     12 Oct 2009 23:05:39 -0000      1.6
  @@ -2,7 +2,7 @@
   
   #include "system.h"
   
  -#include <rpmio.h>
  +#include <rpmio_internal.h>  /* XXX fdInitDigest */
   
   #include <db.h>
   
  @@ -14,6 +14,45 @@
   
   #include "debug.h"
   
  +static int writeFile(const char * fn, mode_t mode,
  +             const DBT * content, const DBT * digest, uint32_t dalgo)
  +{
  +    uint8_t * b = content->data;
  +    size_t blen = content->size;
  +    uint8_t * d = digest->data;
  +    size_t dlen = digest->size;
  +    int ret = 0;
  +    int xx;
  +
  +    if (S_ISREG(mode)) {
  +     FD_t fd = Fopen(fn, "w.fdio");
  +     size_t nw;
  +
  +     if (dalgo > 0 && d && dlen > 0)
  +         fdInitDigest(fd, dalgo, 0);
  +     nw = Fwrite(b, 1, blen, fd);
  +
  +     xx = fsync(Fileno(fd));
  +
  +     if (dalgo > 0 && d && dlen > 0) {
  +         static int asAscii = 0;
  +         void * digest = NULL;
  +         size_t digestlen = 0;
  +
  +         (void) Fflush(fd);
  +         fdFiniDigest(fd, dalgo, &digest, &digestlen, asAscii);
  +         if (digest == NULL || digestlen != dlen || memcmp(digest, d, dlen))
  +             ret = -1;
  +         digest = _free(digest);
  +     }
  +     (void) Fclose(fd);
  +     fd = NULL;
  +     if (nw != blen)
  +         ret = -1;
  +    }
  +    return ret;
  +}
  +
   /*
    * logio_Creat_recover --
    *   Recovery function for Creat.
  @@ -94,7 +133,8 @@
       switch (op) {
       case DB_TXN_ABORT:
       case DB_TXN_BACKWARD_ROLL:
  -     ret = creat(argp->path.data, argp->mode);
  +     ret = writeFile(argp->path.data, argp->mode, &argp->content,
  +                             &argp->digest, argp->dalgo);
        if (ret != 0)
            dbenv->err(dbenv, ret, "Unlink: DB_TXN_BACKWARD_ROLL");
        else
  @@ -152,6 +192,8 @@
       switch (op) {
       case DB_TXN_ABORT:
       case DB_TXN_BACKWARD_ROLL:
  +     ret = writeFile(argp->newpath.data, argp->mode, &argp->content,
  +                             &argp->digest, argp->dalgo);
        ret = Rename(argp->newpath.data, argp->oldpath.data);
        if (ret != 0)
            dbenv->err(dbenv, ret, "Rename: DB_TXN_BACKWARD_ROLL");
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.h
  ============================================================================
  $ cvs diff -u -r1.116 -r1.117 rpmdb.h
  --- rpm/rpmdb/rpmdb.h 12 Oct 2009 19:03:48 -0000      1.116
  +++ rpm/rpmdb/rpmdb.h 12 Oct 2009 23:05:39 -0000      1.117
  @@ -1147,65 +1147,81 @@
   }
   
   /*...@unused@*/ static inline
  -int rpmlioCreat(rpmdb rpmdb, void * fid, const char * fn, mode_t mode)
  +int rpmlioCreat(rpmdb rpmdb, const char * fn, mode_t mode,
  +             const uint8_t * b, size_t blen,
  +             const uint8_t * d, size_t dlen, uint32_t dalgo)
   {
       int rc = 0;
       extern int logio_Creat_log
  -        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT 
*, mode_t));
  +        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, 
const DBT *, const DBT *, uint32_t));
       DB_ENV * dbenv = rpmdb->db_dbenv;
       DB_TXN * _txn = rpmdb->db_txnid;
       DB_LSN _lsn = {0,0};
  -    DBT FIDdbt = {0};
       DBT FNdbt = {0};
  -    FIDdbt.data = "";
  -    FIDdbt.size = 1;
  +    DBT Bdbt = {0};
  +    DBT Ddbt = {0};
       FNdbt.data = (void *)fn;
       FNdbt.size = strlen(fn) + 1;     /* trailing NUL too */
  -    rc = logio_Creat_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &FNdbt, 
mode);
  -fprintf(stderr, "<== %s(%p, %s, 0%o) rc %d\n", __FUNCTION__, fid, fn, mode, 
rc);
  +    Bdbt.data = (void *)b;
  +    Bdbt.size = blen;
  +    Ddbt.data = (void *)d;
  +    Ddbt.size = dlen;
  +    rc = logio_Creat_log(dbenv, _txn, &_lsn, DB_FLUSH, &FNdbt, mode, &Bdbt, 
&Ddbt, dalgo);
  +fprintf(stderr, "<== %s(%s, 0%o, %p[%u], %p[%u], %u) rc %d\n", __FUNCTION__, 
fn, mode, b, (unsigned)blen, d, (unsigned)dlen, dalgo, rc);
       return rc;
   }
   
   /*...@unused@*/ static inline
  -int rpmlioUnlink(rpmdb rpmdb, void * fid, const char * fn, mode_t mode)
  +int rpmlioUnlink(rpmdb rpmdb, const char * fn, mode_t mode,
  +             const uint8_t * b, size_t blen,
  +             const uint8_t * d, size_t dlen, uint32_t dalgo)
   {
       int rc = 0;
       extern int logio_Unlink_log
  -        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT 
*, mode_t));
  +        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, mode_t, 
const DBT *, const DBT *, uint32_t));
       DB_ENV * dbenv = rpmdb->db_dbenv;
       DB_TXN * _txn = rpmdb->db_txnid;
       DB_LSN _lsn = {0,0};
  -    DBT FIDdbt = {0};
       DBT FNdbt = {0};
  -    FIDdbt.data = "";
  -    FIDdbt.size = 1;
  +    DBT Bdbt = {0};
  +    DBT Ddbt = {0};
       FNdbt.data = (void *)fn;
       FNdbt.size = strlen(fn) + 1;     /* trailing NUL too */
  -    rc = logio_Unlink_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &FNdbt, 
mode);
  -fprintf(stderr, "<== %s(%p, %s, 0%o) rc %d\n", __FUNCTION__, fid, fn, mode, 
rc);
  +    Bdbt.data = (void *)b;
  +    Bdbt.size = blen;
  +    Ddbt.data = (void *)d;
  +    Ddbt.size = dlen;
  +    rc = logio_Unlink_log(dbenv, _txn, &_lsn, DB_FLUSH, &FNdbt, mode, &Bdbt, 
&Ddbt, dalgo);
  +fprintf(stderr, "<== %s(%s, 0%o, %p[%u], %p[%u], %u) rc %d\n", __FUNCTION__, 
fn, mode, b, (unsigned)blen, d, (unsigned)dlen, dalgo, rc);
       return rc;
   }
   
   /*...@unused@*/ static inline
  -int rpmlioRename(rpmdb rpmdb, void * oldfid, const char * oldname, const 
char * newname)
  +int rpmlioRename(rpmdb rpmdb, const char * oldname, const char * newname,
  +             mode_t mode,
  +             const uint8_t * b, size_t blen,
  +             const uint8_t * d, size_t dlen, uint32_t dalgo)
   {
       int rc = 0;
       extern int logio_Rename_log
  -        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT 
*, const DBT *));
  +        __P((DB_ENV *, DB_TXN *, DB_LSN *, uint32_t, const DBT *, const DBT 
*, mode_t, const DBT *, const DBT *, uint32_t));
       DB_ENV * dbenv = rpmdb->db_dbenv;
       DB_TXN * _txn = rpmdb->db_txnid;
       DB_LSN _lsn = {0,0};
  -    DBT FIDdbt = {0};
       DBT ONdbt = {0};
       DBT NNdbt = {0};
  -    FIDdbt.data = "";
  -    FIDdbt.size = 1;
  +    DBT Bdbt = {0};
  +    DBT Ddbt = {0};
       ONdbt.data = (void *)oldname;
       ONdbt.size = strlen(oldname) + 1;        /* trailing NUL too */
       NNdbt.data = (void *)newname;
       NNdbt.size = strlen(newname) + 1;        /* trailing NUL too */
  -    rc = logio_Rename_log(dbenv, _txn, &_lsn, DB_FLUSH, &FIDdbt, &ONdbt, 
&NNdbt);
  -fprintf(stderr, "<== %s(%p, %s, %s) rc %d\n", __FUNCTION__, oldfid, oldname, 
newname, rc);
  +    Bdbt.data = (void *)b;
  +    Bdbt.size = blen;
  +    Ddbt.data = (void *)d;
  +    Ddbt.size = dlen;
  +    rc = logio_Rename_log(dbenv, _txn, &_lsn, DB_FLUSH, &ONdbt, &NNdbt, 
mode, &Bdbt, &Ddbt, dalgo);
  +fprintf(stderr, "<== %s(%s, %s, 0%o, %p[%u], %p[%u], %u) rc %d\n", 
__FUNCTION__, oldname, newname, mode, b, (unsigned)blen, d, (unsigned)dlen, 
dalgo, rc);
       return rc;
   }
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to