Skip to content

Commit caf7a6b

Browse files
committed
Frontported bugfix for blob access vs replicator
1 parent 7c28af8 commit caf7a6b

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

src/jrd/replication/Publisher.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ void REPL_store(thread_db* tdbb, const record_param* rpb, jrd_tra* transaction)
523523
// This temporary auto-pointer is just to delete a temporary record
524524
AutoPtr<Record> cleanupRecord(record != rpb->rpb_record ? record : nullptr);
525525
AutoSetRestoreFlag<ULONG> noRecursion(&tdbb->tdbb_flags, TDBB_repl_in_progress, true);
526+
AutoSetRestoreFlag<ULONG> noBlobCheck(&transaction->tra_flags, TRA_no_blob_check, true);
526527

527528
ReplicatedRecordImpl replRecord(tdbb, relation, record);
528529

@@ -571,6 +572,7 @@ void REPL_modify(thread_db* tdbb, const record_param* orgRpb,
571572
}
572573

573574
AutoSetRestoreFlag<ULONG> noRecursion(&tdbb->tdbb_flags, TDBB_repl_in_progress, true);
575+
AutoSetRestoreFlag<ULONG> noBlobCheck(&transaction->tra_flags, TRA_no_blob_check, true);
574576

575577
ReplicatedRecordImpl replOrgRecord(tdbb, relation, orgRecord);
576578
ReplicatedRecordImpl replNewRecord(tdbb, relation, newRecord);
@@ -605,6 +607,7 @@ void REPL_erase(thread_db* tdbb, const record_param* rpb, jrd_tra* transaction)
605607
// This temporary auto-pointer is just to delete a temporary record
606608
AutoPtr<Record> cleanupRecord(record != rpb->rpb_record ? record : nullptr);
607609
AutoSetRestoreFlag<ULONG> noRecursion(&tdbb->tdbb_flags, TDBB_repl_in_progress, true);
610+
AutoSetRestoreFlag<ULONG> noBlobCheck(&transaction->tra_flags, TRA_no_blob_check, true);
608611

609612
ReplicatedRecordImpl replRecord(tdbb, relation, record);
610613

src/jrd/tra.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3442,6 +3442,9 @@ static void transaction_options(thread_db* tdbb,
34423442
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
34433443
}
34443444

3445+
if (transaction->tra_attachment->isGbak())
3446+
transaction->tra_flags |= TRA_no_blob_check;
3447+
34453448
// If there aren't any relation locks to seize, we're done.
34463449

34473450
vec<Lock*>* vector = transaction->tra_relation_locks;
@@ -4066,11 +4069,11 @@ void jrd_tra::releaseSavepoint(thread_db* tdbb)
40664069

40674070
void jrd_tra::checkBlob(thread_db* tdbb, const bid* blob_id, jrd_fld* fld, bool punt)
40684071
{
4069-
USHORT rel_id = blob_id->bid_internal.bid_relation_id;
4072+
const USHORT rel_id = blob_id->bid_internal.bid_relation_id;
40704073

4071-
if (tra_attachment->isGbak() ||
4072-
(tra_attachment->locksmith(tdbb, SELECT_ANY_OBJECT_IN_DATABASE)) ||
4073-
rel_id == 0)
4074+
if (rel_id == 0 ||
4075+
(tra_flags & TRA_no_blob_check) ||
4076+
tra_attachment->locksmith(tdbb, SELECT_ANY_OBJECT_IN_DATABASE))
40744077
{
40754078
return;
40764079
}

src/jrd/tra.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ const ULONG TRA_own_interface = 0x20000L; // tra_interface was created for int
433433
const ULONG TRA_read_consistency = 0x40000L; // ensure read consistency in this transaction
434434
const ULONG TRA_ex_restart = 0x80000L; // Exception was raised to restart request
435435
const ULONG TRA_replicating = 0x100000L; // transaction is allowed to be replicated
436+
const ULONG TRA_no_blob_check = 0x200000L; // disable blob access checking
436437

437438
// flags derived from TPB, see also transaction_options() at tra.cpp
438439
const ULONG TRA_OPTIONS_MASK = (TRA_degree3 | TRA_readonly | TRA_ignore_limbo | TRA_read_committed |

0 commit comments

Comments
 (0)