Skip to content

Commit 4079526

Browse files
committed
Allow isc_tpb_read_consistency to imply read committed (#8746)
* Allow isc_tpb_read_consistency used alone to imply Read Committed Read Consistency * Sync the trace logic with MON$ tables regarding txn isolation, make it more robust to improper set of flags * Restore the original error for isc_tpb_[no_]rec_version version specified without isc_tpb_read_committed
1 parent 08437bf commit 4079526

File tree

2 files changed

+51
-34
lines changed

2 files changed

+51
-34
lines changed

src/jrd/tra.cpp

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,39 +2935,63 @@ static void transaction_options(thread_db* tdbb,
29352935
{
29362936
case isc_tpb_consistency:
29372937
if (!isolation.assignOnce(true))
2938+
{
29382939
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29392940
Arg::Gds(isc_tpb_multiple_txn_isolation));
2941+
}
2942+
2943+
if (read_consistency.isAssigned())
2944+
{
2945+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2946+
// 'Option @1 is not valid if @2 was used previously in TPB'
2947+
Arg::Gds(isc_tpb_conflicting_options) <<
2948+
Arg::Str("isc_tpb_consistency") << Arg::Str("isc_tpb_read_consistency"));
2949+
}
29402950

29412951
if (shared_snapshot)
29422952
{
29432953
ERR_post(
29442954
Arg::Gds(isc_bad_tpb_content) <<
2955+
// 'Option @1 is not valid if @2 was used previously in TPB'
29452956
Arg::Gds(isc_tpb_conflicting_options) <<
29462957
Arg::Str("isc_tpb_consistency") << Arg::Str("isc_tpb_at_snapshot_number"));
29472958
}
29482959

29492960
transaction->tra_flags |= TRA_degree3;
2950-
transaction->tra_flags &= ~TRA_read_committed;
2961+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29512962
break;
29522963

29532964
case isc_tpb_concurrency:
29542965
if (!isolation.assignOnce(true))
2966+
{
29552967
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29562968
Arg::Gds(isc_tpb_multiple_txn_isolation));
2969+
}
2970+
2971+
if (read_consistency.isAssigned())
2972+
{
2973+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
2974+
// 'Option @1 is not valid if @2 was used previously in TPB'
2975+
Arg::Gds(isc_tpb_conflicting_options) <<
2976+
Arg::Str("isc_tpb_concurrency") << Arg::Str("isc_tpb_read_consistency"));
2977+
}
29572978

29582979
transaction->tra_flags &= ~TRA_degree3;
2959-
transaction->tra_flags &= ~TRA_read_committed;
2980+
transaction->tra_flags &= ~(TRA_read_committed | TRA_read_consistency | TRA_rec_version);
29602981
break;
29612982

29622983
case isc_tpb_read_committed:
29632984
if (!isolation.assignOnce(true))
2985+
{
29642986
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
29652987
Arg::Gds(isc_tpb_multiple_txn_isolation));
2988+
}
29662989

29672990
if (shared_snapshot)
29682991
{
29692992
ERR_post(
29702993
Arg::Gds(isc_bad_tpb_content) <<
2994+
// 'Option @1 is not valid if @2 was used previously in TPB'
29712995
Arg::Gds(isc_tpb_conflicting_options) <<
29722996
Arg::Str("isc_tpb_read_committed") << Arg::Str("isc_tpb_at_snapshot_number"));
29732997
}
@@ -3072,14 +3096,16 @@ static void transaction_options(thread_db* tdbb,
30723096

30733097
if (rec_version.isAssigned())
30743098
{
3099+
const auto tpbStr = rec_version.value ?
3100+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
3101+
30753102
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
30763103
// 'Option @1 is not valid if @2 was used previously in TPB'
30773104
Arg::Gds(isc_tpb_conflicting_options) <<
3078-
Arg::Str("isc_tpb_read_consistency") << (rec_version.value ?
3079-
Arg::Str("isc_tpb_rec_version") : Arg::Str("isc_tpb_no_rec_version")) );
3105+
Arg::Str("isc_tpb_read_consistency") << Arg::Str(tpbStr) );
30803106
}
30813107

3082-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3108+
transaction->tra_flags |= TRA_read_committed | TRA_read_consistency | TRA_rec_version;
30833109
break;
30843110

30853111
case isc_tpb_nowait:
@@ -3427,22 +3453,19 @@ static void transaction_options(thread_db* tdbb,
34273453

34283454
if (rec_version.isAssigned() && !(transaction->tra_flags & TRA_read_committed))
34293455
{
3430-
if (rec_version.value)
3431-
{
3432-
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3433-
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str("isc_tpb_rec_version"));
3434-
}
3435-
else
3436-
{
3437-
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3438-
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str("isc_tpb_no_rec_version"));
3439-
}
3456+
const auto tpbStr = rec_version.value ?
3457+
"isc_tpb_rec_version" : "isc_tpb_no_rec_version";
3458+
3459+
ERR_post(Arg::Gds(isc_bad_tpb_content) <<
3460+
Arg::Gds(isc_tpb_option_without_rc) << Arg::Str(tpbStr));
34403461
}
34413462

3442-
if ((transaction->tra_flags & TRA_read_committed) && !(tdbb->tdbb_flags & TDBB_sweeper))
3463+
if ((transaction->tra_flags & TRA_read_committed) &&
3464+
!(transaction->tra_flags & TRA_read_consistency) &&
3465+
!(tdbb->tdbb_flags & TDBB_sweeper) &&
3466+
tdbb->getDatabase()->dbb_config->getReadConsistency())
34433467
{
3444-
if (tdbb->getDatabase()->dbb_config->getReadConsistency())
3445-
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
3468+
transaction->tra_flags |= TRA_read_consistency | TRA_rec_version;
34463469
}
34473470

34483471
if (transaction->tra_attachment->isGbak())

src/jrd/trace/TraceObjects.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -210,27 +210,21 @@ int TraceTransactionImpl::getWait()
210210

211211
unsigned TraceTransactionImpl::getIsolation()
212212
{
213-
switch (m_tran->tra_flags & (TRA_read_committed | TRA_rec_version | TRA_degree3 | TRA_read_consistency))
214-
{
215-
case TRA_degree3:
213+
if (m_tran->tra_flags & TRA_degree3)
216214
return ISOLATION_CONSISTENCY;
217215

218-
case TRA_read_committed:
219-
return ISOLATION_READ_COMMITTED_NORECVER;
220-
221-
case TRA_read_committed | TRA_rec_version:
222-
return ISOLATION_READ_COMMITTED_RECVER;
223-
224-
case TRA_read_committed | TRA_rec_version | TRA_read_consistency:
225-
return ISOLATION_READ_COMMITTED_READ_CONSISTENCY;
216+
if (m_tran->tra_flags & TRA_read_committed)
217+
{
218+
if (m_tran->tra_flags & TRA_read_consistency)
219+
return ISOLATION_READ_COMMITTED_READ_CONSISTENCY;
226220

227-
case 0:
228-
return ISOLATION_CONCURRENCY;
221+
if (m_tran->tra_flags & TRA_rec_version)
222+
return ISOLATION_READ_COMMITTED_RECVER;
229223

230-
default:
231-
fb_assert(false);
232-
return ISOLATION_CONCURRENCY;
224+
return ISOLATION_READ_COMMITTED_NORECVER;
233225
}
226+
227+
return ISOLATION_CONCURRENCY;
234228
}
235229

236230
ISC_INT64 TraceTransactionImpl::getInitialID()

0 commit comments

Comments
 (0)