Merge #9999: [LevelDB] Plug leveldb logs to bitcoin logs
cfce581
[LevelDB] Plug leveldb logs to bitcoin logs (NicolasDorier)
Tree-SHA512: e40a2c2644c269bb2da7be04aec39ff64ad350d508391750a757955ed3f9d96998775d01e04b282a75b36d776c3960a345cc7b6f1466e6ae167d27518bf4baee
This commit is contained in:
commit
a328904480
2 changed files with 62 additions and 1 deletions
|
@ -14,6 +14,64 @@
|
||||||
#include <leveldb/filter_policy.h>
|
#include <leveldb/filter_policy.h>
|
||||||
#include <memenv.h>
|
#include <memenv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
class CBitcoinLevelDBLogger : public leveldb::Logger {
|
||||||
|
public:
|
||||||
|
// This code is adapted from posix_logger.h, which is why it is using vsprintf.
|
||||||
|
// Please do not do this in normal code
|
||||||
|
virtual void Logv(const char * format, va_list ap) override {
|
||||||
|
if (!LogAcceptCategory("leveldb"))
|
||||||
|
return;
|
||||||
|
char buffer[500];
|
||||||
|
for (int iter = 0; iter < 2; iter++) {
|
||||||
|
char* base;
|
||||||
|
int bufsize;
|
||||||
|
if (iter == 0) {
|
||||||
|
bufsize = sizeof(buffer);
|
||||||
|
base = buffer;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bufsize = 30000;
|
||||||
|
base = new char[bufsize];
|
||||||
|
}
|
||||||
|
char* p = base;
|
||||||
|
char* limit = base + bufsize;
|
||||||
|
|
||||||
|
// Print the message
|
||||||
|
if (p < limit) {
|
||||||
|
va_list backup_ap;
|
||||||
|
va_copy(backup_ap, ap);
|
||||||
|
// Do not use vsnprintf elsewhere in bitcoin source code, see above.
|
||||||
|
p += vsnprintf(p, limit - p, format, backup_ap);
|
||||||
|
va_end(backup_ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate to available space if necessary
|
||||||
|
if (p >= limit) {
|
||||||
|
if (iter == 0) {
|
||||||
|
continue; // Try again with larger buffer
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p = limit - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add newline if necessary
|
||||||
|
if (p == base || p[-1] != '\n') {
|
||||||
|
*p++ = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(p <= limit);
|
||||||
|
base[std::min(bufsize - 1, (int)(p - base))] = '\0';
|
||||||
|
LogPrintStr(base);
|
||||||
|
if (base != buffer) {
|
||||||
|
delete[] base;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static leveldb::Options GetOptions(size_t nCacheSize)
|
static leveldb::Options GetOptions(size_t nCacheSize)
|
||||||
{
|
{
|
||||||
|
@ -23,6 +81,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
|
||||||
options.filter_policy = leveldb::NewBloomFilterPolicy(10);
|
options.filter_policy = leveldb::NewBloomFilterPolicy(10);
|
||||||
options.compression = leveldb::kNoCompression;
|
options.compression = leveldb::kNoCompression;
|
||||||
options.max_open_files = 64;
|
options.max_open_files = 64;
|
||||||
|
options.info_log = new CBitcoinLevelDBLogger();
|
||||||
if (leveldb::kMajorVersion > 1 || (leveldb::kMajorVersion == 1 && leveldb::kMinorVersion >= 16)) {
|
if (leveldb::kMajorVersion > 1 || (leveldb::kMajorVersion == 1 && leveldb::kMinorVersion >= 16)) {
|
||||||
// LevelDB versions before 1.16 consider short writes to be corruption. Only trigger error
|
// LevelDB versions before 1.16 consider short writes to be corruption. Only trigger error
|
||||||
// on corruption in later versions.
|
// on corruption in later versions.
|
||||||
|
@ -82,6 +141,8 @@ CDBWrapper::~CDBWrapper()
|
||||||
pdb = NULL;
|
pdb = NULL;
|
||||||
delete options.filter_policy;
|
delete options.filter_policy;
|
||||||
options.filter_policy = NULL;
|
options.filter_policy = NULL;
|
||||||
|
delete options.info_log;
|
||||||
|
options.info_log = NULL;
|
||||||
delete options.block_cache;
|
delete options.block_cache;
|
||||||
options.block_cache = NULL;
|
options.block_cache = NULL;
|
||||||
delete penv;
|
delete penv;
|
||||||
|
|
|
@ -430,7 +430,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
strUsage += HelpMessageOpt("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT));
|
strUsage += HelpMessageOpt("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT));
|
||||||
strUsage += HelpMessageOpt("-bip9params=deployment:start:end", "Use given start/end times for specified BIP9 deployment (regtest-only)");
|
strUsage += HelpMessageOpt("-bip9params=deployment:start:end", "Use given start/end times for specified BIP9 deployment (regtest-only)");
|
||||||
}
|
}
|
||||||
std::string debugCategories = "addrman, alert, bench, cmpctblock, coindb, db, http, libevent, lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, tor, zmq"; // Don't translate these and qt below
|
std::string debugCategories = "addrman, alert, bench, cmpctblock, coindb, db, http, leveldb, libevent, lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, tor, zmq"; // Don't translate these and qt below
|
||||||
if (mode == HMM_BITCOIN_QT)
|
if (mode == HMM_BITCOIN_QT)
|
||||||
debugCategories += ", qt";
|
debugCategories += ", qt";
|
||||||
strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
|
strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
|
||||||
|
|
Loading…
Reference in a new issue