mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Rename "pg_clog" directory to "pg_xact".
Names containing the letters "log" sometimes confuse users into believing that only non-critical data is present. It is hoped this renaming will discourage ill-considered removals of transaction status data. Michael Paquier Discussion: http://postgr.es/m/CA+Tgmoa9xFQyjRZupbdEFuwUerFTvC6HjZq1ud6GYragGDFFgA@mail.gmail.com
This commit is contained in:
parent
bd9028b824
commit
88e66d193f
@ -382,10 +382,10 @@ tar -cf backup.tar /usr/local/pgsql/data
|
||||
directories. This will <emphasis>not</> work because the
|
||||
information contained in these files is not usable without
|
||||
the commit log files,
|
||||
<filename>pg_clog/*</filename>, which contain the commit status of
|
||||
<filename>pg_xact/*</filename>, which contain the commit status of
|
||||
all transactions. A table file is only usable with this
|
||||
information. Of course it is also impossible to restore only a
|
||||
table and the associated <filename>pg_clog</filename> data
|
||||
table and the associated <filename>pg_xact</filename> data
|
||||
because that would render all other tables in the database
|
||||
cluster useless. So file system backups only work for complete
|
||||
backup and restoration of an entire database cluster.
|
||||
|
@ -1893,7 +1893,7 @@
|
||||
All transaction IDs before this one have been replaced with a permanent
|
||||
(<quote>frozen</>) transaction ID in this table. This is used to track
|
||||
whether the table needs to be vacuumed in order to prevent transaction
|
||||
ID wraparound or to allow <literal>pg_clog</> to be shrunk. Zero
|
||||
ID wraparound or to allow <literal>pg_xact</> to be shrunk. Zero
|
||||
(<symbol>InvalidTransactionId</symbol>) if the relation is not a table.
|
||||
</entry>
|
||||
</row>
|
||||
@ -2570,7 +2570,7 @@
|
||||
All transaction IDs before this one have been replaced with a permanent
|
||||
(<quote>frozen</>) transaction ID in this database. This is used to
|
||||
track whether the database needs to be vacuumed in order to prevent
|
||||
transaction ID wraparound or to allow <literal>pg_clog</> to be shrunk.
|
||||
transaction ID wraparound or to allow <literal>pg_xact</> to be shrunk.
|
||||
It is the minimum of the per-table
|
||||
<structname>pg_class</>.<structfield>relfrozenxid</> values.
|
||||
</entry>
|
||||
|
@ -6004,7 +6004,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
|
||||
|
||||
<para>
|
||||
Vacuum also allows removal of old files from the
|
||||
<filename>pg_clog</> subdirectory, which is why the default
|
||||
<filename>pg_xact</> subdirectory, which is why the default
|
||||
is a relatively low 200 million transactions.
|
||||
This parameter can only be set at server start, but the setting
|
||||
can be reduced for individual tables by
|
||||
|
@ -15616,7 +15616,7 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
|
||||
postmaster.pid | 9
|
||||
pg_ident.conf | 10
|
||||
global | 11
|
||||
pg_clog | 12
|
||||
pg_xact | 12
|
||||
pg_snapshots | 13
|
||||
pg_multixact | 14
|
||||
PG_VERSION | 15
|
||||
|
@ -527,18 +527,18 @@
|
||||
<para>
|
||||
The sole disadvantage of increasing <varname>autovacuum_freeze_max_age</>
|
||||
(and <varname>vacuum_freeze_table_age</> along with it)
|
||||
is that the <filename>pg_clog</> subdirectory of the database cluster
|
||||
is that the <filename>pg_xact</> subdirectory of the database cluster
|
||||
will take more space, because it must store the commit status of all
|
||||
transactions back to the <varname>autovacuum_freeze_max_age</> horizon.
|
||||
The commit status uses two bits per transaction, so if
|
||||
<varname>autovacuum_freeze_max_age</> is set to its maximum allowed
|
||||
value of two billion, <filename>pg_clog</> can be expected to
|
||||
value of two billion, <filename>pg_xact</> can be expected to
|
||||
grow to about half a gigabyte. If this is trivial compared to your
|
||||
total database size, setting <varname>autovacuum_freeze_max_age</> to
|
||||
its maximum allowed value is recommended. Otherwise, set it depending
|
||||
on what you are willing to allow for <filename>pg_clog</> storage.
|
||||
on what you are willing to allow for <filename>pg_xact</> storage.
|
||||
(The default, 200 million transactions, translates to about 50MB of
|
||||
<filename>pg_clog</> storage.)
|
||||
<filename>pg_xact</> storage.)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -256,12 +256,12 @@ PostgreSQL documentation
|
||||
|
||||
<para>
|
||||
A safe value can be determined by looking for the numerically largest
|
||||
file name in the directory <filename>pg_clog</> under the data directory,
|
||||
file name in the directory <filename>pg_xact</> under the data directory,
|
||||
adding one,
|
||||
and then multiplying by 1048576 (0x100000). Note that the file names are in
|
||||
hexadecimal. It is usually easiest to specify the option value in
|
||||
hexadecimal too. For example, if <filename>0011</> is the largest entry
|
||||
in <filename>pg_clog</>, <literal>-x 0x1200000</> will work (five
|
||||
in <filename>pg_xact</>, <literal>-x 0x1200000</> will work (five
|
||||
trailing zeroes provide the proper multiplier).
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -229,7 +229,7 @@ PostgreSQL documentation
|
||||
</step>
|
||||
<step>
|
||||
<para>
|
||||
Copy all other files such as <filename>pg_clog</filename> and
|
||||
Copy all other files such as <filename>pg_xact</filename> and
|
||||
configuration files from the source cluster to the target cluster
|
||||
(everything except the relation files).
|
||||
</para>
|
||||
|
@ -77,11 +77,6 @@ Item
|
||||
<entry>Subdirectory containing transaction commit timestamp data</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><filename>pg_clog</></entry>
|
||||
<entry>Subdirectory containing transaction commit status data</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><filename>pg_dynshmem</></entry>
|
||||
<entry>Subdirectory containing files used by the dynamic shared memory
|
||||
@ -151,6 +146,11 @@ Item
|
||||
<entry>Subdirectory containing WAL (Write Ahead Log) files</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><filename>pg_xact</></entry>
|
||||
<entry>Subdirectory containing transaction commit status data</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><filename>postgresql.auto.conf</></entry>
|
||||
<entry>A file used for storing configuration parameters that are set by
|
||||
|
@ -201,7 +201,7 @@
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Internal data structures such as <filename>pg_clog</filename>, <filename>pg_subtrans</filename>, <filename>pg_multixact</filename>,
|
||||
Internal data structures such as <filename>pg_xact</filename>, <filename>pg_subtrans</filename>, <filename>pg_multixact</filename>,
|
||||
<filename>pg_serial</filename>, <filename>pg_notify</filename>, <filename>pg_stat</filename>, <filename>pg_snapshots</filename> are not directly
|
||||
checksummed, nor are pages protected by full page writes. However, where
|
||||
such data structures are persistent, WAL records are written that allow
|
||||
|
@ -6790,8 +6790,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid,
|
||||
* Note: it might seem we could make the changes without exclusive lock, since
|
||||
* TransactionId read/write is assumed atomic anyway. However there is a race
|
||||
* condition: someone who just fetched an old XID that we overwrite here could
|
||||
* conceivably not finish checking the XID against pg_clog before we finish
|
||||
* the VACUUM and perhaps truncate off the part of pg_clog he needs. Getting
|
||||
* conceivably not finish checking the XID against pg_xact before we finish
|
||||
* the VACUUM and perhaps truncate off the part of pg_xact he needs. Getting
|
||||
* exclusive lock ensures no other backend is in process of checking the
|
||||
* tuple status. Also, getting exclusive lock makes it safe to adjust the
|
||||
* infomask bits.
|
||||
|
@ -331,17 +331,17 @@ of the xid fields is atomic, so assuming it for xmin as well is no extra
|
||||
risk.
|
||||
|
||||
|
||||
pg_clog and pg_subtrans
|
||||
pg_xact and pg_subtrans
|
||||
-----------------------
|
||||
|
||||
pg_clog and pg_subtrans are permanent (on-disk) storage of transaction related
|
||||
pg_xact and pg_subtrans are permanent (on-disk) storage of transaction related
|
||||
information. There is a limited number of pages of each kept in memory, so
|
||||
in many cases there is no need to actually read from disk. However, if
|
||||
there's a long running transaction or a backend sitting idle with an open
|
||||
transaction, it may be necessary to be able to read and write this information
|
||||
from disk. They also allow information to be permanent across server restarts.
|
||||
|
||||
pg_clog records the commit status for each transaction that has been assigned
|
||||
pg_xact records the commit status for each transaction that has been assigned
|
||||
an XID. A transaction can be in progress, committed, aborted, or
|
||||
"sub-committed". This last state means that it's a subtransaction that's no
|
||||
longer running, but its parent has not updated its state yet. It is not
|
||||
@ -381,9 +381,9 @@ each transaction we keep a "cache" of Xids that are known to be part of the
|
||||
transaction tree, so we can skip looking at pg_subtrans unless we know the
|
||||
cache has been overflowed. See storage/ipc/procarray.c for the gory details.
|
||||
|
||||
slru.c is the supporting mechanism for both pg_clog and pg_subtrans. It
|
||||
slru.c is the supporting mechanism for both pg_xact and pg_subtrans. It
|
||||
implements the LRU policy for in-memory buffer pages. The high-level routines
|
||||
for pg_clog are implemented in transam.c, while the low-level functions are in
|
||||
for pg_xact are implemented in transam.c, while the low-level functions are in
|
||||
clog.c. pg_subtrans is contained completely in subtrans.c.
|
||||
|
||||
|
||||
|
@ -450,7 +450,7 @@ CLOGShmemInit(void)
|
||||
{
|
||||
ClogCtl->PagePrecedes = CLOGPagePrecedes;
|
||||
SimpleLruInit(ClogCtl, "clog", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE,
|
||||
CLogControlLock, "pg_clog", LWTRANCHE_CLOG_BUFFERS);
|
||||
CLogControlLock, "pg_xact", LWTRANCHE_CLOG_BUFFERS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3,7 +3,7 @@
|
||||
* commit_ts.c
|
||||
* PostgreSQL commit timestamp manager
|
||||
*
|
||||
* This module is a pg_clog-like system that stores the commit timestamp
|
||||
* This module is a pg_xact-like system that stores the commit timestamp
|
||||
* for each transaction.
|
||||
*
|
||||
* XLOG interactions: this module generates an XLOG record whenever a new
|
||||
|
@ -3,7 +3,7 @@
|
||||
* multixact.c
|
||||
* PostgreSQL multi-transaction-log manager
|
||||
*
|
||||
* The pg_multixact manager is a pg_clog-like manager that stores an array of
|
||||
* The pg_multixact manager is a pg_xact-like manager that stores an array of
|
||||
* MultiXactMember for each MultiXactId. It is a fundamental part of the
|
||||
* shared-row-lock implementation. Each MultiXactMember is comprised of a
|
||||
* TransactionId and a set of flag bits. The name is a bit historical:
|
||||
|
@ -3,15 +3,14 @@
|
||||
* subtrans.c
|
||||
* PostgreSQL subtransaction-log manager
|
||||
*
|
||||
* The pg_subtrans manager is a pg_clog-like manager that stores the parent
|
||||
* The pg_subtrans manager is a pg_xact-like manager that stores the parent
|
||||
* transaction Id for each transaction. It is a fundamental part of the
|
||||
* nested transactions implementation. A main transaction has a parent
|
||||
* of InvalidTransactionId, and each subtransaction has its immediate parent.
|
||||
* The tree can easily be walked from child to parent, but not in the
|
||||
* opposite direction.
|
||||
*
|
||||
* This code is based on clog.c, but the robustness requirements
|
||||
* are completely different from pg_clog, because we only need to remember
|
||||
* are completely different from pg_xact, because we only need to remember
|
||||
* pg_subtrans information for currently-open transactions. Thus, there is
|
||||
* no need to preserve data over a crash and restart.
|
||||
*
|
||||
|
@ -224,7 +224,7 @@ TransactionIdDidAbort(TransactionId transactionId)
|
||||
* True iff transaction associated with the identifier is currently
|
||||
* known to have either committed or aborted.
|
||||
*
|
||||
* This does NOT look into pg_clog but merely probes our local cache
|
||||
* This does NOT look into pg_xact but merely probes our local cache
|
||||
* (and so it's not named TransactionIdDidComplete, which would be the
|
||||
* appropriate name for a function that worked that way). The intended
|
||||
* use is just to short-circuit TransactionIdIsInProgress calls when doing
|
||||
|
@ -1379,7 +1379,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
|
||||
/*
|
||||
* The order of operations here is critical: make the XLOG entry for
|
||||
* commit or abort, then mark the transaction committed or aborted in
|
||||
* pg_clog, then remove its PGPROC from the global ProcArray (which means
|
||||
* pg_xact, then remove its PGPROC from the global ProcArray (which means
|
||||
* TransactionIdIsInProgress will stop saying the prepared xact is in
|
||||
* progress), then run the post-commit or post-abort callbacks. The
|
||||
* callbacks will release the locks the transaction held.
|
||||
@ -2093,7 +2093,7 @@ RecordTransactionCommitPrepared(TransactionId xid,
|
||||
/* Flush XLOG to disk */
|
||||
XLogFlush(recptr);
|
||||
|
||||
/* Mark the transaction committed in pg_clog */
|
||||
/* Mark the transaction committed in pg_xact */
|
||||
TransactionIdCommitTree(xid, nchildren, children);
|
||||
|
||||
/* Checkpoint can proceed now */
|
||||
|
@ -1208,8 +1208,8 @@ RecordTransactionCommit(void)
|
||||
/*
|
||||
* Mark ourselves as within our "commit critical section". This
|
||||
* forces any concurrent checkpoint to wait until we've updated
|
||||
* pg_clog. Without this, it is possible for the checkpoint to set
|
||||
* REDO after the XLOG record but fail to flush the pg_clog update to
|
||||
* pg_xact. Without this, it is possible for the checkpoint to set
|
||||
* REDO after the XLOG record but fail to flush the pg_xact update to
|
||||
* disk, leading to loss of the transaction commit if the system
|
||||
* crashes a little later.
|
||||
*
|
||||
@ -2035,7 +2035,7 @@ CommitTransaction(void)
|
||||
if (!is_parallel_worker)
|
||||
{
|
||||
/*
|
||||
* We need to mark our XIDs as committed in pg_clog. This is where we
|
||||
* We need to mark our XIDs as committed in pg_xact. This is where we
|
||||
* durably commit.
|
||||
*/
|
||||
latestXid = RecordTransactionCommit();
|
||||
@ -2545,7 +2545,7 @@ AbortTransaction(void)
|
||||
AtAbort_Twophase();
|
||||
|
||||
/*
|
||||
* Advertise the fact that we aborted in pg_clog (assuming that we got as
|
||||
* Advertise the fact that we aborted in pg_xact (assuming that we got as
|
||||
* far as assigning an XID to advertise). But if we're inside a parallel
|
||||
* worker, skip this; the user backend must be the one to write the abort
|
||||
* record.
|
||||
@ -4631,7 +4631,7 @@ AbortSubTransaction(void)
|
||||
s->parent->subTransactionId);
|
||||
AtSubAbort_Notify();
|
||||
|
||||
/* Advertise the fact that we aborted in pg_clog. */
|
||||
/* Advertise the fact that we aborted in pg_xact. */
|
||||
(void) RecordTransactionAbort(true);
|
||||
|
||||
/* Post-abort cleanup */
|
||||
@ -5375,7 +5375,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
|
||||
if (standbyState == STANDBY_DISABLED)
|
||||
{
|
||||
/*
|
||||
* Mark the transaction committed in pg_clog.
|
||||
* Mark the transaction committed in pg_xact.
|
||||
*/
|
||||
TransactionIdCommitTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||
}
|
||||
@ -5393,7 +5393,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
|
||||
RecordKnownAssignedTransactionIds(max_xid);
|
||||
|
||||
/*
|
||||
* Mark the transaction committed in pg_clog. We use async commit
|
||||
* Mark the transaction committed in pg_xact. We use async commit
|
||||
* protocol during recovery to provide information on database
|
||||
* consistency for when users try to set hint bits. It is important
|
||||
* that we do not set hint bits until the minRecoveryPoint is past
|
||||
@ -5530,7 +5530,7 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
|
||||
|
||||
if (standbyState == STANDBY_DISABLED)
|
||||
{
|
||||
/* Mark the transaction aborted in pg_clog, no need for async stuff */
|
||||
/* Mark the transaction aborted in pg_xact, no need for async stuff */
|
||||
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||
}
|
||||
else
|
||||
@ -5546,7 +5546,7 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
|
||||
*/
|
||||
RecordKnownAssignedTransactionIds(max_xid);
|
||||
|
||||
/* Mark the transaction aborted in pg_clog, no need for async stuff */
|
||||
/* Mark the transaction aborted in pg_xact, no need for async stuff */
|
||||
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||
|
||||
/*
|
||||
|
@ -8710,7 +8710,7 @@ CreateCheckPoint(int flags)
|
||||
* that are currently in commit critical sections. If an xact inserted
|
||||
* its commit record into XLOG just before the REDO point, then a crash
|
||||
* restart from the REDO point would not replay that record, which means
|
||||
* that our flushing had better include the xact's update of pg_clog. So
|
||||
* that our flushing had better include the xact's update of pg_xact. So
|
||||
* we wait till he's out of his commit critical section before proceeding.
|
||||
* See notes in RecordTransactionCommit().
|
||||
*
|
||||
|
@ -357,7 +357,7 @@ vacuum(int options, RangeVar *relation, Oid relid, VacuumParams *params,
|
||||
if ((options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess())
|
||||
{
|
||||
/*
|
||||
* Update pg_database.datfrozenxid, and truncate pg_clog if possible.
|
||||
* Update pg_database.datfrozenxid, and truncate pg_xact if possible.
|
||||
* (autovacuum.c does this for itself.)
|
||||
*/
|
||||
vac_update_datfrozenxid();
|
||||
@ -910,7 +910,7 @@ vac_update_relstats(Relation relation,
|
||||
* pg_class.relminmxid values.
|
||||
*
|
||||
* If we are able to advance either pg_database value, also try to
|
||||
* truncate pg_clog and pg_multixact.
|
||||
* truncate pg_xact and pg_multixact.
|
||||
*
|
||||
* We violate transaction semantics here by overwriting the database's
|
||||
* existing pg_database tuple with the new values. This is reasonably
|
||||
@ -1056,7 +1056,7 @@ vac_update_datfrozenxid(void)
|
||||
|
||||
/*
|
||||
* If we were able to advance datfrozenxid or datminmxid, see if we can
|
||||
* truncate pg_clog and/or pg_multixact. Also do it if the shared
|
||||
* truncate pg_xact and/or pg_multixact. Also do it if the shared
|
||||
* XID-wrap-limit info is stale, since this action will update that too.
|
||||
*/
|
||||
if (dirty || ForceTransactionIdLimitUpdate())
|
||||
@ -1069,7 +1069,7 @@ vac_update_datfrozenxid(void)
|
||||
* vac_truncate_clog() -- attempt to truncate the commit log
|
||||
*
|
||||
* Scan pg_database to determine the system-wide oldest datfrozenxid,
|
||||
* and use it to truncate the transaction commit log (pg_clog).
|
||||
* and use it to truncate the transaction commit log (pg_xact).
|
||||
* Also update the XID wrap limit info maintained by varsup.c.
|
||||
* Likewise for datminmxid.
|
||||
*
|
||||
@ -1116,7 +1116,7 @@ vac_truncate_clog(TransactionId frozenXID,
|
||||
* of the interlock against copying a DB containing an active backend.
|
||||
* Hence the new entry will not reduce the minimum. Also, if two VACUUMs
|
||||
* concurrently modify the datfrozenxid's of different databases, the
|
||||
* worst possible outcome is that pg_clog is not truncated as aggressively
|
||||
* worst possible outcome is that pg_xact is not truncated as aggressively
|
||||
* as it could be.
|
||||
*/
|
||||
relation = heap_open(DatabaseRelationId, AccessShareLock);
|
||||
|
@ -2472,7 +2472,7 @@ deleted:
|
||||
*/
|
||||
|
||||
/*
|
||||
* Update pg_database.datfrozenxid, and truncate pg_clog if possible. We
|
||||
* Update pg_database.datfrozenxid, and truncate pg_xact if possible. We
|
||||
* only need to do this once, not after each table.
|
||||
*
|
||||
* Even if we didn't vacuum anything, it may still be important to do
|
||||
|
@ -63,7 +63,7 @@ at about the same time would OR the same bits into the field, so there
|
||||
is little or no risk of conflicting update; what's more, if there did
|
||||
manage to be a conflict it would merely mean that one bit-update would
|
||||
be lost and need to be done again later. These four bits are only hints
|
||||
(they cache the results of transaction status lookups in pg_clog), so no
|
||||
(they cache the results of transaction status lookups in pg_xact), so no
|
||||
great harm is done if they get reset to zero by conflicting updates.
|
||||
Note, however, that a tuple is frozen by setting both HEAP_XMIN_INVALID
|
||||
and HEAP_XMIN_COMMITTED; this is a critical update and accordingly requires
|
||||
|
@ -381,7 +381,7 @@ ProcArrayRemove(PGPROC *proc, TransactionId latestXid)
|
||||
* ProcArrayEndTransaction -- mark a transaction as no longer running
|
||||
*
|
||||
* This is used interchangeably for commit and abort cases. The transaction
|
||||
* commit/abort must already be reported to WAL and pg_clog.
|
||||
* commit/abort must already be reported to WAL and pg_xact.
|
||||
*
|
||||
* proc is currently always MyProc, but we pass it explicitly for flexibility.
|
||||
* latestXid is the latest Xid among the transaction's main XID and
|
||||
@ -1174,7 +1174,7 @@ TransactionIdIsInProgress(TransactionId xid)
|
||||
* At this point, we know it's either a subtransaction of one of the Xids
|
||||
* in xids[], or it's not running. If it's an already-failed
|
||||
* subtransaction, we want to say "not running" even though its parent may
|
||||
* still be running. So first, check pg_clog to see if it's been aborted.
|
||||
* still be running. So first, check pg_xact to see if it's been aborted.
|
||||
*/
|
||||
xc_slow_answer_inc();
|
||||
|
||||
|
@ -13,9 +13,9 @@
|
||||
* NOTE: When using a non-MVCC snapshot, we must check
|
||||
* TransactionIdIsInProgress (which looks in the PGXACT array)
|
||||
* before TransactionIdDidCommit/TransactionIdDidAbort (which look in
|
||||
* pg_clog). Otherwise we have a race condition: we might decide that a
|
||||
* pg_xact). Otherwise we have a race condition: we might decide that a
|
||||
* just-committed transaction crashed, because none of the tests succeed.
|
||||
* xact.c is careful to record commit/abort in pg_clog before it unsets
|
||||
* xact.c is careful to record commit/abort in pg_xact before it unsets
|
||||
* MyPgXact->xid in the PGXACT array. That fixes that problem, but it
|
||||
* also means there is a window where TransactionIdIsInProgress and
|
||||
* TransactionIdDidCommit will both return true. If we check only
|
||||
@ -29,7 +29,7 @@
|
||||
*
|
||||
* When using an MVCC snapshot, we rely on XidInMVCCSnapshot rather than
|
||||
* TransactionIdIsInProgress, but the logic is otherwise the same: do not
|
||||
* check pg_clog until after deciding that the xact is no longer in progress.
|
||||
* check pg_xact until after deciding that the xact is no longer in progress.
|
||||
*
|
||||
*
|
||||
* Summary of visibility functions:
|
||||
|
@ -197,7 +197,6 @@ static const char *backend_options = "--single -F -O -j -c search_path=pg_catalo
|
||||
static const char *const subdirs[] = {
|
||||
"global",
|
||||
"pg_wal/archive_status",
|
||||
"pg_clog",
|
||||
"pg_commit_ts",
|
||||
"pg_dynshmem",
|
||||
"pg_notify",
|
||||
@ -214,6 +213,7 @@ static const char *const subdirs[] = {
|
||||
"pg_tblspc",
|
||||
"pg_stat",
|
||||
"pg_stat_tmp",
|
||||
"pg_xact",
|
||||
"pg_logical",
|
||||
"pg_logical/snapshots",
|
||||
"pg_logical/mappings"
|
||||
|
@ -338,11 +338,17 @@ check_data_dir(ClusterInfo *cluster)
|
||||
check_single_dir(pg_data, "pg_tblspc");
|
||||
check_single_dir(pg_data, "pg_twophase");
|
||||
|
||||
/* pg_xlog has been renamed to pg_wal in post-10 cluster */
|
||||
/* pg_xlog has been renamed to pg_wal in v10 */
|
||||
if (GET_MAJOR_VERSION(cluster->major_version) < 1000)
|
||||
check_single_dir(pg_data, "pg_xlog");
|
||||
else
|
||||
check_single_dir(pg_data, "pg_wal");
|
||||
|
||||
/* pg_clog has been renamed to pg_xact in v10 */
|
||||
if (GET_MAJOR_VERSION(cluster->major_version) < 1000)
|
||||
check_single_dir(pg_data, "pg_clog");
|
||||
else
|
||||
check_single_dir(pg_data, "pg_xact");
|
||||
}
|
||||
|
||||
|
||||
|
@ -48,7 +48,7 @@
|
||||
static void prepare_new_cluster(void);
|
||||
static void prepare_new_databases(void);
|
||||
static void create_new_objects(void);
|
||||
static void copy_clog_xlog_xid(void);
|
||||
static void copy_xact_xlog_xid(void);
|
||||
static void set_frozenxids(bool minmxid_only);
|
||||
static void setup(char *argv0, bool *live_check);
|
||||
static void cleanup(void);
|
||||
@ -115,7 +115,7 @@ main(int argc, char **argv)
|
||||
* Destructive Changes to New Cluster
|
||||
*/
|
||||
|
||||
copy_clog_xlog_xid();
|
||||
copy_xact_xlog_xid();
|
||||
|
||||
/* New now using xids of the old system */
|
||||
|
||||
@ -376,17 +376,17 @@ remove_new_subdir(char *subdir, bool rmtopdir)
|
||||
* Copy the files from the old cluster into it
|
||||
*/
|
||||
static void
|
||||
copy_subdir_files(char *subdir)
|
||||
copy_subdir_files(char *old_subdir, char *new_subdir)
|
||||
{
|
||||
char old_path[MAXPGPATH];
|
||||
char new_path[MAXPGPATH];
|
||||
|
||||
remove_new_subdir(subdir, true);
|
||||
remove_new_subdir(new_subdir, true);
|
||||
|
||||
snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, subdir);
|
||||
snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
|
||||
snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
|
||||
snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
|
||||
|
||||
prep_status("Copying old %s to new server", subdir);
|
||||
prep_status("Copying old %s to new server", old_subdir);
|
||||
|
||||
exec_prog(UTILITY_LOG_FILE, NULL, true,
|
||||
#ifndef WIN32
|
||||
@ -401,10 +401,16 @@ copy_subdir_files(char *subdir)
|
||||
}
|
||||
|
||||
static void
|
||||
copy_clog_xlog_xid(void)
|
||||
copy_xact_xlog_xid(void)
|
||||
{
|
||||
/* copy old commit logs to new data dir */
|
||||
copy_subdir_files("pg_clog");
|
||||
/*
|
||||
* Copy old commit logs to new data dir. pg_clog has been renamed to
|
||||
* pg_xact in post-10 clusters.
|
||||
*/
|
||||
copy_subdir_files(GET_MAJOR_VERSION(old_cluster.major_version) < 1000 ?
|
||||
"pg_clog" : "pg_xact",
|
||||
GET_MAJOR_VERSION(new_cluster.major_version) < 1000 ?
|
||||
"pg_clog" : "pg_xact");
|
||||
|
||||
/* set the next transaction id and epoch of the new cluster */
|
||||
prep_status("Setting next transaction ID and epoch for new cluster");
|
||||
@ -434,8 +440,8 @@ copy_clog_xlog_xid(void)
|
||||
if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
|
||||
new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
|
||||
{
|
||||
copy_subdir_files("pg_multixact/offsets");
|
||||
copy_subdir_files("pg_multixact/members");
|
||||
copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
|
||||
copy_subdir_files("pg_multixact/members", "pg_multixact/members");
|
||||
|
||||
prep_status("Setting next multixact ID and offset for new cluster");
|
||||
|
||||
|
@ -76,7 +76,7 @@ typedef struct SlruSharedData
|
||||
/*
|
||||
* Optional array of WAL flush LSNs associated with entries in the SLRU
|
||||
* pages. If not zero/NULL, we must flush WAL before writing pages (true
|
||||
* for pg_clog, false for multixact, pg_subtrans, pg_notify). group_lsn[]
|
||||
* for pg_xact, false for multixact, pg_subtrans, pg_notify). group_lsn[]
|
||||
* has lsn_groups_per_page entries per buffer slot, each containing the
|
||||
* highest LSN known for a contiguous group of SLRU entries on that slot's
|
||||
* page.
|
||||
@ -119,7 +119,7 @@ typedef struct SlruCtlData
|
||||
SlruShared shared;
|
||||
|
||||
/*
|
||||
* This flag tells whether to fsync writes (true for pg_clog and multixact
|
||||
* This flag tells whether to fsync writes (true for pg_xact and multixact
|
||||
* stuff, false for pg_subtrans and pg_notify).
|
||||
*/
|
||||
bool do_fsync;
|
||||
|
Loading…
x
Reference in New Issue
Block a user