diff options
Diffstat (limited to 'src/backend/utils')
| -rw-r--r-- | src/backend/utils/adt/lockfuncs.c | 86 | ||||
| -rw-r--r-- | src/backend/utils/error/elog.c | 21 | ||||
| -rw-r--r-- | src/backend/utils/misc/postgresql.conf.sample | 3 |
3 files changed, 75 insertions, 35 deletions
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c index 2263a94603..e78d74f9ef 100644 --- a/src/backend/utils/adt/lockfuncs.c +++ b/src/backend/utils/adt/lockfuncs.c @@ -6,7 +6,7 @@ * Copyright (c) 2002-2007, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.28 2007/01/05 22:19:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.29 2007/09/05 18:10:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,6 +27,7 @@ static const char *const LockTagTypeNames[] = { "page", "tuple", "transactionid", + "virtualxid", "object", "userlock", "advisory" @@ -39,6 +40,27 @@ typedef struct int currIdx; /* current PROCLOCK index */ } PG_Lock_Status; + +/* + * VXIDGetDatum - Construct a text representation of a VXID + * + * This is currently only used in pg_lock_status, so we put it here. + */ +static Datum +VXIDGetDatum(BackendId bid, LocalTransactionId lxid) +{ + /* + * The representation is "<bid>/<lxid>", decimal and unsigned decimal + * respectively. Note that elog.c also knows how to format a vxid. + */ + char vxidstr[32]; + + snprintf(vxidstr, sizeof(vxidstr), "%d/%u", bid, lxid); + + return DirectFunctionCall1(textin, CStringGetDatum(vxidstr)); +} + + /* * pg_lock_status - produce a view with one row per held or awaited lock mode */ @@ -64,7 +86,7 @@ pg_lock_status(PG_FUNCTION_ARGS) /* build tupdesc for result tuples */ /* this had better match pg_locks view in system_views.sql */ - tupdesc = CreateTemplateTupleDesc(13, false); + tupdesc = CreateTemplateTupleDesc(14, false); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "locktype", TEXTOID, -1, 0); TupleDescInitEntry(tupdesc, (AttrNumber) 2, "database", @@ -75,21 +97,23 @@ pg_lock_status(PG_FUNCTION_ARGS) INT4OID, -1, 0); TupleDescInitEntry(tupdesc, (AttrNumber) 5, "tuple", INT2OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "transactionid", + TupleDescInitEntry(tupdesc, (AttrNumber) 6, "virtualxid", + TEXTOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 7, "transactionid", XIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 7, "classid", + TupleDescInitEntry(tupdesc, (AttrNumber) 8, "classid", OIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 8, "objid", + TupleDescInitEntry(tupdesc, (AttrNumber) 9, "objid", OIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 9, "objsubid", + TupleDescInitEntry(tupdesc, (AttrNumber) 10, "objsubid", INT2OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 10, "transaction", - XIDOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 11, "pid", + TupleDescInitEntry(tupdesc, (AttrNumber) 11, "virtualtransaction", + TEXTOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 12, "pid", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 12, "mode", + TupleDescInitEntry(tupdesc, (AttrNumber) 13, "mode", TEXTOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 13, "granted", + TupleDescInitEntry(tupdesc, (AttrNumber) 14, "granted", BOOLOID, -1, 0); funcctx->tuple_desc = BlessTupleDesc(tupdesc); @@ -120,8 +144,8 @@ pg_lock_status(PG_FUNCTION_ARGS) LOCKMODE mode = 0; const char *locktypename; char tnbuf[32]; - Datum values[13]; - char nulls[13]; + Datum values[14]; + char nulls[14]; HeapTuple tuple; Datum result; @@ -193,7 +217,6 @@ pg_lock_status(PG_FUNCTION_ARGS) values[0] = DirectFunctionCall1(textin, CStringGetDatum(locktypename)); - switch (lock->tag.locktag_type) { case LOCKTAG_RELATION: @@ -206,6 +229,7 @@ pg_lock_status(PG_FUNCTION_ARGS) nulls[6] = 'n'; nulls[7] = 'n'; nulls[8] = 'n'; + nulls[9] = 'n'; break; case LOCKTAG_PAGE: values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); @@ -216,6 +240,7 @@ pg_lock_status(PG_FUNCTION_ARGS) nulls[6] = 'n'; nulls[7] = 'n'; nulls[8] = 'n'; + nulls[9] = 'n'; break; case LOCKTAG_TUPLE: values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); @@ -226,9 +251,22 @@ pg_lock_status(PG_FUNCTION_ARGS) nulls[6] = 'n'; nulls[7] = 'n'; nulls[8] = 'n'; + nulls[9] = 'n'; break; case LOCKTAG_TRANSACTION: - values[5] = TransactionIdGetDatum(lock->tag.locktag_field1); + values[6] = TransactionIdGetDatum(lock->tag.locktag_field1); + nulls[1] = 'n'; + nulls[2] = 'n'; + nulls[3] = 'n'; + nulls[4] = 'n'; + nulls[5] = 'n'; + nulls[7] = 'n'; + nulls[8] = 'n'; + nulls[9] = 'n'; + break; + case LOCKTAG_VIRTUALTRANSACTION: + values[5] = VXIDGetDatum(lock->tag.locktag_field1, + lock->tag.locktag_field2); nulls[1] = 'n'; nulls[2] = 'n'; nulls[3] = 'n'; @@ -236,31 +274,33 @@ pg_lock_status(PG_FUNCTION_ARGS) nulls[6] = 'n'; nulls[7] = 'n'; nulls[8] = 'n'; + nulls[9] = 'n'; break; case LOCKTAG_OBJECT: case LOCKTAG_USERLOCK: case LOCKTAG_ADVISORY: default: /* treat unknown locktags like OBJECT */ values[1] = ObjectIdGetDatum(lock->tag.locktag_field1); - values[6] = ObjectIdGetDatum(lock->tag.locktag_field2); - values[7] = ObjectIdGetDatum(lock->tag.locktag_field3); - values[8] = Int16GetDatum(lock->tag.locktag_field4); + values[7] = ObjectIdGetDatum(lock->tag.locktag_field2); + values[8] = ObjectIdGetDatum(lock->tag.locktag_field3); + values[9] = Int16GetDatum(lock->tag.locktag_field4); nulls[2] = 'n'; nulls[3] = 'n'; nulls[4] = 'n'; nulls[5] = 'n'; + nulls[6] = 'n'; break; } - values[9] = TransactionIdGetDatum(proc->xid); + values[10] = VXIDGetDatum(proc->backendId, proc->lxid); if (proc->pid != 0) - values[10] = Int32GetDatum(proc->pid); + values[11] = Int32GetDatum(proc->pid); else - nulls[10] = 'n'; - values[11] = DirectFunctionCall1(textin, + nulls[11] = 'n'; + values[12] = DirectFunctionCall1(textin, CStringGetDatum(GetLockmodeName(LOCK_LOCKMETHOD(*lock), mode))); - values[12] = BoolGetDatum(granted); + values[13] = BoolGetDatum(granted); tuple = heap_formtuple(funcctx->tuple_desc, values, nulls); result = HeapTupleGetDatum(tuple); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index d0d024e075..e8a3ed3db0 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -42,7 +42,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.195 2007/08/23 01:24:43 adunstan Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.196 2007/09/05 18:10:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -66,6 +66,7 @@ #include "postmaster/postmaster.h" #include "postmaster/syslogger.h" #include "storage/ipc.h" +#include "storage/proc.h" #include "tcop/tcopprot.h" #include "utils/memutils.h" #include "utils/ps_status.h" @@ -1592,9 +1593,14 @@ log_line_prefix(StringInfo buf) if (MyProcPort == NULL) i = format_len; break; + case 'v': + /* keep VXID format in sync with lockfuncs.c */ + if (MyProc != NULL) + appendStringInfo(buf, "%d/%u", + MyProc->backendId, MyProc->lxid); + break; case 'x': - if (MyProcPort) - appendStringInfo(buf, "%u", GetTopTransactionId()); + appendStringInfo(buf, "%u", GetTopTransactionIdIfAny()); break; case '%': appendStringInfoChar(buf, '%'); @@ -1785,15 +1791,8 @@ write_csvlog(ErrorData *edata) appendStringInfoString(&buf, formatted_start_time); appendStringInfoChar(&buf, ','); - /* Transaction id */ - if (MyProcPort) - { - if (IsTransactionState()) - appendStringInfo(&buf, "%u", GetTopTransactionId()); - else - appendStringInfo(&buf, "%u", InvalidTransactionId); - } + appendStringInfo(&buf, "%u", GetTopTransactionIdIfAny()); appendStringInfoChar(&buf, ','); diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index b22099c2fd..7de3145aa0 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -338,7 +338,8 @@ # %c = session id # %l = session line number # %s = session start timestamp - # %x = transaction id + # %v = virtual transaction id + # %x = transaction id (0 if none) # %q = stop here in non-session # processes # %% = '%' |
