20 #include <glog/logging.h>
76 return pimpl_->
begin_xct(context, isolation_level);
85 LOG(INFO) <<
"Initializing XctManager..";
105 LOG(INFO) <<
"Uninitializing XctManager..";
136 LOG(INFO) <<
"epoch_chime_thread started.";
143 LOG(INFO) <<
"epoch_chime_thread now starts processing. interval_microsec=" << interval_microsec;
156 VLOG(1) <<
"epoch_chime_thread. wokeup with " << (signaled ?
"signal" :
"timeout");
183 LOG(INFO) <<
"epoch_chime_thread ended.";
190 VLOG(1) <<
"XctManager waiting until all worker threads exit grace_epoch:" << grace_epoch;
197 for (uint16_t node = 0; node < nodes; ++node) {
204 const uint32_t kSpins = 1 << 12;
208 if (!min_epoch.
is_valid() || min_epoch > grace_epoch) {
214 VLOG(0) <<
"Interesting, node-" << node <<
" has some thread that is still running "
215 <<
"epoch-" << grace_epoch <<
". we have to wait before advancing epoch. min_epoch="
217 }
else if (spins >= kSpins) {
218 if (spins == kSpins) {
219 LOG(INFO) <<
"node-" << node <<
" has some thread that is running "
220 <<
"epoch-" << grace_epoch <<
" for long time. we are still waiting before advancing"
221 <<
" epoch. min_epoch=" << min_epoch;
223 std::this_thread::sleep_for(std::chrono::milliseconds(10));
229 VLOG(1) <<
"grace_epoch-" << grace_epoch <<
" guaranteed. took " << watch.
elapsed_ns() <<
"ns";
231 LOG(INFO) <<
"Very interesting, grace_epoch-" << grace_epoch <<
" took "
232 << watch.
elapsed_ms() <<
"ms to be guaranteed. Most likely there was a long-running xct";
245 if (already_requested >= request) {
258 LOG(INFO) <<
"Requesting to immediately advance epoch. request=" << request <<
"...";
279 if (wait_microseconds < 0) {
315 DVLOG(1) << *context <<
" Began new transaction."
317 current_xct.
activate(isolation_level);
335 LOG(INFO) << *context <<
" realized that new transactions are not accepted now."
336 <<
" waits until it is allowed to start a new transaction";
339 std::this_thread::sleep_for(std::chrono::milliseconds(20));
362 DVLOG(1) << *context <<
" Aborting because of contention";
372 DVLOG(1) << *context <<
" Committing read_only";
375 *commit_epoch =
Epoch();
385 DVLOG(1) << *context <<
" Committing read-write";
401 DVLOG(1) << *context <<
" Acquired read-write commit epoch " << *commit_epoch;
409 for (uint32_t i = 0; i < write_set_size; ++i) {
410 ASSERT_ND(write_set[i].owner_id_address_->is_keylocked());
411 ASSERT_ND(!write_set[i].owner_id_address_->needs_track_moved());
413 ASSERT_ND(write_set[i].payload_address_);
443 DLOG(INFO) <<
"Failed to track moved record even with write set";
487 for (uint32_t i = 0; i < write_set_size; ++i) {
503 for (uint32_t i = 1; i < write_set_size; ++i) {
504 ASSERT_ND(write_set[i - 1].ordinal_ != write_set[i].ordinal_);
505 if (write_set[i].owner_lock_id_ == write_set[i - 1].owner_lock_id_) {
506 ASSERT_ND(write_set[i - 1].ordinal_ < write_set[i].ordinal_);
508 ASSERT_ND(write_set[i - 1].owner_lock_id_ < write_set[i].owner_lock_id_);
518 uint32_t moved_count = 0;
519 for (uint32_t i = 0; i < write_set_size; ++i) {
522 if (
UNLIKELY(rec->needs_track_moved())) {
524 DLOG(INFO) <<
"Failed to track moved record?? this must be very rare";
531 DVLOG(1) <<
"Tracked " << moved_count <<
" moved records in precommit_xct_lock.";
532 if (moved_count > 100U) {
533 LOG(INFO) <<
"Tracked " << moved_count <<
" moved records in precommit_xct_lock."
534 <<
" That's a lot. maybe this is a batch-loading transaction?";
544 const bool force_canonical
546 DVLOG(1) << *context <<
" #write_sets=" << write_set_size <<
", addr=" << write_set;
550 for (uint32_t i = 0; i < write_set_size; ++i) {
590 DVLOG(2) <<
"Yay, already taken. Probably Thanks to RLL?";
596 if (force_canonical &&
599 DVLOG(0) <<
"Aggressively releasing locks to restore canonical mode in precommit";
613 DLOG(INFO) <<
"Someone has split the page and moved our record after we check. Retry..";
625 for (uint32_t rec = it.write_cur_pos_; rec < it.write_next_pos_; ++rec) {
637 DVLOG(1) << *context <<
" locked write set";
639 for (uint32_t i = 0; i < write_set_size; ++i) {
640 ASSERT_ND(write_set[i].owner_id_address_->is_keylocked());
653 for (uint32_t i = 0; i < read_set_size; ++i) {
654 ASSERT_ND(read_set[i].related_write_ ==
nullptr);
656 if (i % kReadsetPrefetchBatch == 0) {
657 for (uint32_t j = i; j < i + kReadsetPrefetchBatch && j < read_set_size; ++j) {
671 DLOG(WARNING) << *context <<
"?? this should have been checked. being_written! will abort";
689 DLOG(WARNING) << *context <<
" read set changed by other transaction. will abort";
701 for (uint32_t i = 0; i < lock_free_read_set_size; ++i) {
705 DLOG(WARNING) << *context <<
" lock free read set changed by other transaction. will abort";
712 DVLOG(1) << *context <<
"Read-only higest epoch observed: " << *commit_epoch;
713 if (!commit_epoch->is_valid()) {
715 <<
" Read-only higest epoch was empty. The transaction has no read set??";
735 for (uint32_t i = 0; i < read_set_size; ++i) {
737 if (i % kReadsetPrefetchBatch == 0) {
738 for (uint32_t j = i; j < i + kReadsetPrefetchBatch && j < read_set_size; ++j) {
739 if (read_set[j].related_write_ ==
nullptr) {
749 DLOG(WARNING) << *context <<
"?? this should have been checked. being_written! will abort";
755 DVLOG(3) << *context <<
" skipped read-sets that are already checked";
774 DVLOG(1) << *context <<
" read set changed by other transaction. will abort";
810 for (uint32_t i = 0; i < lock_free_read_set_size; ++i) {
814 DLOG(WARNING) << *context <<
" lock free read set changed by other transaction. will abort";
832 for (uint32_t i = 0; i < pointer_set_size; ++i) {
834 if (i % kReadsetPrefetchBatch == 0) {
835 for (uint32_t j = i; j < i + kReadsetPrefetchBatch && j < pointer_set_size; ++j) {
841 DLOG(WARNING) << *context <<
" volatile ptr is changed by other transaction. will abort";
851 for (uint32_t i = 0; i < page_version_set_size; ++i) {
853 if (i % kReadsetPrefetchBatch == 0) {
854 for (uint32_t j = i; j < i + kReadsetPrefetchBatch && j < page_version_set_size; ++j) {
860 DLOG(WARNING) << *context <<
" page version is changed by other transaction. will abort"
871 Epoch *commit_epoch) {
877 DVLOG(1) << *context <<
" applying.. write_set_size=" << write_set_size
878 <<
", lock_free_write_set_size=" << lock_free_write_set_size;
885 XctId new_deleted_xct_id = new_xct_id;
888 DVLOG(1) << *context <<
" generated new xct id=" << new_xct_id;
889 for (uint32_t i = 0; i < write_set_size; ++i) {
891 DVLOG(2) << *context <<
" Applying "
901 ASSERT_ND(new_xct_id.get_epoch().is_valid());
918 if (i < write_set_size - 1 &&
920 DVLOG(0) << *context <<
" Multiple write sets on record "
922 <<
":" << write_set[i].
owner_id_address_ <<
". Unlock at the last one of the write sets";
944 for (uint32_t i = 0; i < lock_free_write_set_size; ++i) {
946 DVLOG(2) << *context <<
" Applying Lock-Free write "
951 DVLOG(1) << *context <<
" applied and unlocked write set";
959 DVLOG(1) << *context <<
" Aborted transaction in thread-" << context->
get_thread_id();
972 for (uint32_t i = 0; i < read_set_size; ++i) {
ReadXctAccess * related_read_
void issue_next_id(XctId max_xct_id, Epoch *epoch)
Called while a successful commit of xct to issue a new xct id.
void resume_accepting_xct()
Make sure you call this after pause_accepting_xct().
uint32_t get_mcs_block_current() const
log::RecordLogType * log_entry_
Pointer to the log entry in private log buffer for this write opereation.
const memory::GlobalVolatilePageResolver & get_global_volatile_page_resolver() const
Returns the page resolver to convert page ID to page pointer.
RwLockableXctId * owner_id_address_
Pointer to the TID we protect against.
xct::Xct & get_current_xct()
Returns the transaction that is currently running on this thread.
ErrorStack uninitialize_once() override
cache::CacheManager * get_cache_manager() const
See Snapshot Cache Manager.
UniversalLockId universal_lock_id_
Used to order locks in canonical order.
ErrorStack initialize_once() override
void publish_committed_log(Epoch commit_epoch) __attribute__((always_inline))
Called when the current transaction is successfully committed.
Represents a record of special read-access during a transaction without any need for locking...
void release_and_clear_all_current_locks(thread::Thread *context)
unlocking all acquired locks, used when commit/abort.
void wakeup_loggers()
Wake up loggers if they are sleeping.
const storage::PageVersion * address_
Address to the page version.
Epoch get_current_global_epoch_weak() const
xct::CurrentLockList * get_current_lock_list()
Epoch get_current_global_epoch_weak() const
void emprace_back(ErrorStack &&error_stack)
If the given ErrorStack is an error, this method adds it to the end of this batch.
storage::StorageManager * get_storage_manager() const
See Storage Manager.
A view of Thread group object for other SOCs and master engine.
void set_deleted() __attribute__((always_inline))
void precommit_xct_apply(thread::Thread *context, XctId max_xct_id, Epoch *commit_epoch)
Phase 3 of precommit_xct()
Epoch get_durable_global_epoch_weak() const
Non-atomic version of the method.
RwLockableXctId * new_owner_address_
#define ERROR_STACK(e)
Instantiates ErrorStack with the given foedus::error_code, creating an error stack with the current f...
bool assert_related_read_write() const __attribute__((always_inline))
This debug method checks whether the related_read_ and related_write_ fileds in read/write sets are c...
const PointerAccess * get_pointer_set() const
ErrorCode precommit_xct_readwrite(thread::Thread *context, Epoch *commit_epoch)
precommit_xct() if the transaction is read-write
0x0A03 : "XCTION : This thread is already running a transaction. Commit or abort it first...
ErrorCode cll_try_or_acquire_single_lock(xct::LockListPosition pos)
Methods related to Current Lock List (CLL) These are the only interface in Thread to lock records...
Epoch get_current_global_epoch() const
Returns the current global epoch, the epoch a newly started transaction will be in.
uint32_t get_write_set_size() const
uint32_t ordinal_
Indicates the ordinal among ReadXctAccess/WriteXctAccess of this transaction.
XctId observed_owner_id_
Transaction ID of the record observed as of the access.
void construct(thread::Thread *context, uint32_t read_lock_threshold)
Fill out this retrospetive lock list for the next run of the given transaction.
Root package of FOEDUS (Fast Optimistic Engine for Data Unification Services).
bool precommit_xct_verify_readwrite(thread::Thread *context, XctId *max_xct_id)
Phase 2 of precommit_xct() for read-write case.
Represents a record of write-access during a transaction.
Epoch get_initial_current_epoch() const
const storage::VolatilePagePointer * address_
Address of the volatile pointer.
void hotter(thread::Thread *context) const
std::atomic< Epoch::EpochInteger > requested_global_epoch_
If some thread requested to immediately advance epoch, the requested epoch.
void wakeup_epoch_chime_thread()
GlobalMemoryAnchors * get_global_memory_anchors()
Represents one thread running on one NUMA core.
Epoch get_current_grace_epoch() const
Returns the current grace-period epoch (global epoch - 1), the epoch some transaction might be still ...
void deactivate()
Closes the transaction.
void wait_until_resume_accepting_xct(thread::Thread *context)
storage::VolatilePagePointer observed_
Value of the volatile pointer as of the access.
Epoch get_current_grace_epoch_weak() const
void wait(uint64_t demanded_ticket, uint64_t polling_spins=kDefaultPollingSpins, uint64_t max_interval_us=kDefaultPollingMaxIntervalUs) const
Unconditionally wait for signal.
uint32_t EpochInteger
Unsigned integer representation of epoch.
double elapsed_ms() const
const XctId & get_id() const
Returns the ID of this transaction, but note that it is not issued until commit time! ...
ErrorCode begin_xct(thread::Thread *context, IsolationLevel isolation_level)
Begins a new transaction on the thread.
Result of track_moved_record().
ThreadId get_thread_id() const
void prefetch_cacheline(const void *address)
Prefetch one cacheline to L1 cache.
bool precommit_xct_verify_readonly(thread::Thread *context, Epoch *commit_epoch)
Phase 2 of precommit_xct() for read-only case.
0x0005 : "GENERAL: A dependent module is not initialized yet. This implies a wrong initialization ord...
soc::SharedPolling epoch_chime_wakeup_
Fired to wakeup epoch_chime_thread_.
Epoch get_current_global_epoch() const
bool before(const XctId &other) const __attribute__((always_inline))
Returns if this XctId is before other in serialization order, meaning this is either an invalid (unus...
Represents a user transaction.
LockListPosition get_last_active_entry() const
storage::PageVersionStatus observed_
Value of the page version as of the access.
Persistent status part of Transaction ID.
ErrorCode precommit_xct_lock_batch_track_moved(thread::Thread *context)
Subroutine of precommit_xct_lock to track most of moved records in write-set.
Brings error stacktrace information as return value of functions.
ErrorCode precommit_xct_lock(thread::Thread *context, XctId *max_xct_id)
Phase 1 of precommit_xct()
const LockListPosition kLockListPositionInvalid
Represents a record of read-access during a transaction.
bool is_active() const
Returns whether the object is an active transaction.
XctId xct_id_
the second 64bit: Persistent status part of TID.
ErrorStack stop_cleaner()
Stops internal eviction thread even before uninitialize() of this object is called.
An entry in CLL and RLL, representing a lock that is taken or will be taken.
uint32_t get_ordinal() const __attribute__((always_inline))
0x002A : foedus::storage::hash::HashDeleteLogType .
bool is_stop_requested() const
ErrorCode abort_xct(thread::Thread *context)
An iterator over CurrentLockList to find entries along with sorted write-set.
bool needs_track_moved() const __attribute__((always_inline))
ReadXctAccess * get_read_set()
void handle_epoch_chime()
Main routine for epoch_chime_thread_.
Engine * get_engine() const
Represents a record of special write-access during a transaction without any need for locking...
Epoch * get_in_commit_epoch_address()
Currently we don't have sysxct_release_locks() etc.
void advance_current_global_epoch()
XctId observed_owner_id_
XID value we observed.
const EngineOptions & get_options() const
bool is_master() const
Returns if this engine object is a master instance.
savepoint::SavepointManager * get_savepoint_manager() const
See Savepoint Manager.
Automatically sets in-commit-epoch with appropriate fence during pre-commit protocol.
void set(Epoch::EpochInteger epoch_int, uint32_t ordinal)
ErrorCode precommit_xct(thread::Thread *context, Epoch *commit_epoch)
Prepares the currently running transaction on the thread for commit.
soc::SocId get_soc_count() const
Shorthand for get_options().thread_.group_count_.
uint64_t acquire_ticket() const
Gives the ticket to.
log::ThreadLogBuffer & get_thread_log_buffer()
Returns the private log buffer for this thread.
uint32_t epoch_advance_interval_ms_
Intervals in milliseconds between epoch advancements.
Batches zero or more ErrorStack objects to represent in one ErrorStack.
void wait_for_current_global_epoch(Epoch target_epoch, int64_t wait_microseconds)
ErrorCode begin_xct(thread::Thread *context, IsolationLevel isolation_level)
User transactions related methods.
ThreadGroupRef * get_group_ref(ThreadGroupId numa_node)
bool is_moved() const __attribute__((always_inline))
void store_max(const XctId &other) __attribute__((always_inline))
Kind of std::max(this, other).
static bool compare(const WriteXctAccess &left, const WriteXctAccess &right) __attribute__((always_inline))
Definitions of IDs in this package and a few related constant values.
log::LogManager * get_log_manager() const
See Log Manager.
void set_owner_id_resolve_lock_id(const memory::GlobalVolatilePageResolver &resolver, RwLockableXctId *owner_id_address)
Calculate owner_lock_id using the resolver.
uint32_t get_read_set_size() const
Epoch get_requested_global_epoch() const
RwLockableXctId * owner_id_address_
Pointer to the accessed record.
ErrorCode wait_for_commit(Epoch commit_epoch, int64_t wait_microseconds)
uint32_t LockListPosition
Index in a lock-list, either RLL or CLL.
void cll_release_all_locks()
void precommit_xct_sort_access(thread::Thread *context)
Constants and methods related to CPU cacheline and its prefetching.
bool is_read_only() const
Returns if this transaction makes no writes.
bool precommit_xct_verify_pointer_set(thread::Thread *context)
Returns false if there is any pointer set conflict.
#define SPINLOCK_WHILE(x)
A macro to busy-wait (spinlock) with occasional pause.
bool is_initialized() const override
Returns whether the object has been already initialized or not.
char * payload_address_
Pointer to the payload of the record.
LockMode preferred_mode_
Whick lock mode we should take according to RLL.
uint64_t stop()
Take another current time tick.
taken_mode_: we took a write-lock.
uint32_t get_page_version_set_size() const
Epoch get_epoch() const __attribute__((always_inline))
ErrorCode abort_xct(thread::Thread *context)
Aborts the currently running transaction on the thread.
LockMode taken_mode_
Whick lock mode we have taken during the current run (of course initially kNoLock) ...
void cll_release_all_locks_after(xct::UniversalLockId address)
Release all locks in CLL of this thread whose addresses are canonically ordered before the parameter...
bool is_deleted() const __attribute__((always_inline))
storage::StorageId storage_id_
The storage we accessed.
const uint16_t kReadsetPrefetchBatch
std::atomic< bool > new_transaction_paused_
If true, all new requests to begin_xct() will be paused until this becomes false. ...
WriteXctAccess * related_write_
An optional member that points to a write access related to this read.
ErrorCode precommit_xct(thread::Thread *context, Epoch *commit_epoch)
This is the gut of commit protocol.
xct::RetrospectiveLockList * get_retrospective_lock_list()
void discard_current_xct_log()
Called when the current transaction aborts.
XctManagerControlBlock * control_block_
xct::XctManagerControlBlock * xct_manager_memory_
Tiny memory for xct manager.
Repository of all shared memory in one FOEDUS instance.
std::thread epoch_chime_thread_
This thread keeps advancing the current_global_epoch_.
RwLockableXctId * lock_
Virtual address of the lock.
uint32_t get_pointer_set_size() const
bool precommit_xct_lock_track_write(thread::Thread *context, WriteXctAccess *entry)
used from precommit_xct_lock() to track moved record
#define SUMMARIZE_ERROR_BATCH(x)
This macro calls ErrorStackBatch::summarize() with automatically provided parameters.
bool force_canonical_xlocks_in_precommit_
Whether precommit always releases all locks that violate canonical mode before taking X-locks...
ErrorCode wait_until_durable(Epoch commit_epoch, int64_t wait_microseconds=-1)
Synchronously blocks until the durable global epoch reaches the given commit epoch or the given durat...
void store_max(const Epoch &other)
Kind of std::max(this, other).
WriteXctAccess * get_write_set()
IsolationLevel
Specifies the level of isolation during transaction processing.
bool precommit_xct_verify_page_version_set(thread::Thread *context)
Returns false if there is any page version conflict.
uint32_t get_lock_free_read_set_size() const
#define CHECK_ERROR_CODE(x)
This macro calls x and checks its returned error code.
0x0034 : foedus::storage::masstree::MasstreeDeleteLogType .
#define CHECK_ERROR(x)
This macro calls x and checks its returned value.
void activate(IsolationLevel isolation_level)
Begins the transaction.
void handle_epoch_chime_wait_grace_period(Epoch grace_epoch)
Makes sure all worker threads will commit with an epoch larger than grace_epoch.
PageVersionStatus status_
foedus::fs::DeviceEmulationOptions emulation_
Settings to emulate slower logging device.
const ErrorStack kRetOk
Normal return value for no-error case.
void advance_current_global_epoch()
Requests to advance the current global epoch as soon as possible and blocks until it actually does...
void batch_insert_write_placeholders(const WriteXctAccess *write_set, uint32_t write_set_size)
Create entries for all write-sets in one-shot.
Storage Manager class that provides API to create/open/close/drop key-value stores.
uint64_t get_offset_committed() const
This marks the position upto which transaction logs are committed by the thread.
soc::SocManager * get_soc_manager() const
See SOC and IPC.
uint16_t get_rll_threshold_for_this_xct() const
xct::TrackMovedRecordResult track_moved_record(StorageId storage_id, xct::RwLockableXctId *old_address, xct::WriteXctAccess *write_set)
Resolves a "moved" record.
Atomic fence methods and load/store with fences that work for both C++11/non-C++11 code...
bool is_being_written() const __attribute__((always_inline))
const StorageName & get_name(StorageId id)
Returns the name of the given storage ID.
Epoch get_min_in_commit_epoch() const
Returns the oldest in-commit epoch of the threads in this group.
void set_being_written() __attribute__((always_inline))
const LockEntry * get_array() const
void memory_fence_acquire()
Equivalent to std::atomic_thread_fence(std::memory_order_acquire).
void set_requested_global_epoch(Epoch request)
As there is no transaction in ep-1, initial durable_epoch is 1.
std::atomic< Epoch::EpochInteger > current_global_epoch_
The current epoch of the entire engine.
Sorted list of all locks, either read-lock or write-lock, taken in the current run.
bool null_device_
[Experiments] as if we write out to /dev/null.
log::RecordLogType * log_entry_
Pointer to the log entry in private log buffer for this write opereation.
uint64_t get_offset_tail() const
The current cursor to which next log will be written.
bool is_enable_rll_for_this_xct() const
void invoke_apply_record(void *log_buffer, thread::Thread *context, storage::StorageId storage_id, xct::RwLockableXctId *owner_id_address, char *payload_address)
Invokes the apply logic for a record-wise log type.
0x0006 : "GENERAL: A dependent module is already uninitialized. This implies a wrong uninitialization...
0x0A04 : "XCTION : This thread is not running any transaction." .
#define UNLIKELY(x)
Hints that x is highly likely false.
0x0A05 : "XCTION : Aborted a transaction because of a race condition. This is an expected error in hi...
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Represents a record of following a page pointer during a transaction.
ErrorCode precommit_xct_readonly(thread::Thread *context, Epoch *commit_epoch)
precommit_xct() if the transaction is read-only
std::atomic< bool > epoch_chime_terminate_requested_
Protected by the mutex in epoch_chime_wakeup_.
A high-resolution stop watch.
ErrorCode wait_for_commit(Epoch commit_epoch, int64_t wait_microseconds=-1)
Synchronously blocks until the durable global epoch reaches the given commit epoch or the given durat...
const PageVersionAccess * get_page_version_set() const
LockFreeWriteXctAccess * get_lock_free_write_set()
uint32_t get_lock_free_write_set_size() const
void pause_accepting_xct()
Pause all begin_xct until you call resume_accepting_xct()
void memory_fence_release()
Equivalent to std::atomic_thread_fence(std::memory_order_release).
bool is_next_layer() const __attribute__((always_inline))
char * new_payload_address_
Represents a record of reading a page during a transaction.
ErrorCode
Enum of error codes defined in error_code.xmacro.
bool timedwait(uint64_t demanded_ticket, uint64_t timeout_microsec, uint64_t polling_spins=kDefaultPollingSpins, uint64_t max_interval_us=kDefaultPollingMaxIntervalUs) const
Wait for signal up to the given timeout.
thread::ThreadPool * get_thread_pool() const
See Thread and Thread-Group.
soc::SharedPolling current_global_epoch_advanced_
Fired (broadcast) whenever current_global_epoch_ is advanced.
bool is_initialized() const override final
Returns whether the object has been already initialized or not.
bool is_keylocked() const __attribute__((always_inline))
The pool of pre-allocated threads in the engine to execute transactions.
uint64_t elapsed_ns() const
LockListPosition get_last_locked_entry() const
void signal()
Signal it to let waiters exit.
EpochInteger value() const
Returns the raw integer representation.
bool precommit_xct_verify_track_read(thread::Thread *context, ReadXctAccess *entry)
used from verification methods to track moved record
SharedMemoryRepo * get_shared_memory_repo()
Returns the shared memories maintained across SOCs.
void memory_fence_acq_rel()
Equivalent to std::atomic_thread_fence(std::memory_order_acq_rel).
storage::StorageId storage_id_
The storage we accessed.
const uint64_t kDefaultPollingSpins
Default value of polling_spins.
LockFreeReadXctAccess * get_lock_free_read_set()