69 #define X_LOG_COMMENT_ON 1 70 #define ADD_LOG_COMMENT_SIG ,const char *debugmsg 71 #define ADD_LOG_COMMENT_USE ,debugmsg 72 #define X_LOG_COMMENT_USE(x) ,x 76 #define X_LOG_COMMENT_ON 0 77 #define ADD_LOG_COMMENT_SIG 78 #define ADD_LOG_COMMENT_USE 79 #define X_LOG_COMMENT_USE(x) 155 class stid_list_elem_t {
161 stid_list_elem_t(
const StoreID& theStid)
164 ~stid_list_elem_t() {
170 static uint32_t link_offset() {
192 friend class lock_request_t;
195 typedef xct_state_t state_t;
209 xct_core(
tid_t const& t, state_t s,
int timeout);
235 void*
operator new(
size_t s);
237 void operator delete(
void* p,
size_t s);
251 enum loser_xct_state_t {
262 static rc_t group_commit(
const xct_t* list[],
int number);
266 rc_t early_lock_release();
269 void*
operator new(
size_t s);
271 void operator delete(
void* p,
size_t s);
276 bool sys_xct =
false,
277 bool single_log_sys_xct =
false,
278 const tid_t& tid = 0,
281 bool loser_xct =
false);
288 state_t state()
const;
290 void set_timeout(
int t);
292 int timeout_c()
const;
298 static void dump(ostream& o);
300 static void cleanup(
bool shutdown_clean =
true);
302 bool is_instrumented() {
303 return (__stats != 0);
312 memset(__stats, 0,
sizeof(*__stats));
325 rc_t commit(
bool lazy =
false,
lsn_t* plastlsn =
nullptr);
327 rc_t commit_as_group_member();
333 rc_t chain(
bool lazy =
false);
335 rc_t abort(
bool save_stats =
false);
345 void change_state(state_t new_state);
347 void set_first_lsn(
const lsn_t&);
349 void set_last_lsn(
const lsn_t&);
351 void set_undo_nxt(
const lsn_t&);
357 const lsn_t& last_lsn()
const;
359 const lsn_t& first_lsn()
const;
361 const lsn_t& undo_nxt()
const;
368 static tid_t oldest_tid();
369 static tid_t youngest_tid();
371 static void update_youngest_tid(
const tid_t&);
375 static uint32_t num_active_xcts();
377 static size_t get_loser_count();
379 static void fuzzy_checkpoint(
chkpt_t& chkpt);
383 const lsn_t& anchor(
bool grabit =
true);
385 void release_anchor(
bool compensate
389 void compensate(
const lsn_t&,
395 void compensate_undo(
const lsn_t&);
403 void log_warn_disable();
405 void log_warn_resume();
407 bool log_warn_is_on()
const;
416 void AddStoreToFree(
const StoreID& stid);
418 void AddLoadStore(
const StoreID& stid);
428 static lockid_t* new_lock_hierarchy();
435 RawXct* raw_lock_xct()
const;
441 static w_rc_t acquire_xlist_mutex();
443 static void release_xlist_mutex();
445 static void assert_xlist_mutex_not_mine();
447 static void assert_xlist_mutex_is_mine();
449 static bool xlist_mutex_is_mine();
464 void force_nonblocking();
563 rc_t _commit(uint32_t flags,
564 lsn_t* plastlsn =
nullptr);
567 rc_t _commit_read_only(uint32_t flags,
lsn_t& inherited_read_watermark);
569 rc_t _pre_commit(uint32_t flags);
574 bool one_thread_attached()
const;
576 void _compensate(
const lsn_t&,
bool undoable =
false);
580 return _piggy_backed_single_log_sys_xct;
584 _piggy_backed_single_log_sys_xct = enabled;
588 return _sys_xct || _piggy_backed_single_log_sys_xct;
592 return _single_log_sys_xct || _piggy_backed_single_log_sys_xct;
596 _inquery_verify = enabled;
600 return _inquery_verify;
604 _inquery_verify_keyorder = enabled;
608 return _inquery_verify_keyorder;
612 _inquery_verify_space = enabled;
616 return _inquery_verify_space;
620 return _inquery_verify_context;
624 return _inquery_verify_context;
628 return _query_concurrency;
632 _query_concurrency = mode;
636 return _query_exlock_for_select;
640 _query_exlock_for_select = mode;
644 if (loser_false == _loser_xct) {
652 if (
true == is_loser_xct()) {
653 if (loser_undoing == _loser_xct) {
661 if (loser_false != _loser_xct) {
662 _loser_xct = loser_undoing;
666 ostream& dump_locks(ostream&)
const;
675 static void xct_stats(
681 w_rc_t _sync_logbuf(
bool block =
true,
bool signal =
true);
683 void _teardown(
bool is_chaining);
754 bool should_consume_rollback_resv(
int t)
const;
758 return !should_consume_rollback_resv(t);
768 return _rolling_back;
771 #if W_DEBUG_LEVEL > 2 777 void set_error_encountered() { _had_error =
true; }
778 bool error_encountered()
const {
791 w_assert1(_core ==
nullptr || _tid == _core->_tid);
796 return _xct_chain_len;
800 return _ssx_chain_len;
804 return _read_watermark;
808 if (_read_watermark < tag) {
809 _read_watermark = tag;
834 return const_cast<latch_t*
>(&(_latch));
845 class auto_release_anchor_t {
851 auto_release_anchor_t(
bool and_compensate) :
852 _compensate(and_compensate),
855 ~auto_release_anchor_t() {
862 class auto_rollback_t {
881 if (_test && (_count % _test == 0)) {
882 return RC(eOUTOFLOGSPACE);
887 #define AUTO_ROLLBACK_work auto_rollback_t work(__LINE__, __FILE__); 889 auto_rollback_t(
int line,
const char* file)
899 W_COERCE(_xd->save_point(_save_pt));
909 if (_test && (_count % _test == 0)) {
916 #if 0 && W_DEBUG_LEVEL > 0 917 cerr <<
"Internal rollback to " << _save_pt
932 #define X_DO1(x,anchor,line) \ 935 if (__e.is_error()) { \ 937 W_COERCE(xct()->rollback(anchor)); \ 938 xct()->release_anchor(true X_LOG_COMMENT_USE("X_DO1")); \ 939 return RC_AUGMENT(__e); \ 942 #define X_to_string(x) # x 943 #define X_DO(x,anchor) X_DO1(x,anchor, X_to_string(x)) 947 #define X_DO(x, anchor) \ 950 if (__e.is_error()) { \ 952 W_COERCE(xct()->rollback(anchor)); \ 953 xct()->release_anchor(true X_LOG_COMMENT_USE("X_DO")); \ 954 return RC_AUGMENT(__e); \ 992 if (_locked && locked_by_me()) {
993 *(
const_cast<bool*
>(&_locked)) =
false;
1000 return unsafe_iterator.curr();
1005 return unsafe_iterator.next();
1010 static bool init_locked(
bool lockit) {
1025 _locked(init_locked(locked_accesses)),
1026 _may_check(locked_accesses),
1027 unsafe_iterator(
xct_t::_xlist) {
1034 if (locked_by_me()) {
1069 xct_t::state()
const {
1070 if (
nullptr == _core) {
1073 return _core->_state;
1079 class xct_auto_abort_t :
public smlevel_0 {
1081 xct_auto_abort_t() : _xct(new
xct_t()) {}
1083 ~xct_auto_abort_t() {
1084 switch (_xct->state()) {
1085 case smlevel_0::xct_ended:
1088 case smlevel_0::xct_active:
1089 case smlevel_0::xct_freeing_space:
1090 case smlevel_0::xct_committing:
1094 cerr <<
"unexpected xct state: " << _xct->state() << endl;
1101 W_DO(_xct->commit());
1106 W_DO(_xct->abort());
1117 return (x1.
tid() > x2.
tid());
1128 xct_t::set_last_lsn(
const lsn_t& l) {
1140 xct_t::set_first_lsn(
const lsn_t& l) {
1152 xct_t::set_undo_nxt(
const lsn_t& l) {
1217 return _error_on_start;
1235 DBGOUT3(<<
"!!!! no_lock_section_t() - lock has been disabled");
1240 DBGOUT3(<<
"!!!! no_lock_section_t() - set original lock mode to t_cc_none");
1249 DBGOUT3(<<
"!!!! ~no_lock_section_t() - restored original lock mode: " << org_cc);
const inquery_verify_context_t & inquery_verify_context() const
Definition: xct.h:619
Lock Manager API.See Orthogonal Key Value Locking and Light-weight Intent Lock.
Definition: lock.h:27
w_keystr_t next_high_key
Definition: xct.h:147
static std::atomic< tid_t > _nxt_tid
Definition: xct.h:479
PageID next_pid
Definition: xct.h:138
const int ELR_READONLY_WAIT_MAX_COUNT
Definition: xct.h:1259
Lock table implementation class.
Definition: lock_core.h:31
Storage Manager thread.
Definition: smthread.h:201
void set_piggy_backed_single_log_sys_xct(bool enabled)
Definition: xct.h:583
const w_rc_t RCOK
Definition: w_rc.h:239
#define W_IFDEBUG1(x)
Definition: w_base.h:95
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
#define ADD_LOG_COMMENT_SIG
Definition: xct.h:77
sm_stats_t * __stats
Definition: xct.h:486
Definition: sm_base.h:258
bool is_inquery_verify_keyorder() const
Definition: xct.h:607
no_lock_section_t()
Definition: xct.h:1232
#define W_LIST_ARG(class, member)
Macro used to name the member of the object that is the link.
Definition: w_list.h:463
const bool _locked
Definition: xct.h:1054
inquery_verify_context_t()
Definition: xct.h:127
A shadow transaction object for RAW-style lock manager.
Definition: lock_raw.h:469
#define RC(e)
Normal error-case return. Create a return code with the current file, line, and error code x...
Definition: w_rc.h:248
bool is_single_log_sys_xct() const
Definition: xct.h:591
bool _inquery_verify
Definition: xct.h:537
latch_t & latch()
Definition: xct.h:837
void never_mind()
Release transaction list mutex if this thread holds it.
Definition: xct.h:989
A transaction. Internal to the storage manager.This class may be used in a limited way for the handli...
Definition: xct.h:185
rc_t check_error_on_start() const
Definition: xct.h:1216
lsn_t _read_watermark
Definition: xct.h:733
w_keystr_t next_low_key
Definition: xct.h:144
Header file for lintel::Atomic class.
uint32_t StoreID
Definition: basics.h:47
uint32_t _ssx_chain_len
The count of consecutive SSXs conveyed by this transaction object.
Definition: xct.h:510
concurrency_t get_query_concurrency() const
Definition: xct.h:627
Key string class which can represent a few special values.
Definition: w_key.h:47
smlevel_0::concurrency_t org_cc
Definition: xct.h:1255
inquery_verify_context_t & inquery_verify_context()
Definition: xct.h:623
bool should_reserve_for_rollback(int t) const
Definition: xct.h:756
bool is_inquery_verify() const
Definition: xct.h:599
static const lsn_t null
Definition: lsn.h:371
const bool _may_check
Definition: xct.h:1056
static queue_based_lock_t _xlist_mutex
Definition: xct.h:484
Locking-related status of one transaction.
Definition: lock_x.h:127
xct_t * curr() const
Get transaction at cursor.
Definition: xct.h:999
elr_mode_t _elr_mode
Definition: xct.h:735
Used to automatically begin/commit/abort a system transaction.
Definition: xct.h:1204
w_list_i< xct_t, queue_based_lock_t > unsafe_iterator
Definition: xct.h:1058
#define DBGOUT3(a)
Definition: w_debug.h:212
int16_t next_level
Definition: xct.h:141
Represents a transactional log record.
Definition: logrec.h:143
lsn_t _anchor
Definition: xct.h:764
w_link_t * detach()
remove containing object from the list.
Definition: w_listm.cpp:49
const lsn_t & get_read_watermark() const
Definition: xct.h:803
bool rolling_back() const
Definition: xct.h:767
bool _piggy_backed_single_log_sys_xct
Definition: xct.h:522
void set_inquery_verify_space(bool enabled)
Definition: xct.h:611
void set_error_encountered()
Definition: xct.h:782
uint32_t get_xct_chain_len() const
Definition: xct.h:795
List maintained in descending order.
Definition: w_list.h:689
bool is_piggy_backed_single_log_sys_xct() const
Definition: xct.h:579
bool g_xct_does_ex_lock_for_select()
Definition: xct.h:1182
lsn_t _first_lsn
Definition: xct.h:718
~no_lock_section_t()
Definition: xct.h:1246
uint32_t PageID
Definition: basics.h:45
w_link_t _xlink
Definition: xct.h:472
elr_mode_t get_elr_mode() const
Definition: xct.h:813
void set_alloced()
Definition: xct.h:421
void set_loser_xct_in_undo()
Definition: xct.h:660
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
A short-term hold (exclusive or shared) on a page.
Definition: latch.h:159
void set_inquery_verify(bool enabled)
Definition: xct.h:595
Iterator for a list.
Definition: w_list.h:76
latch_t * latchp() const
Definition: xct.h:824
size_t _original_xct_depth
Definition: xct.h:1226
Handle class for pages that may be fixed (i.e., paged in by the main buffer manager, zero::buffer_pool::BufferPool)
Definition: fixable_page_h.h:26
bool is_loser_xct() const
Definition: xct.h:643
bool is_sys_xct() const
Definition: xct.h:587
bool locked_by_me() const
True if this thread holds the transaction list mutex.
Definition: xct.h:978
void set_query_concurrency(concurrency_t mode)
Definition: xct.h:631
bool get_query_exlock_for_select() const
Definition: xct.h:635
void update_read_watermark(const lsn_t &tag)
Definition: xct.h:807
uint32_t _xct_chain_len
Definition: xct.h:497
xct_i(bool locked_accesses)
Constructor.
Definition: xct.h:1024
uint32_t & ssx_chain_len()
Definition: xct.h:799
void set_elr_mode(elr_mode_t mode)
Definition: xct.h:817
lsn_t _undo_nxt
Definition: xct.h:722
elr_mode_t
Definition: xct.h:691
bool _rolling_back
Definition: xct.h:752
std::array< long, enum_to_base(sm_stat_id::stat_max)> sm_stats_t
Definition: smstats.h:205
static w_rc_t acquire_xlist_mutex()
Definition: xct.cpp:135
Return code for most functions and methods.
Definition: w_rc.h:87
lsn_t _last_lsn
Definition: xct.h:720
LIL private lock table to remember all locks in xct.
Definition: lock_lil.h:227
void set_query_exlock_for_select(bool mode)
Definition: xct.h:639
Iterator over transaction list.
Definition: xct.h:969
std::ostream & operator<<(std::ostream &os, const ConfigFile &cf)
Definition: confparser.cpp:83
static tid_t _oldest_tid
Definition: xct.h:481
An MCS queuing spinlock.
Definition: mcs_lock.h:61
bool is_inquery_verify_space() const
Definition: xct.h:615
void _check(bool b) const
Definition: xct.h:1042
Link structure for membership in any class to be put on a w_list*.
Definition: w_list.h:104
bool operator>(const cvec_t &v1, const cvec_t &v2)
Definition: vec_t.h:410
Represents a lock mode of one key entry in the OKVL lock manager.
Definition: w_okvl.h:95
#define W_COERCE(x)
Call a function or method x, fail catastrophically if error is returned.
Definition: w_rc.h:349
The means of identifying a desired or held lock.
Definition: lock_s.h:41
rc_t _error_on_start
Definition: xct.h:1224
static w_descend_list_t< xct_t, queue_based_lock_t, tid_t > _xlist
Definition: xct.h:474
xct_t * xct()
Definition: smthread.h:575
bool _inquery_verify_space
Definition: xct.h:543
loser_xct_state_t _loser_xct
Definition: xct.h:555
bool _single_log_sys_xct
Definition: xct.h:528
tid_t _tid
Definition: xct.h:491
bool g_xct_does_need_lock()
Definition: xct.h:1170
bool is_loser_xct_in_undo() const
Definition: xct.h:651
bool _inquery_verify_keyorder
Definition: xct.h:540
lintel::Atomic< int > _in_compensated_op
Definition: xct.h:762
static void assert_xlist_mutex_is_mine()
Definition: xct.cpp:111
~xct_i()
Desctructor. Calls never_mind() if necessary.
Definition: xct.h:1033
xct_t * next()
Advance cursor.
Definition: xct.h:1004
#define W_DO(x)
Call a method or function x. This macro is the normal idiom for calling a method or function...
Definition: w_rc.h:304
static constexpr int WAIT_SPECIFIED_BY_THREAD
Definition: timeout.h:29
static void assert_xlist_mutex_not_mine()
Definition: xct.cpp:103
tid_t tid() const
Definition: xct.h:790
const lsn_t & first_lsn() const
void set_inquery_verify_keyorder(bool enabled)
Definition: xct.h:603
uint64_t tid_t
Definition: tid_t.h:59
std::set< PageID > pids_inconsistent
Definition: xct.h:135
std::chrono::high_resolution_clock::time_point _begin_tstamp
Definition: xct.h:738
const lsn_t & last_lsn() const
static bool xlist_mutex_is_mine()
Definition: xct.cpp:94
bool _sys_xct
Definition: xct.h:525
const int ELR_READONLY_WAIT_USEC
Definition: xct.h:1261
w_list_base_t * member_of() const
Definition: w_list.h:197
inquery_verify_context_t _inquery_verify_context
Definition: xct.h:546
lockid_t * __saved_lockid_t
Definition: xct.h:487
bool error_encountered() const
Definition: xct.h:784
concurrency_t _query_concurrency
Definition: xct.h:513
int32_t pages_checked
Definition: xct.h:132
#define INC_TSTAT(x)
Increment per-thread statistic named x by y.
Definition: smthread.h:392
#define X_LOG_COMMENT_USE(x)
Definition: xct.h:79
concurrency_t
Lock granularities.
Definition: sm_base.h:256
bool _deferred_ssx
Definition: xct.h:534
#define W_FATAL(e)
Croak with the error code e.
Definition: w_rc.h:378
Definition: sm_base.h:261
latch_t _latch
Definition: xct.h:558
const lsn_t & undo_nxt() const
bool _query_exlock_for_select
Definition: xct.h:516
static void release_xlist_mutex()
Definition: xct.cpp:142