Skip to content

Commit

Permalink
This should fix hanging replicator on disconnect (CORE-6497)
Browse files Browse the repository at this point in the history
  • Loading branch information
dyemanov committed Feb 24, 2021
1 parent c6f93eb commit f18079a
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 8 deletions.
13 changes: 12 additions & 1 deletion src/jrd/Database.cpp
Expand Up @@ -450,12 +450,17 @@ namespace Jrd
return 0;
}

void Database::initGlobalObjectHolder(thread_db* tdbb)
void Database::initGlobalObjects()
{
dbb_gblobj_holder =
GlobalObjectHolder::init(getUniqueFileId(), dbb_filename, dbb_config);
}

void Database::shutdownGlobalObjects()
{
dbb_gblobj_holder->shutdown();
}

// Database::Linger class implementation

void Database::Linger::handler()
Expand Down Expand Up @@ -523,6 +528,12 @@ namespace Jrd
m_replMgr = nullptr;
}

void Database::GlobalObjectHolder::shutdown()
{
if (m_replMgr)
m_replMgr->shutdown();
}

LockManager* Database::GlobalObjectHolder::getLockManager()
{
if (!m_lockMgr)
Expand Down
5 changes: 4 additions & 1 deletion src/jrd/Database.h
Expand Up @@ -307,6 +307,8 @@ class Database : public pool_alloc<type_dbb>

~GlobalObjectHolder();

void shutdown();

LockManager* getLockManager();
EventManager* getEventManager();
Replication::Manager* getReplManager(bool create);
Expand Down Expand Up @@ -658,7 +660,8 @@ class Database : public pool_alloc<type_dbb>

const CoercionArray *getBindings() const;

void initGlobalObjectHolder(thread_db* tdbb);
void initGlobalObjects();
void shutdownGlobalObjects();

LockManager* lockManager()
{
Expand Down
10 changes: 6 additions & 4 deletions src/jrd/jrd.cpp
Expand Up @@ -1784,8 +1784,8 @@ JAttachment* JProvider::internalAttach(CheckStatusWrapper* user_status, const ch
PageSpace* pageSpace = dbb->dbb_page_manager.findPageSpace(DB_PAGE_SPACE);
pageSpace->file = PIO_open(tdbb, expanded_name, org_filename);

// Initialize the global object holder
dbb->initGlobalObjectHolder(tdbb);
// Initialize the global objects
dbb->initGlobalObjects();

// Initialize locks
LCK_init(tdbb, LCK_OWNER_database);
Expand Down Expand Up @@ -2965,8 +2965,8 @@ JAttachment* JProvider::createDatabase(CheckStatusWrapper* user_status, const ch
os_utils::getUniqueFileId(dbb->dbb_filename.c_str(), dbb->dbb_id);
#endif

// Initialize the global object holder
dbb->initGlobalObjectHolder(tdbb);
// Initialize the global objects
dbb->initGlobalObjects();

// Initialize locks
LCK_init(tdbb, LCK_OWNER_database);
Expand Down Expand Up @@ -7721,6 +7721,8 @@ bool JRD_shutdown_database(Database* dbb, const unsigned flags)

CCH_fini(tdbb);

dbb->shutdownGlobalObjects();

{ // scope
MutexLockGuard listGuard2(databases_mutex, FB_FUNCTION);

Expand Down
18 changes: 16 additions & 2 deletions src/jrd/replication/Manager.cpp
Expand Up @@ -184,6 +184,12 @@ Manager::Manager(const string& dbId,
}

Manager::~Manager()
{
for (auto& buffer : m_buffers)
delete buffer;
}

void Manager::shutdown()
{
m_shutdown = true;

Expand All @@ -192,6 +198,15 @@ Manager::~Manager()

MutexLockGuard guard(m_queueMutex, FB_FUNCTION);

for (auto& buffer : m_queue)
{
if (buffer)
{
releaseBuffer(buffer);
buffer = nullptr;
}
}

// Detach from synchronous replicas

FbLocalStatus localStatus;
Expand All @@ -202,8 +217,7 @@ Manager::~Manager()
iter->attachment->detach(&localStatus);
}

while (m_buffers.hasData())
delete m_buffers.pop();
m_replicas.clear();
}

UCharBuffer* Manager::getBuffer()
Expand Down
2 changes: 2 additions & 0 deletions src/jrd/replication/Manager.h
Expand Up @@ -71,6 +71,8 @@ namespace Replication
const Replication::Config* config);
~Manager();

void shutdown();

Firebird::UCharBuffer* getBuffer();
void releaseBuffer(Firebird::UCharBuffer* buffer);

Expand Down

0 comments on commit f18079a

Please sign in to comment.