Skip to content

Commit

Permalink
locks exhaustion fix
Browse files Browse the repository at this point in the history
  • Loading branch information
alex authored and alex committed May 19, 2013
1 parent 42c5268 commit 16e1262
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion src/db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "util.h"
#include "main.h"
#include "kernel.h"
#include "ui_interface.h"
#include <boost/version.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
Expand Down Expand Up @@ -85,7 +86,11 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)
dbenv.set_cachesize(nDbCache / 1024, (nDbCache % 1024)*1048576, 1);
dbenv.set_lg_bsize(1048576);
dbenv.set_lg_max(10485760);
dbenv.set_lk_max_locks(10000);

// Bugfix: Bump lk_max_locks default to 537000, to safely handle reorgs with up to 5 blocks reversed
// dbenv.set_lk_max_locks(10000);
dbenv.set_lk_max_locks(537000);

dbenv.set_lk_max_objects(10000);
dbenv.set_errfile(fopen(pathErrorFile.string().c_str(), "a")); /// debug
dbenv.set_flags(DB_AUTO_COMMIT, 1);
Expand All @@ -106,6 +111,30 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)

fDbEnvInit = true;
fMockDb = false;

// Check that the number of locks is sufficient (to prevent chain fork possibility, read http://bitcoin.org/may15 for more info)
u_int32_t nMaxLocks;
if (!dbenv.get_lk_max_locks(&nMaxLocks))
{
int nBlocks, nDeepReorg;
std::string strMessage;

nBlocks = nMaxLocks / 48768;
nDeepReorg = (nBlocks - 1) / 2;

printf("Final lk_max_locks is %lu, sufficient for (worst case) %d block%s in a single transaction (up to a %d-deep reorganization)\n", (unsigned long)nMaxLocks, nBlocks, (nBlocks == 1) ? "" : "s", nDeepReorg);
if (nDeepReorg < 3)
{
if (nBlocks < 1)
strMessage = strprintf(_("Warning: DB_CONFIG has set_lk_max_locks %lu, which may be too low for a single block. If this limit is reached, NovaCoin may stop working."), (unsigned long)nMaxLocks);
else
strMessage = strprintf(_("Warning: DB_CONFIG has set_lk_max_locks %lu, which may be too low for a common blockchain reorganization. If this limit is reached, NovaCoin may stop working."), (unsigned long)nMaxLocks);

strMiscWarning = strMessage;
printf("*** %s\n", strMessage.c_str());
}
}

return true;
}

Expand Down

0 comments on commit 16e1262

Please sign in to comment.