Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc432061

Browse files
committed
Change the timestamps recorded in transaction commit/abort xlog records
from time_t to TimestampTz representation. This provides full gettimeofday()resolution of the timestamps, which might be useful when attempting todo point-in-time recovery --- previously it was not possible to specifythe stop point with sub-second resolution. But mostly this is to getrid of TimestampTz-to-time_t conversion overhead during commit. Per myproposal of a day or two back.
1 parent641912b commitc432061

File tree

7 files changed

+67
-42
lines changed

7 files changed

+67
-42
lines changed

‎src/backend/access/transam/twophase.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
*$PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.29 2007/04/03 16:34:35 tgl Exp $
10+
*$PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.30 2007/04/30 21:01:52 tgl Exp $
1111
*
1212
* NOTES
1313
*Each global transaction is associated with a global transaction
@@ -1675,7 +1675,7 @@ RecordTransactionCommitPrepared(TransactionId xid,
16751675

16761676
/* Emit the XLOG commit record */
16771677
xlrec.xid=xid;
1678-
xlrec.crec.xtime=time(NULL);
1678+
xlrec.crec.xact_time=GetCurrentTimestamp();
16791679
xlrec.crec.nrels=nrels;
16801680
xlrec.crec.nsubxacts=nchildren;
16811681
rdata[0].data= (char*) (&xlrec);
@@ -1753,7 +1753,7 @@ RecordTransactionAbortPrepared(TransactionId xid,
17531753

17541754
/* Emit the XLOG abort record */
17551755
xlrec.xid=xid;
1756-
xlrec.arec.xtime=time(NULL);
1756+
xlrec.arec.xact_time=GetCurrentTimestamp();
17571757
xlrec.arec.nrels=nrels;
17581758
xlrec.arec.nsubxacts=nchildren;
17591759
rdata[0].data= (char*) (&xlrec);

‎src/backend/access/transam/xact.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.241 2007/04/3003:23:48 tgl Exp $
13+
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.242 2007/04/3021:01:52 tgl Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -773,7 +773,7 @@ RecordTransactionCommit(void)
773773
MyProc->inCommit= true;
774774

775775
SetCurrentTransactionStopTimestamp();
776-
xlrec.xtime=timestamptz_to_time_t(xactStopTimestamp);
776+
xlrec.xact_time=xactStopTimestamp;
777777
xlrec.nrels=nrels;
778778
xlrec.nsubxacts=nchildren;
779779
rdata[0].data= (char*) (&xlrec);
@@ -1069,7 +1069,7 @@ RecordTransactionAbort(void)
10691069
XLogRecPtrrecptr;
10701070

10711071
SetCurrentTransactionStopTimestamp();
1072-
xlrec.xtime=timestamptz_to_time_t(xactStopTimestamp);
1072+
xlrec.xact_time=xactStopTimestamp;
10731073
xlrec.nrels=nrels;
10741074
xlrec.nsubxacts=nchildren;
10751075
rdata[0].data= (char*) (&xlrec);
@@ -1247,7 +1247,7 @@ RecordSubTransactionAbort(void)
12471247
xl_xact_abortxlrec;
12481248
XLogRecPtrrecptr;
12491249

1250-
xlrec.xtime=time(NULL);
1250+
xlrec.xact_time=GetCurrentTimestamp();
12511251
xlrec.nrels=nrels;
12521252
xlrec.nsubxacts=nchildren;
12531253
rdata[0].data= (char*) (&xlrec);
@@ -4282,12 +4282,9 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
42824282
staticvoid
42834283
xact_desc_commit(StringInfobuf,xl_xact_commit*xlrec)
42844284
{
4285-
structtm*tm=localtime(&xlrec->xtime);
42864285
inti;
42874286

4288-
appendStringInfo(buf,"%04u-%02u-%02u %02u:%02u:%02u",
4289-
tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,
4290-
tm->tm_hour,tm->tm_min,tm->tm_sec);
4287+
appendStringInfoString(buf,timestamptz_to_str(xlrec->xact_time));
42914288
if (xlrec->nrels>0)
42924289
{
42934290
appendStringInfo(buf,"; rels:");
@@ -4313,12 +4310,9 @@ xact_desc_commit(StringInfo buf, xl_xact_commit *xlrec)
43134310
staticvoid
43144311
xact_desc_abort(StringInfobuf,xl_xact_abort*xlrec)
43154312
{
4316-
structtm*tm=localtime(&xlrec->xtime);
43174313
inti;
43184314

4319-
appendStringInfo(buf,"%04u-%02u-%02u %02u:%02u:%02u",
4320-
tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,
4321-
tm->tm_hour,tm->tm_min,tm->tm_sec);
4315+
appendStringInfoString(buf,timestamptz_to_str(xlrec->xact_time));
43224316
if (xlrec->nrels>0)
43234317
{
43244318
appendStringInfo(buf,"; rels:");

‎src/backend/access/transam/xlog.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.267 2007/04/03 16:34:35 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.268 2007/04/30 21:01:52 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -47,7 +47,6 @@
4747
#include"storage/procarray.h"
4848
#include"storage/spin.h"
4949
#include"utils/builtins.h"
50-
#include"utils/nabstime.h"
5150
#include"utils/pg_locale.h"
5251

5352

@@ -114,11 +113,11 @@ static bool recoveryTarget = false;
114113
staticboolrecoveryTargetExact= false;
115114
staticboolrecoveryTargetInclusive= true;
116115
staticTransactionIdrecoveryTargetXid;
117-
statictime_trecoveryTargetTime;
116+
staticTimestampTzrecoveryTargetTime;
118117

119118
/* if recoveryStopsHere returns true, it saves actual stop xid/time here */
120119
staticTransactionIdrecoveryStopXid;
121-
statictime_trecoveryStopTime;
120+
staticTimestampTzrecoveryStopTime;
122121
staticboolrecoveryStopAfter;
123122

124123
/*
@@ -3536,7 +3535,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI,
35363535
xlogfname,
35373536
recoveryStopAfter ?"after" :"before",
35383537
recoveryStopXid,
3539-
str_time(recoveryStopTime));
3538+
timestamptz_to_str(recoveryStopTime));
35403539

35413540
nbytes=strlen(buffer);
35423541
errno=0;
@@ -4276,17 +4275,16 @@ readRecoveryCommandFile(void)
42764275
recoveryTargetExact= false;
42774276

42784277
/*
4279-
* Convert the time string given by the user to the time_t format.
4280-
* We use type abstime's input converter because we know abstime
4281-
* has the same representation as time_t.
4278+
* Convert the time string given by the user to TimestampTz form.
42824279
*/
4283-
recoveryTargetTime= (time_t)
4284-
DatumGetAbsoluteTime(DirectFunctionCall1(abstimein,
4285-
CStringGetDatum(tok2)));
4280+
recoveryTargetTime=
4281+
DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in,
4282+
CStringGetDatum(tok2),
4283+
ObjectIdGetDatum(InvalidOid),
4284+
Int32GetDatum(-1)));
42864285
ereport(LOG,
42874286
(errmsg("recovery_target_time = %s",
4288-
DatumGetCString(DirectFunctionCall1(abstimeout,
4289-
AbsoluteTimeGetDatum((AbsoluteTime)recoveryTargetTime))))));
4287+
timestamptz_to_str(recoveryTargetTime))));
42904288
}
42914289
elseif (strcmp(tok1,"recovery_target_inclusive")==0)
42924290
{
@@ -4464,7 +4462,7 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
44644462
{
44654463
boolstopsHere;
44664464
uint8record_info;
4467-
time_trecordXtime;
4465+
TimestampTzrecordXtime;
44684466

44694467
/* Do we have a PITR target at all? */
44704468
if (!recoveryTarget)
@@ -4479,14 +4477,14 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
44794477
xl_xact_commit*recordXactCommitData;
44804478

44814479
recordXactCommitData= (xl_xact_commit*)XLogRecGetData(record);
4482-
recordXtime=recordXactCommitData->xtime;
4480+
recordXtime=recordXactCommitData->xact_time;
44834481
}
44844482
elseif (record_info==XLOG_XACT_ABORT)
44854483
{
44864484
xl_xact_abort*recordXactAbortData;
44874485

44884486
recordXactAbortData= (xl_xact_abort*)XLogRecGetData(record);
4489-
recordXtime=recordXactAbortData->xtime;
4487+
recordXtime=recordXactAbortData->xact_time;
44904488
}
44914489
else
44924490
return false;
@@ -4532,22 +4530,26 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis)
45324530
if (recoveryStopAfter)
45334531
ereport(LOG,
45344532
(errmsg("recovery stopping after commit of transaction %u, time %s",
4535-
recoveryStopXid,str_time(recoveryStopTime))));
4533+
recoveryStopXid,
4534+
timestamptz_to_str(recoveryStopTime))));
45364535
else
45374536
ereport(LOG,
45384537
(errmsg("recovery stopping before commit of transaction %u, time %s",
4539-
recoveryStopXid,str_time(recoveryStopTime))));
4538+
recoveryStopXid,
4539+
timestamptz_to_str(recoveryStopTime))));
45404540
}
45414541
else
45424542
{
45434543
if (recoveryStopAfter)
45444544
ereport(LOG,
45454545
(errmsg("recovery stopping after abort of transaction %u, time %s",
4546-
recoveryStopXid,str_time(recoveryStopTime))));
4546+
recoveryStopXid,
4547+
timestamptz_to_str(recoveryStopTime))));
45474548
else
45484549
ereport(LOG,
45494550
(errmsg("recovery stopping before abort of transaction %u, time %s",
4550-
recoveryStopXid,str_time(recoveryStopTime))));
4551+
recoveryStopXid,
4552+
timestamptz_to_str(recoveryStopTime))));
45514553
}
45524554
}
45534555

‎src/backend/utils/adt/timestamp.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.175 2007/04/3003:23:49 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.176 2007/04/3021:01:52 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1301,6 +1301,33 @@ timestamptz_to_time_t(TimestampTz t)
13011301
returnresult;
13021302
}
13031303

1304+
/*
1305+
* Produce a C-string representation of a TimestampTz.
1306+
*
1307+
* This is mostly for use in emitting messages. The primary difference
1308+
* from timestamptz_out is that we force the output format to ISO. Note
1309+
* also that the result is in a static buffer, not pstrdup'd.
1310+
*/
1311+
constchar*
1312+
timestamptz_to_str(TimestampTzt)
1313+
{
1314+
staticcharbuf[MAXDATELEN+1];
1315+
inttz;
1316+
structpg_tmtt,
1317+
*tm=&tt;
1318+
fsec_tfsec;
1319+
char*tzn;
1320+
1321+
if (TIMESTAMP_NOT_FINITE(t))
1322+
EncodeSpecialTimestamp(t,buf);
1323+
elseif (timestamp2tm(t,&tz,tm,&fsec,&tzn,NULL)==0)
1324+
EncodeDateTime(tm,fsec,&tz,&tzn,USE_ISO_DATES,buf);
1325+
else
1326+
strlcpy(buf,"(timestamp out of range)",sizeof(buf));
1327+
1328+
returnbuf;
1329+
}
1330+
13041331

13051332
void
13061333
dt2time(Timestampjd,int*hour,int*min,int*sec,fsec_t*fsec)

‎src/include/access/xact.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.86 2007/04/3003:23:49 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.87 2007/04/3021:01:53 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -81,7 +81,7 @@ typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
8181

8282
typedefstructxl_xact_commit
8383
{
84-
time_txtime;
84+
TimestampTzxact_time;/* time of commit */
8585
intnrels;/* number of RelFileNodes */
8686
intnsubxacts;/* number of subtransaction XIDs */
8787
/* Array of RelFileNode(s) to drop at commit */
@@ -93,7 +93,7 @@ typedef struct xl_xact_commit
9393

9494
typedefstructxl_xact_abort
9595
{
96-
time_txtime;
96+
TimestampTzxact_time;/* time of abort */
9797
intnrels;/* number of RelFileNodes */
9898
intnsubxacts;/* number of subtransaction XIDs */
9999
/* Array of RelFileNode(s) to drop at abort */

‎src/include/access/xlog_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
1212
* Portions Copyright (c) 1994, Regents of the University of California
1313
*
14-
* $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.19 2007/03/03 20:02:27 momjian Exp $
14+
* $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.20 2007/04/30 21:01:53 tgl Exp $
1515
*/
1616
#ifndefXLOG_INTERNAL_H
1717
#defineXLOG_INTERNAL_H
@@ -71,7 +71,7 @@ typedef struct XLogContRecord
7171
/*
7272
* Each page of XLOG file has a header like this:
7373
*/
74-
#defineXLOG_PAGE_MAGIC0xD05F/* can be used as WAL version indicator */
74+
#defineXLOG_PAGE_MAGIC0xD061/* can be used as WAL version indicator */
7575

7676
typedefstructXLogPageHeaderData
7777
{

‎src/include/utils/timestamp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.68 2007/04/3003:23:49 tgl Exp $
9+
* $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.69 2007/04/3021:01:53 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -318,6 +318,8 @@ extern bool TimestampDifferenceExceeds(TimestampTz start_time,
318318
externTimestampTztime_t_to_timestamptz(time_ttm);
319319
externtime_ttimestamptz_to_time_t(TimestampTzt);
320320

321+
externconstchar*timestamptz_to_str(TimestampTzt);
322+
321323
externinttm2timestamp(structpg_tm*tm,fsec_tfsec,int*tzp,Timestamp*dt);
322324
externinttimestamp2tm(Timestampdt,int*tzp,structpg_tm*tm,
323325
fsec_t*fsec,char**tzn,pg_tz*attimezone);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp