101#include "utils/fmgroids.h"
102#include "utils/fmgrprotos.h"
139#define MIN_AUTOVAC_SLEEPTIME 100.0
140#define MAX_AUTOVAC_SLEEPTIME 300
255#define AutoVacNumSignals (AutoVacRebalance + 1)
273#define NUM_WORKITEMS 256
323 struct timeval *nap);
335 int effective_multixact_freeze_max_age);
338 int effective_multixact_freeze_max_age,
339 bool *dovacuum,
bool *doanalyze,
bool *wraparound);
343 int effective_multixact_freeze_max_age,
344 bool *dovacuum,
bool *doanalyze,
bool *wraparound);
353 const char *nspname,
const char *
relname);
370 sigjmp_buf local_sigjmp_buf;
372 Assert(startup_data_len == 0);
429 "Autovacuum Launcher",
445 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
594 (nap.tv_sec * 1000L) + (nap.tv_usec / 1000L),
595 WAIT_EVENT_AUTOVACUUM_MAIN);
693 errmsg(
"autovacuum worker took too long to start; canceled"));
836 nap->tv_usec = usecs;
855 if (nap->tv_sec == 0 && nap->tv_usec == 0 && !recursing)
907 "Autovacuum database list",
910 "Autovacuum database list (tmp)",
933 dbhash =
hash_create(
"autovacuum db hash", 20, &hctl,
1015 int millis_increment;
1027 memcpy(&(dbary[
i++]), db,
sizeof(
avl_dbase));
1049 for (
i = 0;
i < nelems;
i++)
1097 bool for_multi_wrap;
1100 bool skipit =
false;
1119 "Autovacuum start worker (tmp)",
1166 for_xid_wrap =
false;
1167 for_multi_wrap =
false;
1181 for_xid_wrap =
true;
1184 else if (for_xid_wrap)
1191 for_multi_wrap =
true;
1194 else if (for_multi_wrap)
1378 sigjmp_buf local_sigjmp_buf;
1381 Assert(startup_data_len == 0);
1440 if (sigsetjmp(local_sigjmp_buf, 1) != 0)
1549 elog(
WARNING,
"autovacuum worker started without a worker entry");
1706 "Autovacuum VacuumUpdateCosts(db=%u, rel=%u, dobalance=%s, cost_limit=%d, cost_delay=%g active=%s failsafe=%s)",
1737 int nworkers_for_balance;
1753 if (nworkers_for_balance <= 0)
1754 elog(
ERROR,
"nworkers_for_balance must be > 0");
1772 int orig_nworkers_for_balance;
1773 int nworkers_for_balance = 0;
1777 orig_nworkers_for_balance =
1784 if (worker->
wi_proc == NULL ||
1788 nworkers_for_balance++;
1791 if (nworkers_for_balance != orig_nworkers_for_balance)
1793 nworkers_for_balance);
1841 "autovacuum: skipping invalid database \"%s\"",
1842 NameStr(pgdatabase->datname));
1894 HTAB *table_toast_map;
1899 int effective_multixact_freeze_max_age;
1900 bool did_vacuum =
false;
1901 bool found_concurrent_worker =
false;
1910 "Autovacuum worker",
1940 if (dbForm->datistemplate || !dbForm->datallowconn)
1966 ctl.keysize =
sizeof(
Oid);
1969 table_toast_map =
hash_create(
"TOAST to main relid map",
2004 if (classForm->relkind != RELKIND_RELATION &&
2005 classForm->relkind != RELKIND_MATVIEW)
2008 relid = classForm->oid;
2014 if (classForm->relpersistence == RELPERSISTENCE_TEMP)
2042 effective_multixact_freeze_max_age,
2043 &dovacuum, &doanalyze, &wraparound);
2046 if (dovacuum || doanalyze)
2060 &classForm->reltoastrelid,
2068 if (relopts != NULL)
2088 Anum_pg_class_relkind,
2099 bool free_relopts =
false;
2107 if (classForm->relpersistence == RELPERSISTENCE_TEMP)
2110 relid = classForm->oid;
2118 free_relopts =
true;
2134 effective_multixact_freeze_max_age,
2135 &dovacuum, &doanalyze, &wraparound);
2160 foreach(cell, orphan_oids)
2198 if (!((classForm->relkind == RELKIND_RELATION ||
2199 classForm->relkind == RELKIND_MATVIEW) &&
2200 classForm->relpersistence == RELPERSISTENCE_TEMP))
2223 classForm->relnamespace, 0,
2232 (
errmsg(
"autovacuum: dropping orphan temp table \"%s.%s.%s\"",
2235 NameStr(classForm->relname))));
2237 object.classId = RelationRelationId;
2238 object.objectId = relid;
2239 object.objectSubId = 0;
2278 "Autovacuum Portal",
2284 foreach(cell, table_oids)
2353 found_concurrent_worker =
true;
2382 effective_multixact_freeze_max_age);
2468 errcontext(
"automatic vacuum of table \"%s.%s.%s\"",
2471 errcontext(
"automatic analyze of table \"%s.%s.%s\"",
2584 if (did_vacuum || !found_concurrent_worker)
2597 char *cur_datname = NULL;
2598 char *cur_nspname = NULL;
2599 char *cur_relname = NULL;
2616 if (!cur_relname || !cur_nspname || !cur_datname)
2647 elog(
WARNING,
"unrecognized work item found: type %d",
2667 errcontext(
"processing work entry for relation \"%s.%s.%s\"",
2668 cur_datname, cur_nspname, cur_relname);
2719 if (relopts == NULL)
2741 int effective_multixact_freeze_max_age)
2750 bool free_avopts =
false;
2765 else if (classForm->relkind == RELKIND_TOASTVALUE &&
2766 table_toast_map != NULL)
2777 effective_multixact_freeze_max_age,
2778 &dovacuum, &doanalyze, &wraparound);
2781 if (doanalyze || dovacuum)
2784 int freeze_table_age;
2785 int multixact_freeze_min_age;
2786 int multixact_freeze_table_age;
2787 int log_min_duration;
2810 multixact_freeze_min_age = (avopts &&
2815 multixact_freeze_table_age = (avopts &&
2893 int effective_multixact_freeze_max_age,
2905 effective_multixact_freeze_max_age,
2906 dovacuum, doanalyze, wraparound);
2913 if (classForm->relkind == RELKIND_TOASTVALUE)
2961 int effective_multixact_freeze_max_age,
2971 int vac_base_thresh,
2973 vac_ins_base_thresh,
2976 vac_ins_scale_factor,
2991 int multixact_freeze_max_age;
2996 Assert(classForm != NULL);
3042 : effective_multixact_freeze_max_age;
3044 av_enabled = (relopts ? relopts->
enabled :
true);
3047 xidForceLimit =
recentXid - freeze_max_age;
3050 relfrozenxid = classForm->relfrozenxid;
3057 multiForceLimit =
recentMulti - multixact_freeze_max_age;
3063 *wraparound = force_vacuum;
3066 if (!av_enabled && !force_vacuum)
3082 float4 pcnt_unfrozen = 1;
3083 float4 reltuples = classForm->reltuples;
3084 int32 relpages = classForm->relpages;
3085 int32 relallfrozen = classForm->relallfrozen;
3101 if (relpages > 0 && relallfrozen > 0)
3108 relallfrozen =
Min(relallfrozen, relpages);
3109 pcnt_unfrozen = 1 - ((
float4) relallfrozen / relpages);
3112 vacthresh = (
float4) vac_base_thresh + vac_scale_factor * reltuples;
3113 if (vac_max_thresh >= 0 && vacthresh > (
float4) vac_max_thresh)
3114 vacthresh = (
float4) vac_max_thresh;
3116 vacinsthresh = (
float4) vac_ins_base_thresh +
3117 vac_ins_scale_factor * reltuples * pcnt_unfrozen;
3118 anlthresh = (
float4) anl_base_thresh + anl_scale_factor * reltuples;
3125 if (vac_ins_base_thresh >= 0)
3126 elog(
DEBUG3,
"%s: vac: %.0f (threshold %.0f), ins: %.0f (threshold %.0f), anl: %.0f (threshold %.0f)",
3128 vactuples, vacthresh, instuples, vacinsthresh, anltuples, anlthresh);
3130 elog(
DEBUG3,
"%s: vac: %.0f (threshold %.0f), ins: (disabled), anl: %.0f (threshold %.0f)",
3132 vactuples, vacthresh, anltuples, anlthresh);
3135 *dovacuum = force_vacuum || (vactuples > vacthresh) ||
3136 (vac_ins_base_thresh >= 0 && instuples > vacinsthresh);
3137 *doanalyze = (anltuples > anlthresh);
3146 *dovacuum = force_vacuum;
3151 if (relid == StatisticRelationId)
3205#define MAX_AUTOVAC_ACTIV_LEN (NAMEDATALEN * 2 + 56)
3212 "autovacuum: VACUUM%s",
3216 "autovacuum: ANALYZE");
3221 len = strlen(activity);
3239 const char *nspname,
const char *
relname)
3249 "autovacuum: BRIN summarize");
3256 len = strlen(activity);
3264 " %s.%s%s", nspname,
relname, blk);
3294 bool result =
false;
3338 (
errmsg(
"autovacuum not started because of misconfiguration"),
3339 errhint(
"Enable the \"track_counts\" option.")));
3447 reserved_slots =
Max(0, reserved_slots);
3449 return free_slots > reserved_slots;
3460 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3461 errmsg(
"\"autovacuum_max_workers\" (%d) should be less than or equal to \"autovacuum_worker_slots\" (%d)",
3463 errdetail(
"The server will only start up to \"autovacuum_worker_slots\" (%d) autovacuum workers at a given time.",
void pgaio_error_cleanup(void)
static void pg_atomic_clear_flag(volatile pg_atomic_flag *ptr)
static void pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
static bool pg_atomic_test_set_flag(volatile pg_atomic_flag *ptr)
static bool pg_atomic_unlocked_test_flag(volatile pg_atomic_flag *ptr)
static void pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
static uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
static void pg_atomic_init_flag(volatile pg_atomic_flag *ptr)
static void relation_needs_vacanalyze(Oid relid, AutoVacOpts *relopts, Form_pg_class classForm, PgStat_StatTabEntry *tabentry, int effective_multixact_freeze_max_age, bool *dovacuum, bool *doanalyze, bool *wraparound)
static Oid do_start_worker(void)
static void launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval *nap)
int autovacuum_worker_slots
void VacuumUpdateCosts(void)
void AutoVacLauncherMain(const void *startup_data, size_t startup_data_len)
static volatile sig_atomic_t got_SIGUSR2
static void avl_sigusr2_handler(SIGNAL_ARGS)
int autovacuum_multixact_freeze_max_age
static bool av_worker_available(void)
static int default_multixact_freeze_table_age
double autovacuum_vac_scale
void AutoVacWorkerMain(const void *startup_data, size_t startup_data_len)
static void FreeWorkerInfo(int code, Datum arg)
int AutovacuumLauncherPid
int Log_autovacuum_min_duration
int autovacuum_anl_thresh
struct av_relation av_relation
static TransactionId recentXid
struct AutoVacuumWorkItem AutoVacuumWorkItem
Size AutoVacuumShmemSize(void)
struct autovac_table autovac_table
static List * get_database_list(void)
void AutoVacuumShmemInit(void)
bool check_autovacuum_work_mem(int *newval, void **extra, GucSource source)
static void autovac_report_activity(autovac_table *tab)
static int default_multixact_freeze_min_age
static void do_autovacuum(void)
int autovacuum_vac_cost_limit
static double av_storage_param_cost_delay
bool AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, BlockNumber blkno)
bool AutoVacuumingActive(void)
int autovacuum_max_workers
int autovacuum_freeze_max_age
static int db_comparator(const void *a, const void *b)
static int av_storage_param_cost_limit
double autovacuum_vac_cost_delay
static pg_noreturn void AutoVacLauncherShutdown(void)
#define AutoVacNumSignals
struct avl_dbase avl_dbase
int autovacuum_vac_thresh
struct avw_dbase avw_dbase
static void launch_worker(TimestampTz now)
struct WorkerInfoData WorkerInfoData
static dlist_head DatabaseList
static void rebuild_database_list(Oid newdb)
static AutoVacuumShmemStruct * AutoVacuumShmem
static void check_av_worker_gucs(void)
#define MIN_AUTOVAC_SLEEPTIME
#define MAX_AUTOVAC_ACTIV_LEN
double autovacuum_anl_scale
int autovacuum_vac_ins_thresh
#define MAX_AUTOVAC_SLEEPTIME
static MemoryContext DatabaseListCxt
void AutoVacWorkerFailed(void)
struct WorkerInfoData * WorkerInfo
bool autovacuum_start_daemon
static void perform_work_item(AutoVacuumWorkItem *workitem)
double autovacuum_vac_ins_scale
static MultiXactId recentMulti
static int default_freeze_min_age
static void autovac_recalculate_workers_for_balance(void)
int autovacuum_vac_max_thresh
void AutoVacuumUpdateCostLimit(void)
static WorkerInfo MyWorkerInfo
static void autovac_report_workitem(AutoVacuumWorkItem *workitem, const char *nspname, const char *relname)
static void recheck_relation_needs_vacanalyze(Oid relid, AutoVacOpts *avopts, Form_pg_class classForm, int effective_multixact_freeze_max_age, bool *dovacuum, bool *doanalyze, bool *wraparound)
static autovac_table * table_recheck_autovac(Oid relid, HTAB *table_toast_map, TupleDesc pg_class_desc, int effective_multixact_freeze_max_age)
static MemoryContext AutovacMemCxt
static void ProcessAutoVacLauncherInterrupts(void)
static AutoVacOpts * extract_autovac_opts(HeapTuple tup, TupleDesc pg_class_desc)
static int default_freeze_table_age
static void autovacuum_do_vac_analyze(autovac_table *tab, BufferAccessStrategy bstrategy)
void TimestampDifference(TimestampTz start_time, TimestampTz stop_time, long *secs, int *microsecs)
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
TimestampTz GetCurrentTimestamp(void)
Datum now(PG_FUNCTION_ARGS)
void pgstat_report_activity(BackendState state, const char *cmd_str)
static bool BlockNumberIsValid(BlockNumber blockNumber)
Datum brin_summarize_range(PG_FUNCTION_ARGS)
void AtEOXact_Buffers(bool isCommit)
TransactionId MultiXactId
#define PointerIsValid(pointer)
#define OidIsValid(objectId)
char * get_database_name(Oid dbid)
bool database_is_invalid_form(Form_pg_database datform)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
#define PERFORM_DELETION_SKIP_EXTENSIONS
#define PERFORM_DELETION_QUIETLY
#define PERFORM_DELETION_INTERNAL
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
void AtEOXact_HashTables(bool isCommit)
void * hash_seq_search(HASH_SEQ_STATUS *status)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errmsg_internal(const char *fmt,...)
void EmitErrorReport(void)
int errdetail(const char *fmt,...)
ErrorContextCallback * error_context_stack
void FlushErrorState(void)
int errhint(const char *fmt,...)
bool message_level_is_interesting(int elevel)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
sigjmp_buf * PG_exception_stack
#define ereport(elevel,...)
void AtEOXact_Files(bool isCommit)
Datum Int64GetDatum(int64 X)
#define DirectFunctionCall2(func, arg1, arg2)
BufferAccessStrategy GetAccessStrategyWithSize(BufferAccessStrategyType btype, int ring_size_kb)
volatile sig_atomic_t LogMemoryContextPending
volatile sig_atomic_t ProcSignalBarrierPending
volatile sig_atomic_t QueryCancelPending
int VacuumBufferUsageLimit
void ProcessConfigFile(GucContext context)
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define dlist_foreach(iter, lhead)
static void dlist_init(dlist_head *head)
static void dlist_delete(dlist_node *node)
static uint32 dclist_count(const dclist_head *head)
#define dlist_reverse_foreach(iter, lhead)
#define dlist_tail_element(type, membername, lhead)
static void dlist_push_head(dlist_head *head, dlist_node *node)
static bool dlist_is_empty(const dlist_head *head)
static dlist_node * dclist_pop_head_node(dclist_head *head)
static void dclist_push_head(dclist_head *head, dlist_node *node)
static void dclist_init(dclist_head *head)
static void dlist_move_head(dlist_head *head, dlist_node *node)
#define DLIST_STATIC_INIT(name)
#define dlist_container(type, membername, ptr)
#define INJECTION_POINT(name, arg)
static int pg_cmp_s32(int32 a, int32 b)
void SignalHandlerForShutdownRequest(SIGNAL_ARGS)
volatile sig_atomic_t ShutdownRequestPending
volatile sig_atomic_t ConfigReloadPending
void SignalHandlerForConfigReload(SIGNAL_ARGS)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
void SetLatch(Latch *latch)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
bool ConditionalLockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
#define AccessExclusiveLock
char * get_rel_name(Oid relid)
Oid get_rel_namespace(Oid relid)
char * get_namespace_name(Oid nspid)
bool LWLockHeldByMe(LWLock *lock)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void LWLockReleaseAll(void)
VacuumRelation * makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
MemoryContext CurrentMemoryContext
MemoryContext PostmasterContext
void ProcessLogMemoryContextInterrupt(void)
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define RESUME_INTERRUPTS()
#define GetProcessingMode()
#define CHECK_FOR_INTERRUPTS()
#define HOLD_INTERRUPTS()
#define SetProcessingMode(mode)
#define INIT_PG_OVERRIDE_ALLOW_CONNS
BackendType MyBackendType
bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2)
int MultiXactMemberFreezeThreshold(void)
MultiXactId ReadNextMultiXactId(void)
#define MultiXactIdIsValid(multi)
TempNamespaceStatus checkTempNamespaceStatus(Oid namespaceId)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
FormData_pg_class * Form_pg_class
FormData_pg_database * Form_pg_database
static rewind_source * source
void pgstat_report_autovac(Oid dboid)
PgStat_StatDBEntry * pgstat_fetch_stat_dbentry(Oid dboid)
PgStat_StatTabEntry * pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid)
void SendPostmasterSignal(PMSignalReason reason)
@ PMSIGNAL_START_AUTOVAC_WORKER
#define qsort(a, b, c, d)
void FloatExceptionHandler(SIGNAL_ARGS)
void StatementCancelHandler(SIGNAL_ARGS)
static Datum ObjectIdGetDatum(Oid X)
static Datum CharGetDatum(char X)
void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, bits32 flags, char *out_dbname)
void ProcessProcSignalBarrier(void)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
void init_ps_display(const char *fixed_part)
static void set_ps_display(const char *activity)
#define RelationGetDescr(relation)
bytea * extractRelOptions(HeapTuple tuple, TupleDesc tupdesc, amoptions_function amoptions)
void ReleaseAuxProcessResources(bool isCommit)
ResourceOwner AuxProcessResourceOwner
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Size add_size(Size s1, Size s2)
Size mul_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
void pg_usleep(long microsec)
void ProcessCatchupInterrupt(void)
#define BTEqualStrategyNumber
int multixact_freeze_max_age
float8 vacuum_scale_factor
float8 vacuum_ins_scale_factor
int multixact_freeze_table_age
int multixact_freeze_min_age
float8 analyze_scale_factor
dclist_head av_freeWorkers
WorkerInfo av_startingWorker
sig_atomic_t av_signal[AutoVacNumSignals]
AutoVacuumWorkItem av_workItems[NUM_WORKITEMS]
pg_atomic_uint32 av_nworkersForBalance
dlist_head av_runningWorkers
BlockNumber avw_blockNumber
AutoVacuumWorkItemType avw_type
TimestampTz last_autovac_time
PgStat_Counter ins_since_vacuum
PgStat_Counter mod_since_analyze
PgStat_Counter dead_tuples
int multixact_freeze_min_age
int multixact_freeze_table_age
VacOptValue index_cleanup
double max_eager_freeze_failure_rate
TimestampTz wi_launchtime
pg_atomic_flag wi_dobalance
double at_storage_param_vac_cost_delay
int at_storage_param_vac_cost_limit
AutoVacOpts ar_reloptions
TimestampTz adl_next_worker
PgStat_StatDBEntry * adw_entry
TransactionId adw_frozenxid
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define SearchSysCacheCopy1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
void disable_all_timeouts(bool keep_indicators)
void InitializeTimeouts(void)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
static TransactionId ReadNextTransactionId(void)
#define FirstNormalTransactionId
#define TransactionIdIsNormal(xid)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
#define TimestampTzPlusMilliseconds(tz, ms)
int vacuum_freeze_min_age
double vacuum_max_eager_freeze_failure_rate
void vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, MemoryContext vac_context, bool isTopLevel)
int vacuum_multixact_freeze_table_age
int vacuum_freeze_table_age
int vacuum_multixact_freeze_min_age
void vac_update_datfrozenxid(void)
bool VacuumFailsafeActive
#define VACOPT_SKIP_LOCKED
#define VACOPT_SKIP_DATABASE_STATS
@ VACOPTVALUE_UNSPECIFIED
#define VACOPT_PROCESS_MAIN
static void pgstat_report_wait_end(void)
#define WL_EXIT_ON_PM_DEATH
void StartTransactionCommand(void)
void SetCurrentStatementStartTimestamp(void)
void CommitTransactionCommand(void)
void AbortOutOfAnyTransaction(void)
void AbortCurrentTransaction(void)
@ SYNCHRONOUS_COMMIT_LOCAL_FLUSH