8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 15:23:03 +01:00

Fixed bug #8386 : Crash when creating index on table that uses UDR and ParallelWorkers > 1

This commit is contained in:
Vlad Khorsun 2025-01-18 18:01:24 +02:00
parent 2d6bb146e7
commit 3b2489c5e0
2 changed files with 19 additions and 8 deletions

View File

@ -76,12 +76,12 @@ WorkerStableAttachment::~WorkerStableAttachment()
fini(); fini();
} }
WorkerStableAttachment* WorkerStableAttachment::create(FbStatusVector* status, Jrd::Database* dbb) WorkerStableAttachment* WorkerStableAttachment::create(FbStatusVector* status, Database* dbb, JProvider* provider)
{ {
Attachment* attachment = NULL; Attachment* attachment = NULL;
try try
{ {
attachment = Attachment::create(dbb, NULL); attachment = Attachment::create(dbb, provider);
attachment->att_filename = dbb->dbb_filename; attachment->att_filename = dbb->dbb_filename;
attachment->att_flags |= ATT_worker; attachment->att_flags |= ATT_worker;
@ -120,6 +120,8 @@ void WorkerStableAttachment::fini()
BackgroundContextHolder tdbb(dbb, attachment, &status_vector, FB_FUNCTION); BackgroundContextHolder tdbb(dbb, attachment, &status_vector, FB_FUNCTION);
Monitoring::cleanupAttachment(tdbb); Monitoring::cleanupAttachment(tdbb);
dbb->dbb_extManager->closeAttachment(tdbb, attachment);
attachment->releaseLocks(tdbb); attachment->releaseLocks(tdbb);
LCK_fini(tdbb, LCK_OWNER_attachment); LCK_fini(tdbb, LCK_OWNER_attachment);
@ -433,18 +435,17 @@ StableAttachmentPart* WorkerAttachment::doAttach(FbStatusVector* status, Databas
{ {
StableAttachmentPart* sAtt = NULL; StableAttachmentPart* sAtt = NULL;
AutoPlugin<JProvider> jInstance(JProvider::getInstance());
//jInstance->setDbCryptCallback(&status, tdbb->getAttachment()->att_crypt_callback);
if (Config::getServerMode() == MODE_SUPER) if (Config::getServerMode() == MODE_SUPER)
sAtt = WorkerStableAttachment::create(status, dbb); sAtt = WorkerStableAttachment::create(status, dbb, jInstance);
else else
{ {
ClumpletWriter dpb(ClumpletReader::Tagged, MAX_DPB_SIZE, isc_dpb_version1); ClumpletWriter dpb(ClumpletReader::Tagged, MAX_DPB_SIZE, isc_dpb_version1);
dpb.insertString(isc_dpb_trusted_auth, DBA_USER_NAME); dpb.insertString(isc_dpb_trusted_auth, DBA_USER_NAME);
dpb.insertInt(isc_dpb_worker_attach, 1); dpb.insertInt(isc_dpb_worker_attach, 1);
AutoPlugin<JProvider> jInstance(JProvider::getInstance());
//jInstance->setDbCryptCallback(&status, tdbb->getAttachment()->att_crypt_callback);
JAttachment* jAtt = jInstance->attachDatabase(status, dbb->dbb_filename.c_str(), JAttachment* jAtt = jInstance->attachDatabase(status, dbb->dbb_filename.c_str(),
dpb.getBufferLength(), dpb.getBuffer()); dpb.getBufferLength(), dpb.getBuffer());
@ -456,6 +457,7 @@ StableAttachmentPart* WorkerAttachment::doAttach(FbStatusVector* status, Databas
{ {
sAtt->addRef(); // !! sAtt->addRef(); // !!
sAtt->getHandle()->setIdleTimeout(WORKER_IDLE_TIMEOUT); sAtt->getHandle()->setIdleTimeout(WORKER_IDLE_TIMEOUT);
jInstance->addRef();
} }
return sAtt; return sAtt;
@ -465,6 +467,15 @@ void WorkerAttachment::doDetach(FbStatusVector* status, StableAttachmentPart* sA
{ {
status->init(); status->init();
AutoPlugin<JProvider> provider;
{
AttSyncLockGuard guard(*sAtt->getSync(), FB_FUNCTION);
Attachment* attachment = sAtt->getHandle();
if (attachment)
provider.reset(attachment->getProvider());
}
// if (att->att_flags & ATT_system) // if (att->att_flags & ATT_system)
if (Config::getServerMode() == MODE_SUPER) if (Config::getServerMode() == MODE_SUPER)
{ {

View File

@ -46,7 +46,7 @@ namespace Jrd
class WorkerStableAttachment : public SysStableAttachment class WorkerStableAttachment : public SysStableAttachment
{ {
public: public:
static WorkerStableAttachment* create(FbStatusVector* status, Jrd::Database* dbb); static WorkerStableAttachment* create(FbStatusVector* status, Database* dbb, JProvider* provider);
void fini(); void fini();