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: 23-Jul-2017 03:56:17 Branch: rpm-5_4 Handle: 2017072301561700 Modified files: (Branch: rpm-5_4) rpm/rpmdb lmdb.c Log: - lmdb: WIP. Summary: Revision Changes Path 1.1.2.5 +72 -55 rpm/rpmdb/lmdb.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmdb/lmdb.c ============================================================================ $ cvs diff -u -r1.1.2.4 -r1.1.2.5 lmdb.c --- rpm/rpmdb/lmdb.c 22 Jul 2017 21:49:24 -0000 1.1.2.4 +++ rpm/rpmdb/lmdb.c 23 Jul 2017 01:56:17 -0000 1.1.2.5 @@ -298,6 +298,7 @@ struct lmdbEnv_s { MDB_env * env; + MDB_txn * txn; int refs; }; @@ -364,7 +365,7 @@ ); flags |= MDB_FIXEDMAP; - mode_t mode = 0644; + mdb_mode_t mode = 0644; rpmlog(RPMLOG_DEBUG, "opening db environment %s flags 0x%x mode 0%o\n", path, flags, mode); @@ -385,6 +386,7 @@ rdb->db_dbenv = lmdbenv = xcalloc(1, sizeof(struct lmdbEnv_s)); lmdbenv->env = env; + lmdbenv->txn = NULL; SPEW("<-- %s(%p) lmdbenv %p env %p\n", __FUNCTION__, rdb, lmdbenv, lmdbenv->env); } lmdbenv->refs++; @@ -414,13 +416,13 @@ dbiIndex dbi; int rc = 1; +SPEW("--> %s(%p,%p,0x%x)\n", __FUNCTION__, rdb, dbip, flags); if (dbip) *dbip = NULL; if ((dbi = dbiNew(rdb, rpmtag)) == NULL) goto exit; - struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) xcalloc(1, sizeof(*lmdbdbi)); struct lmdbEnv_s * lmdbenv = openEnv(rdb); MDB_env * env = lmdbenv->env; char * path; @@ -448,7 +450,7 @@ oflags |= MDB_DUPSORT; } - MDB_txn * parent = NULL; + MDB_txn * parent = lmdbenv->txn; int tflags = ( #ifdef REF MDB_RDONLY | @@ -459,6 +461,7 @@ ); MDB_txn * txn = NULL; rc = mdb_txn_begin(env, parent, tflags, &txn); +SPEW("\t rc(%d) mdb_txn_begin(%p,%p,0x%x,&txn) MDB_txn %p\n", rc, env, parent, tflags, txn); switch (rc) { case MDB_SUCCESS: rc = RPMRC_OK; @@ -474,7 +477,9 @@ if (rc) goto exit; - rc = mdb_dbi_open(txn, path, oflags, &lmdbdbi->dbi); + MDB_dbi lmdbdbi_dbi = 0; + rc = mdb_dbi_open(txn, path, oflags, &lmdbdbi_dbi); +SPEW("\t rc(%d) mdb_dbi_open(%p,%s,0x%x,&dbi) MDB_dbi %u\n", rc, txn, path, oflags, lmdbdbi_dbi); switch (rc) { case MDB_SUCCESS: rc = RPMRC_OK; @@ -489,6 +494,7 @@ goto exit; rc = mdb_txn_commit(txn); +SPEW("\t rc(%d) mdb_txn_commit(%p)\n", rc, txn); txn = NULL; switch (rc) { case MDB_SUCCESS: @@ -501,6 +507,9 @@ goto exit; break; } + struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) xcalloc(1, sizeof(*lmdbdbi)); + lmdbdbi->dbi = lmdbdbi_dbi; + dbi->dbi_db = lmdbdbi; dbi->dbi_flags = 0; #ifdef NOTYET @@ -522,7 +531,7 @@ dbi = NULL; } -SPEW("<-- %s(%p,%p,0x%x) rc %d dbi %p\n", __FUNCTION__, rdb, dbip, flags, rc, dbi); +SPEW("<-- %s(%p,%p,0x%x) rc %d dbi %p lmdbdbi %p MDB_dbi %u\n", __FUNCTION__, rdb, dbip, flags, rc, dbi, (dbi ? dbi->dbi_db : NULL), (dbi && dbi->dbi_db ? ((struct lmdbDbi_s *)dbi->dbi_db)->dbi : 54321)); return rc; } @@ -1031,10 +1040,10 @@ { poptContext con = rpmioInit(argc, argv, lmdbOptionsTable); int ec = 0; - MDB_env *env; + MDB_dbi dbi; + MDB_val key, data; - MDB_txn *txn; MDB_stat mst; MDB_cursor *cursor, *cur2; MDB_cursor_op op; @@ -1053,11 +1062,15 @@ for (i = 0; i < count; i++) values[i] = rand() % 1024; - struct lmdbEnv_s * lmdbenv = openEnv(rdb); - env = lmdbenv->env; - - E(mdb_txn_begin(env, NULL, 0, &txn)); - E(mdb_dbi_open(txn, NULL, 0, &dbi)); + dbiIndex __dbi = NULL; + rc = lmdb_Open(rdb, RPMDBI_PACKAGES, &__dbi, 0); +assert(!rc); + struct lmdbEnv_s * lmdbenv = (struct lmdbEnv_s *) rdb->db_dbenv; + E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn)); + + struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) __dbi->dbi_db; + dbi = lmdbdbi->dbi; +SPEW("*** %s: MDB_env %p MDB_dbi %u\n", __FUNCTION__, lmdbenv->env, dbi); key.mv_size = sizeof(int); key.mv_data = sval; @@ -1069,7 +1082,7 @@ /* Set <data> in each iteration, since MDB_NOOVERWRITE may modify it */ data.mv_size = sizeof(sval); data.mv_data = sval; - if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) { + if (RES(MDB_KEYEXIST, mdb_put(lmdbenv->txn, dbi, &key, &data, MDB_NOOVERWRITE))) { j++; data.mv_size = sizeof(sval); data.mv_data = sval; @@ -1077,45 +1090,47 @@ } if (j) printf("%d duplicates skipped\n", j); - E(mdb_txn_commit(txn)); - E(mdb_env_stat(env, &mst)); + E(mdb_txn_commit(lmdbenv->txn)); + lmdbenv->txn = NULL; + E(mdb_env_stat(lmdbenv->env, &mst)); - E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn)); - E(mdb_cursor_open(txn, dbi, &cursor)); + E(mdb_txn_begin(lmdbenv->env, NULL, MDB_RDONLY, &lmdbenv->txn)); + E(mdb_cursor_open(lmdbenv->txn, dbi, &cursor)); while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { - printf("key: %p %.*s, data: %p %.*s\n", - key.mv_data, (int) key.mv_size, (char *) key.mv_data, - data.mv_data, (int) data.mv_size, (char *) data.mv_data); +// printf("key: %p %.*s, data: %p %.*s\n", +// key.mv_data, (int) key.mv_size, (char *) key.mv_data, +// data.mv_data, (int) data.mv_size, (char *) data.mv_data); } CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); mdb_cursor_close(cursor); - mdb_txn_abort(txn); + mdb_txn_abort(lmdbenv->txn); j = 0; key.mv_data = sval; for (i = count - 1; i > -1; i -= (rand() % 5)) { j++; - txn = NULL; - E(mdb_txn_begin(env, NULL, 0, &txn)); + lmdbenv->txn = NULL; + E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn)); sprintf(sval, "%03x ", values[i]); - if (RES(MDB_NOTFOUND, mdb_del(txn, dbi, &key, NULL))) { + if (RES(MDB_NOTFOUND, mdb_del(lmdbenv->txn, dbi, &key, NULL))) { j--; - mdb_txn_abort(txn); + mdb_txn_abort(lmdbenv->txn); } else { - E(mdb_txn_commit(txn)); + E(mdb_txn_commit(lmdbenv->txn)); } + lmdbenv->txn = NULL; } free(values); printf("Deleted %d values\n", j); - E(mdb_env_stat(env, &mst)); - E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn)); - E(mdb_cursor_open(txn, dbi, &cursor)); + E(mdb_env_stat(lmdbenv->env, &mst)); + E(mdb_txn_begin(lmdbenv->env, NULL, MDB_RDONLY, &lmdbenv->txn)); + E(mdb_cursor_open(lmdbenv->txn, dbi, &cursor)); printf("Cursor next\n"); while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { - printf("key: %.*s, data: %.*s\n", - (int) key.mv_size, (char *) key.mv_data, - (int) data.mv_size, (char *) data.mv_data); +// printf("key: %.*s, data: %.*s\n", +// (int) key.mv_size, (char *) key.mv_data, +// (int) data.mv_size, (char *) data.mv_data); } CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); printf("Cursor last\n"); @@ -1125,9 +1140,9 @@ (int) data.mv_size, (char *) data.mv_data); printf("Cursor prev\n"); while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) { - printf("key: %.*s, data: %.*s\n", - (int) key.mv_size, (char *) key.mv_data, - (int) data.mv_size, (char *) data.mv_data); +// printf("key: %.*s, data: %.*s\n", +// (int) key.mv_size, (char *) key.mv_data, +// (int) data.mv_size, (char *) data.mv_data); } CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); printf("Cursor last/prev\n"); @@ -1141,47 +1156,49 @@ (int) data.mv_size, (char *) data.mv_data); mdb_cursor_close(cursor); - mdb_txn_abort(txn); + mdb_txn_abort(lmdbenv->txn); + lmdbenv->txn = NULL; printf("Deleting with cursor\n"); - E(mdb_txn_begin(env, NULL, 0, &txn)); - E(mdb_cursor_open(txn, dbi, &cur2)); + E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn)); + E(mdb_cursor_open(lmdbenv->txn, dbi, &cur2)); for (i = 0; i < 50; i++) { if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, MDB_NEXT))) break; - printf("key: %p %.*s, data: %p %.*s\n", - key.mv_data, (int) key.mv_size, (char *) key.mv_data, - data.mv_data, (int) data.mv_size, (char *) data.mv_data); - E(mdb_del(txn, dbi, &key, NULL)); +// printf("key: %p %.*s, data: %p %.*s\n", +// key.mv_data, (int) key.mv_size, (char *) key.mv_data, +// data.mv_data, (int) data.mv_size, (char *) data.mv_data); + E(mdb_del(lmdbenv->txn, dbi, &key, NULL)); } printf("Restarting cursor in txn\n"); for (op = MDB_FIRST, i = 0; i <= 32; op = MDB_NEXT, i++) { if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, op))) break; - printf("key: %p %.*s, data: %p %.*s\n", - key.mv_data, (int) key.mv_size, (char *) key.mv_data, - data.mv_data, (int) data.mv_size, (char *) data.mv_data); +// printf("key: %p %.*s, data: %p %.*s\n", +// key.mv_data, (int) key.mv_size, (char *) key.mv_data, +// data.mv_data, (int) data.mv_size, (char *) data.mv_data); } mdb_cursor_close(cur2); - E(mdb_txn_commit(txn)); + E(mdb_txn_commit(lmdbenv->txn)); + lmdbenv->txn = NULL; printf("Restarting cursor outside txn\n"); - E(mdb_txn_begin(env, NULL, 0, &txn)); - E(mdb_cursor_open(txn, dbi, &cursor)); + E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn)); + E(mdb_cursor_open(lmdbenv->txn, dbi, &cursor)); for (op = MDB_FIRST, i = 0; i <= 32; op = MDB_NEXT, i++) { if (RES(MDB_NOTFOUND, mdb_cursor_get(cursor, &key, &data, op))) break; - printf("key: %p %.*s, data: %p %.*s\n", - key.mv_data, (int) key.mv_size, (char *) key.mv_data, - data.mv_data, (int) data.mv_size, (char *) data.mv_data); +// printf("key: %p %.*s, data: %p %.*s\n", +// key.mv_data, (int) key.mv_size, (char *) key.mv_data, +// data.mv_data, (int) data.mv_size, (char *) data.mv_data); } mdb_cursor_close(cursor); - mdb_txn_abort(txn); - - mdb_dbi_close(env, dbi); + mdb_txn_abort(lmdbenv->txn); + lmdbenv->txn = NULL; - closeEnv(rdb); + rc = lmdb_Close(__dbi, 0); +assert(!rc); con = rpmioFini(con); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org