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:
parent
53f9fd9b27
commit
249db27761
@ -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;
|
||||||
|
@ -544,7 +544,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
strUsage += HelpMessageOpt("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT));
|
strUsage += HelpMessageOpt("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_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("-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));
|
||||||
}
|
}
|
||||||
string debugCategories = "addrman, alert, bench, coindb, db, http, libevent, lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, tor, zmq, "
|
string debugCategories = "addrman, alert, bench, coindb, db, http, leveldb, libevent, lock, mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, tor, zmq, "
|
||||||
"dash (or specifically: gobject, instantsend, keepass, masternode, mnpayments, mnsync, privatesend, spork)"; // Don't translate these and qt below
|
"dash (or specifically: gobject, instantsend, keepass, masternode, mnpayments, mnsync, privatesend, spork)"; // Don't translate these and qt below
|
||||||
if (mode == HMM_BITCOIN_QT)
|
if (mode == HMM_BITCOIN_QT)
|
||||||
debugCategories += ", qt";
|
debugCategories += ", qt";
|
||||||
|
Loading…
Reference in New Issue
Block a user