8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:40:38 +01:00

This should fix hanging replicator on disconnect (CORE-6497)

This commit is contained in:
Dmitry Yemanov 2021-02-24 20:12:11 +03:00
parent c6f93eb9ee
commit f18079af4d
5 changed files with 40 additions and 8 deletions

View File

@ -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()
@ -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)

View File

@ -307,6 +307,8 @@ class Database : public pool_alloc<type_dbb>
~GlobalObjectHolder();
void shutdown();
LockManager* getLockManager();
EventManager* getEventManager();
Replication::Manager* getReplManager(bool create);
@ -658,7 +660,8 @@ public:
const CoercionArray *getBindings() const;
void initGlobalObjectHolder(thread_db* tdbb);
void initGlobalObjects();
void shutdownGlobalObjects();
LockManager* lockManager()
{

View File

@ -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);
@ -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);
@ -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);

View File

@ -184,6 +184,12 @@ Manager::Manager(const string& dbId,
}
Manager::~Manager()
{
for (auto& buffer : m_buffers)
delete buffer;
}
void Manager::shutdown()
{
m_shutdown = true;
@ -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;
@ -202,8 +217,7 @@ Manager::~Manager()
iter->attachment->detach(&localStatus);
}
while (m_buffers.hasData())
delete m_buffers.pop();
m_replicas.clear();
}
UCharBuffer* Manager::getBuffer()

View File

@ -71,6 +71,8 @@ namespace Replication
const Replication::Config* config);
~Manager();
void shutdown();
Firebird::UCharBuffer* getBuffer();
void releaseBuffer(Firebird::UCharBuffer* buffer);