diff -uNr a/bitcoin/src/db.cpp b/bitcoin/src/db.cpp --- a/bitcoin/src/db.cpp f8fcccd44b3635182b65b09b51229bf30bd42e1dcfd91d66c57d82425b055ddfbb8f88249479b6c3ad45d21ae0c0c6cdd920f8ae44693c4256598ea2bb807007 +++ b/bitcoin/src/db.cpp 3696bed50163aab754e7875fb51cb16c5244865f23b2e4c00ddcd3f6b64c2001640b7a1f66c72c06d2d5cad7bfacb8fc18a0eb5f3e3f7cfd516a5353fc7ce1e3 @@ -18,6 +18,18 @@ unsigned int nWalletDBUpdated; uint64 nAccountingEntryNumber = 0; +CCriticalSection cs_dbwritetime; +int64 dbWriteTime = 0; + +int64 DbWriteOdometer(int64 dt) +{ + CRITICAL_BLOCK(cs_dbwritetime) // increment write-wait odometer + { + dbWriteTime += dt; + } + return dbWriteTime; +} + // diff -uNr a/bitcoin/src/db.h b/bitcoin/src/db.h --- a/bitcoin/src/db.h 1a4b9bd666180acf944d189ffd5b89da0f1c0d7b60223fe7f16f73a7d90bdd2a75b7d46805738ea3da36ae766b0aa4a5d29283b5f4ef8a77aae991cf990ae0cc +++ b/bitcoin/src/db.h 5d6e22ff9bb87c423cb2a4a92a41ab68959233611b431551203bc8b5fa2ca18a6f8db4955715c25238927bbdad1e3593dc02db35bfbb75bd81460c9765211198 @@ -32,7 +32,7 @@ void ThreadFlushWalletDB(void* parg); bool BackupWallet(const CWallet& wallet, const std::string& strDest); - +int64 DbWriteOdometer(int64 dt); class CDB { @@ -102,7 +102,10 @@ Dbt datValue(&ssValue[0], ssValue.size()); // Write + int64 wStart = GetTimeMillis(); int ret = pdb->put(GetTxn(), &datKey, &datValue, (fOverwrite ? 0 : DB_NOOVERWRITE)); + int64 wInterval = GetTimeMillis() - wStart; + DbWriteOdometer(wInterval); // Clear memory in case it was a private key memset(datKey.get_data(), 0, datKey.get_size()); diff -uNr a/bitcoin/src/main.cpp b/bitcoin/src/main.cpp --- a/bitcoin/src/main.cpp d49e7aaab38507fd69e6629b8baae80bc87d2071c842c8ede6f2d8e54f87e7d439c79b9a38ad94591e6fd5cf96196f2221426a4c8a2ffb282030fbcf810c18fb +++ b/bitcoin/src/main.cpp 07f7a221f9a259415c81d76437369f62405b60d39917a70c23e2f9c2126259b7c4d6f589bdc3a8260197e35964f22d97e002d2e8226678a68efa68c147b78c87 @@ -1320,7 +1320,8 @@ return true; } -bool ProcessBlock(CNode* pfrom, CBlock* pblock) + +bool do_ProcessBlock(CNode* pfrom, CBlock* pblock) { // Check for duplicate uint256 hash = pblock->GetHash(); @@ -1375,6 +1376,18 @@ } +// Timing wrapper for ProcessBlock, to determine portion of time spent waiting for db. +bool ProcessBlock(CNode* pfrom, CBlock* pblock) +{ + int64 dbStart = DbWriteOdometer(0); + int64 pbStart = GetTimeMillis(); + bool res = do_ProcessBlock(pfrom, pblock); + int64 pbInterval = GetTimeMillis() - pbStart; + int64 dbInterval = DbWriteOdometer(0) - dbStart; + printf("ProcessBlock (res == %d) took : %"PRI64d"ms; db write wait: %"PRI64d"ms \n", + res, pbInterval, dbInterval); + return res; +}