Skip to content

Commit dc6ab10

Browse files
committed
Merge pull request #9171 from FirebirdSQL/work/gh-9169
Fixed bug #9169 : SuperServer: no attachment to ANY database can proceed while two or more attachments wait for a database under exclusive validation
1 parent a5011e6 commit dc6ab10

5 files changed

Lines changed: 15 additions & 13 deletions

File tree

‎src/jrd/Database.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ class Database : public pool_alloc<type_dbb>
485485
USHORT dbb_dp_per_pp; // data pages per pointer page
486486
USHORT dbb_max_records; // max record per data page
487487
USHORT dbb_max_idx; // max number of indexes on a root page
488+
ULONG dbb_rdb_pages; // cached number of first PP of RDB$PAGES relation, see hdr_PAGES
488489

489490
#ifdef SUPERSERVER_V2
490491
USHORT dbb_prefetch_sequence; // sequence to pace frequency of prefetch requests

‎src/jrd/dpm.epp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ void DPM_create_relation_pages(thread_db* tdbb, jrd_rel* relation, RelationPages
596596
header_page* header = (header_page*) CCH_FETCH(tdbb, &root_window, LCK_write, pag_header);
597597
CCH_MARK(tdbb, &root_window);
598598
header->hdr_PAGES = window.win_page.getPageNum();
599+
dbb->dbb_rdb_pages = header->hdr_PAGES;
599600

600601
CCH_RELEASE(tdbb, &root_window);
601602
}

‎src/jrd/ini.epp‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,17 @@ void INI_init(thread_db* tdbb)
733733
field->fld_name = names[fld[RFLD_F_NAME]];
734734
}
735735
}
736+
737+
if (dbb->dbb_rdb_pages)
738+
{
739+
jrd_rel* relation = MET_relation(tdbb, 0);
740+
RelationPages* relPages = relation->getBasePages();
741+
fb_assert(!relPages->rel_pages);
742+
743+
vcl* vector = vcl::newVector(*relation->rel_pool, 1);
744+
relPages->rel_pages = vector;
745+
(*vector)[0] = dbb->dbb_rdb_pages;
746+
}
736747
}
737748

738749

‎src/jrd/jrd.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,9 +1825,9 @@ JAttachment* JProvider::internalAttach(CheckStatusWrapper* user_status, const ch
18251825

18261826
jAtt->getStable()->manualAsyncUnlock(attachment->att_flags);
18271827

1828+
PAG_header_init(tdbb);
18281829
INI_init(tdbb);
18291830
SHUT_init(tdbb);
1830-
PAG_header_init(tdbb);
18311831
INI_init2(tdbb);
18321832
PAG_init(tdbb);
18331833

@@ -1888,7 +1888,6 @@ JAttachment* JProvider::internalAttach(CheckStatusWrapper* user_status, const ch
18881888

18891889
INI_init(tdbb);
18901890
INI_init2(tdbb);
1891-
PAG_header(tdbb, true);
18921891
dbb->dbb_crypto_manager->attach(tdbb, attachment);
18931892
}
18941893

‎src/jrd/pag.cpp‎

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,17 +1122,6 @@ void PAG_header(thread_db* tdbb, bool info)
11221122
if (header->hdr_flags & hdr_SQL_dialect_3)
11231123
dbb->dbb_flags |= DBB_DB_SQL_dialect_3;
11241124

1125-
jrd_rel* relation = MET_relation(tdbb, 0);
1126-
RelationPages* relPages = relation->getBasePages();
1127-
if (!relPages->rel_pages)
1128-
{
1129-
// NS: There's no need to reassign first page for RDB$PAGES relation since
1130-
// current code cannot change its location after database creation.
1131-
vcl* vector = vcl::newVector(*relation->rel_pool, 1);
1132-
relPages->rel_pages = vector;
1133-
(*vector)[0] = header->hdr_PAGES;
1134-
}
1135-
11361125
dbb->dbb_next_transaction = next_transaction;
11371126

11381127
if (!info || dbb->dbb_oldest_transaction < oldest_transaction)
@@ -1334,6 +1323,7 @@ void PAG_header_init(thread_db* tdbb)
13341323

13351324
dbb->dbb_page_size = header->hdr_page_size;
13361325
dbb->dbb_page_buffers = header->hdr_page_buffers;
1326+
dbb->dbb_rdb_pages = header->hdr_PAGES;
13371327
}
13381328

13391329

0 commit comments

Comments
 (0)