diff options
| author | Tom Lane | 2008-03-11 20:20:35 +0000 |
|---|---|---|
| committer | Tom Lane | 2008-03-11 20:20:35 +0000 |
| commit | 611b4393f22f2bb43135501cd6b7591299b6b453 (patch) | |
| tree | 5f9eacf6a35487d9fd164dafa694de7ca699dea4 /src/backend/storage/ipc/procarray.c | |
| parent | ba8a9a9282c0c1f962999887bb101b78bd479685 (diff) | |
Make TransactionIdIsInProgress check transam.c's single-item XID status cache
before it goes groveling through the ProcArray. In situations where the same
recently-committed transaction ID is checked repeatedly by tqual.c, this saves
a lot of shared-memory searches. And it's cheap enough that it shouldn't
hurt noticeably when it doesn't help.
Concept and patch by Simon, some minor tweaking and comment-cleanup by Tom.
Diffstat (limited to 'src/backend/storage/ipc/procarray.c')
| -rw-r--r-- | src/backend/storage/ipc/procarray.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 575b138c435..d7ba39bc5d4 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -23,7 +23,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.40 2008/01/09 21:52:36 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.41 2008/03/11 20:20:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -60,6 +60,7 @@ static ProcArrayStruct *procArray; /* counters for XidCache measurement */ static long xc_by_recent_xmin = 0; +static long xc_by_known_xact = 0; static long xc_by_my_xact = 0; static long xc_by_latest_xid = 0; static long xc_by_main_xid = 0; @@ -68,6 +69,7 @@ static long xc_no_overflow = 0; static long xc_slow_answer = 0; #define xc_by_recent_xmin_inc() (xc_by_recent_xmin++) +#define xc_by_known_xact_inc() (xc_by_known_xact++) #define xc_by_my_xact_inc() (xc_by_my_xact++) #define xc_by_latest_xid_inc() (xc_by_latest_xid++) #define xc_by_main_xid_inc() (xc_by_main_xid++) @@ -79,6 +81,7 @@ static void DisplayXidCache(void); #else /* !XIDCACHE_DEBUG */ #define xc_by_recent_xmin_inc() ((void) 0) +#define xc_by_known_xact_inc() ((void) 0) #define xc_by_my_xact_inc() ((void) 0) #define xc_by_latest_xid_inc() ((void) 0) #define xc_by_main_xid_inc() ((void) 0) @@ -354,6 +357,17 @@ TransactionIdIsInProgress(TransactionId xid) } /* + * We may have just checked the status of this transaction, so if it is + * already known to be completed, we can fall out without any access to + * shared memory. + */ + if (TransactionIdIsKnownCompleted(xid)) + { + xc_by_known_xact_inc(); + return false; + } + + /* * Also, we can handle our own transaction (and subtransactions) without * any access to shared memory. */ @@ -1335,8 +1349,9 @@ static void DisplayXidCache(void) { fprintf(stderr, - "XidCache: xmin: %ld, myxact: %ld, latest: %ld, mainxid: %ld, childxid: %ld, nooflo: %ld, slow: %ld\n", + "XidCache: xmin: %ld, known: %ld, myxact: %ld, latest: %ld, mainxid: %ld, childxid: %ld, nooflo: %ld, slow: %ld\n", xc_by_recent_xmin, + xc_by_known_xact, xc_by_my_xact, xc_by_latest_xid, xc_by_main_xid, |
