ringdb: use cursors to be a bit faster

This commit is contained in:
moneromooo-monero 2018-09-20 12:21:25 +00:00
parent bad2c7cf31
commit 43a06350cf
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 32 additions and 7 deletions

View file

@ -398,6 +398,8 @@ bool ringdb::blackball_worker(const std::vector<std::pair<uint64_t, uint64_t>> &
epee::misc_utils::auto_scope_leave_caller txn_dtor = epee::misc_utils::create_scope_leave_handler([&](){if (tx_active) mdb_txn_abort(txn);});
tx_active = true;
dbr = mdb_cursor_open(txn, dbi_blackballs, &cursor);
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to create cursor for blackballs table: " + std::string(mdb_strerror(dbr)));
MDB_val key, data;
for (const std::pair<uint64_t, uint64_t> &output: outputs)
@ -411,25 +413,22 @@ bool ringdb::blackball_worker(const std::vector<std::pair<uint64_t, uint64_t>> &
{
case BLACKBALL_BLACKBALL:
MDEBUG("Blackballing output " << output.first << "/" << output.second);
dbr = mdb_put(txn, dbi_blackballs, &key, &data, MDB_APPENDDUP);
dbr = mdb_cursor_put(cursor, &key, &data, MDB_APPENDDUP);
if (dbr == MDB_KEYEXIST)
dbr = 0;
break;
case BLACKBALL_UNBLACKBALL:
MDEBUG("Unblackballing output " << output.first << "/" << output.second);
dbr = mdb_del(txn, dbi_blackballs, &key, &data);
if (dbr == MDB_NOTFOUND)
dbr = 0;
dbr = mdb_cursor_get(cursor, &key, &data, MDB_GET_BOTH);
if (dbr == 0)
dbr = mdb_cursor_del(cursor, 0);
break;
case BLACKBALL_QUERY:
dbr = mdb_cursor_open(txn, dbi_blackballs, &cursor);
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to create cursor for blackballs table: " + std::string(mdb_strerror(dbr)));
dbr = mdb_cursor_get(cursor, &key, &data, MDB_GET_BOTH);
THROW_WALLET_EXCEPTION_IF(dbr && dbr != MDB_NOTFOUND, tools::error::wallet_internal_error, "Failed to lookup in blackballs table: " + std::string(mdb_strerror(dbr)));
ret = dbr != MDB_NOTFOUND;
if (dbr == MDB_NOTFOUND)
dbr = 0;
mdb_cursor_close(cursor);
break;
case BLACKBALL_CLEAR:
break;
@ -439,6 +438,8 @@ bool ringdb::blackball_worker(const std::vector<std::pair<uint64_t, uint64_t>> &
THROW_WALLET_EXCEPTION_IF(dbr, tools::error::wallet_internal_error, "Failed to query blackballs table: " + std::string(mdb_strerror(dbr)));
}
mdb_cursor_close(cursor);
if (op == BLACKBALL_CLEAR)
{
dbr = mdb_drop(txn, dbi_blackballs, 0);

View file

@ -150,6 +150,30 @@ TEST(blackball, found)
ASSERT_TRUE(ringdb.blackballed(OUTPUT_1));
}
TEST(blackball, vector)
{
RingDB ringdb;
std::vector<std::pair<uint64_t, uint64_t>> outputs;
outputs.push_back(std::make_pair(0, 1));
outputs.push_back(std::make_pair(10, 3));
outputs.push_back(std::make_pair(10, 4));
outputs.push_back(std::make_pair(10, 8));
outputs.push_back(std::make_pair(20, 0));
outputs.push_back(std::make_pair(20, 1));
outputs.push_back(std::make_pair(30, 5));
ASSERT_TRUE(ringdb.blackball(outputs));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(0, 1)));
ASSERT_FALSE(ringdb.blackballed(std::make_pair(10, 2)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(10, 3)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(10, 4)));
ASSERT_FALSE(ringdb.blackballed(std::make_pair(10, 5)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(10, 8)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(20, 0)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(20, 1)));
ASSERT_FALSE(ringdb.blackballed(std::make_pair(20, 2)));
ASSERT_TRUE(ringdb.blackballed(std::make_pair(30, 5)));
}
TEST(blackball, unblackball)
{
RingDB ringdb;