RepOriginId nodeid, int pageno);
static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts,
RepOriginId nodeid, int slotno);
+static void error_commit_ts_disabled(void);
static int ZeroCommitTsPage(int pageno, bool writeXlog);
static bool CommitTsPagePrecedes(int page1, int page2);
static void ActivateCommitTs(void);
/* Error if module not enabled */
if (!commitTsShared->commitTsActive)
- ereport(ERROR,
- (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("could not get commit timestamp data"),
- errhint("Make sure the configuration parameter \"%s\" is set.",
- "track_commit_timestamp")));
+ error_commit_ts_disabled();
/*
* If we're asked for the cached value, return that. Otherwise, fall
/* Error if module not enabled */
if (!commitTsShared->commitTsActive)
- ereport(ERROR,
- (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("could not get commit timestamp data"),
- errhint("Make sure the configuration parameter \"%s\" is set.",
- "track_commit_timestamp")));
+ error_commit_ts_disabled();
xid = commitTsShared->xidLastCommit;
if (ts)
return xid;
}
+static void
+error_commit_ts_disabled(void)
+{
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("could not get commit timestamp data"),
+ RecoveryInProgress() ?
+ errhint("Make sure the configuration parameter \"%s\" is set in the master server.",
+ "track_commit_timestamp") :
+ errhint("Make sure the configuration parameter \"%s\" is set.",
+ "track_commit_timestamp")));
+}
+
/*
* SQL-callable wrapper to obtain commit time of a transaction
*/
/*
* Nothing to do here at present, unlike most other SLRU modules; segments
* are created when the server is started with this module enabled. See
- * StartupCommitTs.
+ * ActivateCommitTs.
*/
}
* configuration.
*/
void
-StartupCommitTs(bool force_enable)
+StartupCommitTs(bool enabled)
{
/*
* If the module is not enabled, there's nothing to do here. The module
* could still be activated from elsewhere.
*/
- if (track_commit_timestamp || force_enable)
+ if (enabled)
ActivateCommitTs();
}
* Startup commit log, commit timestamp and subtrans only.
* MultiXact has already been started up and other SLRUs are not
* maintained during recovery and need not be started yet.
+ *
+ * For commit timestamps, we do this based on the control file
+ * info: in a standby, we want to drive it off the state of the
+ * master, not local configuration.
*/
StartupCLOG();
StartupCommitTs(ControlFile->track_commit_timestamp);
if (standbyState == STANDBY_DISABLED)
{
StartupCLOG();
- StartupCommitTs(false);
+ StartupCommitTs(track_commit_timestamp);
StartupSUBTRANS(oldestActiveXID);
}