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

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   08-Dec-2009 22:20:35
  Branch: HEAD                             Handle: 2009120821203401

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               DB_CONFIG.in rpmdb.c

  Log:
    - rpmdb: do in-place rebuilddb, opt-in for now.

  Summary:
    Revision    Changes     Path
    1.3187      +1  -0      rpm/CHANGES
    1.8         +3  -3      rpm/rpmdb/DB_CONFIG.in
    1.351       +92 -1      rpm/rpmdb/rpmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3186 -r1.3187 CHANGES
  --- rpm/CHANGES       8 Dec 2009 17:46:40 -0000       1.3186
  +++ rpm/CHANGES       8 Dec 2009 21:20:34 -0000       1.3187
  @@ -1,5 +1,6 @@
   
   5.2b1 -> 5.3a1
  +    - jbj: rpmdb: do in-place rebuilddb, opt-in for now.
       - jbj: rpmdb: lazily create non-existent secondary indices.
       - jbj: rpmdb: consolidate primary key swabbing to network order.
       - jbj: rpmdb: re-open dbenv w DB_RUNRECOVER rather than remove/verify.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/DB_CONFIG.in
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 DB_CONFIG.in
  --- rpm/rpmdb/DB_CONFIG.in    3 Dec 2009 21:44:26 -0000       1.7
  +++ rpm/rpmdb/DB_CONFIG.in    8 Dec 2009 21:20:35 -0000       1.8
  @@ -31,8 +31,8 @@
   set_mp_mmapsize              16777216
   
   # ================ Locking
  -set_lk_max_locks     4000
  -set_lk_max_lockers   4000
  -set_lk_max_objects   4000
  +set_lk_max_locks     8000
  +set_lk_max_lockers   8000
  +set_lk_max_objects   8000
   
   # ================ Replication
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.350 -r1.351 rpmdb.c
  --- rpm/rpmdb/rpmdb.c 8 Dec 2009 18:30:02 -0000       1.350
  +++ rpm/rpmdb/rpmdb.c 8 Dec 2009 21:20:35 -0000       1.351
  @@ -69,6 +69,8 @@
   /*...@unchecked@*/
   static int _rebuildinprogress = 0;
   
  +static int _rebuild_inplace = 1;
  +
   #define      _DBI_FLAGS      0
   #define      _DBI_PERMS      0644
   #define      _DBI_MAJOR      -1
  @@ -794,6 +796,10 @@
        case RPMDBI_ADDED:
        case RPMDBI_REMOVED:
        case RPMDBI_DEPENDS:
  +     case RPMDBI_BTREE:
  +     case RPMDBI_HASH:
  +     case RPMDBI_QUEUE:
  +     case RPMDBI_RECNO:
            continue;
            /*...@notreached@*/ /*...@switchbreak@*/ break;
        default:
  @@ -3182,12 +3188,26 @@
        for (i = 0; i < dbiNTags; i++) {
            const char * dbiBN = (dbiTags[i].str != NULL
                           ? dbiTags[i].str : tagName(dbiTags[i].tag));
  +if (_rebuild_inplace)
  +switch (dbiTags[i].tag) {
  +case RPMDBI_PACKAGES:
  +case RPMDBI_SEQNO:
  +case RPMDBI_BTREE:
  +case RPMDBI_HASH:
  +case RPMDBI_QUEUE:
  +case RPMDBI_RECNO:
  +    continue;
  +    /*...@notreached@*/ break;
  +default:
  +    break;
  +}
            fn = rpmGetPath(prefix, dbpath, "/", dbiBN, NULL);
            if (rpmioFileExists(fn))
                xx = Unlink(fn);
            fn = _free(fn);
        }
   
  +if (!_rebuild_inplace) {
        fn = rpmGetPath(prefix, dbpath, "/", "__db.000", NULL);
        suffix = (char *)(fn + strlen(fn) - (sizeof("000") - 1));
        for (i = 0; i < 16; i++) {
  @@ -3196,6 +3216,7 @@
                xx = Unlink(fn);
        }
        fn = _free(fn);
  +}
   
       }        break;
       case 2:
  @@ -3204,9 +3225,11 @@
        break;
       }
   
  +if (!_rebuild_inplace) {
       fn = rpmGetPath(prefix, dbpath, NULL);
       xx = Rmdir(fn);
       fn = _free(fn);
  +}
   
       return 0;
   }
  @@ -3328,7 +3351,7 @@
       return rc;
   }
   
  -int rpmdbRebuild(const char * prefix, rpmts ts)
  +static int _rpmdbRebuild(const char * prefix, rpmts ts)
        /*...@globals _rebuildinprogress @*/
        /*...@modifies _rebuildinprogress @*/
   {
  @@ -3563,3 +3586,71 @@
   
       return rc;
   }
  +
  +int rpmdbRebuild(const char * prefix, rpmts ts)
  +     /*...@globals _rebuildinprogress @*/
  +     /*...@modifies _rebuildinprogress @*/
  +{
  +    const char * myprefix = NULL;
  +    rpmdb olddb;
  +    const char * dbpath = NULL;
  +    const char * rootdbpath = NULL;
  +    int _dbapi = rpmExpandNumeric("%{_dbapi}");
  +    tagStore_t dbiTags = NULL;
  +    size_t dbiNTags = 0;
  +    const char * tfn;
  +    int rc = 1;              /* assume failure */
  +    int xx;
  +
  +    if (!_rebuild_inplace)
  +     return _rpmdbRebuild(prefix, ts);
  +
  +fprintf(stderr, "--> %s(%s, %p)\n", __FUNCTION__, prefix, ts);
  +
  +    dbiTagsInit(&dbiTags, &dbiNTags);
  +
  +    /*...@-nullpass@*/
  +    tfn = rpmGetPath("%{?_dbpath}", NULL);
  +    /*...@=nullpass@*/
  +    if (!(tfn && tfn[0] != '\0')) {
  +     rpmlog(RPMLOG_DEBUG, D_("no dbpath has been set"));
  +     tfn = _free(tfn);
  +     goto exit;
  +    }
  +
  +    /* Add --root prefix iff --dbpath is not a URL. */
  +    switch (urlPath(tfn, NULL)) {
  +    default:
  +     myprefix = xstrdup("");
  +     break;
  +    case URL_IS_UNKNOWN:
  +     myprefix = rpmGetPath((prefix ? prefix : "/"), NULL);
  +     break;
  +    }
  +
  +    dbpath = rootdbpath = rpmGetPath(myprefix, tfn, NULL);
  +    if (!(myprefix[0] == '/' && myprefix[1] == '\0'))
  +     dbpath += strlen(myprefix);
  +    tfn = _free(tfn);
  +
  +    xx = rpmdbRemoveDatabase(myprefix, dbpath, _dbapi, dbiTags, dbiNTags);
  +
  +    /* XXX Seqno update needs O_RDWR. */
  +    if (rpmdbOpenDatabase(myprefix, dbpath, _dbapi, &olddb, O_RDWR, 0644, 
0)) {
  +     rc = 1;
  +     goto exit;
  +    }
  +    _dbapi = olddb->db_api;
  +
  +    xx = rpmdbOpenAll(olddb);
  +
  +    xx = rpmdbClose(olddb);
  +
  +    rc = 0;
  +
  +exit:
  +    rootdbpath = _free(rootdbpath);
  +    dbiTags = tagStoreFree(dbiTags, dbiNTags);
  +    myprefix = _free(myprefix);
  +    return rc;
  +}
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to