Add function to close all Db's and reload the databae environment

Adds a ReloadDbEnv function to BerkeleyEnvironment in order to close all Db
instances, closes the environment, resets it, and then reopens
the BerkeleyEnvironment.

Also adds a ReloadDbEnv function to BerkeleyDatabase that calls
BerkeleyEnvironment's ReloadDbEnv.

Github-Pull: #12493
Rebased-From: 5d296ac
This commit is contained in:
Andrew Chow 2018-02-20 15:28:42 -05:00 committed by Anthony Fieroni
parent 2558be26e4
commit cafa1709b6
2 changed files with 28 additions and 0 deletions

View file

@ -674,6 +674,32 @@ void BerkeleyEnvironment::ReloadDbEnv()
Open(true); Open(true);
} }
void BerkeleyEnvironment::ReloadDbEnv()
{
// Make sure that no Db's are in use
AssertLockNotHeld(cs_db);
std::unique_lock<CCriticalSection> lock(cs_db);
m_db_in_use.wait(lock, [this](){
for (auto& count : mapFileUseCount) {
if (count.second > 0) return false;
}
return true;
});
std::vector<std::string> filenames;
for (auto it : mapDb) {
filenames.push_back(it.first);
}
// Close the individual Db's
for (const std::string& filename : filenames) {
CloseDb(filename);
}
// Reset the environment
Flush(true); // This will flush and close the environment
Reset();
Open(true);
}
bool BerkeleyBatch::Rewrite(BerkeleyDatabase& database, const char* pszSkip) bool BerkeleyBatch::Rewrite(BerkeleyDatabase& database, const char* pszSkip)
{ {
if (database.IsDummy()) { if (database.IsDummy()) {

View file

@ -169,6 +169,8 @@ public:
void ReloadDbEnv(); void ReloadDbEnv();
void ReloadDbEnv();
std::atomic<unsigned int> nUpdateCounter; std::atomic<unsigned int> nUpdateCounter;
unsigned int nLastSeen; unsigned int nLastSeen;
unsigned int nLastFlushed; unsigned int nLastFlushed;