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:
parent
c6f93eb9ee
commit
f18079af4d
@ -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)
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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()
|
||||
|
@ -71,6 +71,8 @@ namespace Replication
|
||||
const Replication::Config* config);
|
||||
~Manager();
|
||||
|
||||
void shutdown();
|
||||
|
||||
Firebird::UCharBuffer* getBuffer();
|
||||
void releaseBuffer(Firebird::UCharBuffer* buffer);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user