Index: src/backend/storage/ipc/sinval.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/storage/ipc/sinval.c,v retrieving revision 1.63 diff -c -r1.63 sinval.c *** src/backend/storage/ipc/sinval.c 23 May 2004 03:50:45 -0000 1.63 --- src/backend/storage/ipc/sinval.c 24 May 2004 19:25:16 -0000 *************** *** 464,469 **** --- 464,503 ---- } /* + * IsBackendPid -- is a given pid a running backend + */ + bool + IsBackendPid(int pid) + { + bool result = false; + SISeg *segP = shmInvalBuffer; + ProcState *stateP = segP->procState; + int index; + + LWLockAcquire(SInvalLock, LW_SHARED); + + for (index = 0; index < segP->lastBackend; index++) + { + SHMEM_OFFSET pOffset = stateP[index].procStruct; + + if (pOffset != INVALID_OFFSET) + { + PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset); + + if (proc->pid == pid) + { + result = true; + break; + } + } + } + + LWLockRelease(SInvalLock); + + return result; + } + + /* * GetOldestXmin -- returns oldest transaction that was running * when any current transaction was started. * Index: src/backend/utils/adt/misc.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/misc.c,v retrieving revision 1.33 diff -c -r1.33 misc.c *** src/backend/utils/adt/misc.c 21 May 2004 05:08:02 -0000 1.33 --- src/backend/utils/adt/misc.c 24 May 2004 19:12:47 -0000 *************** *** 15,20 **** --- 15,21 ---- #include "postgres.h" #include + #include #include "commands/dbcommands.h" #include "miscadmin.h" *************** *** 56,59 **** --- 57,104 ---- namestrcpy(db, get_database_name(MyDatabaseId)); PG_RETURN_NAME(db); + } + + + /* + * Functions to terminate a backend or cancel a query running on + * a different backend. + */ + + static int pg_signal_backend(int pid, int sig) + { + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("only superuser can signal other backends")))); + + if (!IsBackendPid(pid)) + { + /* This is just a warning so a loop-through-resultset will not abort + * if one backend terminated on it's own during the run */ + ereport(WARNING, + (errmsg("pid %i is not a postgresql backend",pid))); + return 0; + } + + if (kill(pid, sig)) + { + /* Again, just a warning to allow loops */ + ereport(WARNING, + (errmsg("failed to send signal to backend %i: %m",pid))); + return 0; + } + return 1; + } + + Datum + pg_terminate_backend(PG_FUNCTION_ARGS) + { + PG_RETURN_INT32(pg_signal_backend(PG_GETARG_INT32(0),SIGTERM)); + } + + Datum + pg_cancel_backend(PG_FUNCTION_ARGS) + { + PG_RETURN_INT32(pg_signal_backend(PG_GETARG_INT32(0),SIGINT)); } Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/catalog/pg_proc.h,v retrieving revision 1.333 diff -c -r1.333 pg_proc.h *** src/include/catalog/pg_proc.h 26 May 2004 18:37:33 -0000 1.333 --- src/include/catalog/pg_proc.h 27 May 2004 17:38:16 -0000 *************** *** 2808,2813 **** --- 2808,2818 ---- DATA(insert OID = 1945 ( pg_stat_get_db_blocks_hit PGNSP PGUID 12 f f t f s 1 20 "26" _null_ pg_stat_get_db_blocks_hit - _null_ )); DESCR("Statistics: Blocks found in cache for database"); + DATA(insert OID = 2171 ( pg_terminate_backend PGNSP PGUID 12 f f t f s 1 23 "23" _null_ pg_terminate_backend - _null_ )); + DESCR("Terminate a backend process"); + DATA(insert OID = 2172 ( pg_cancel_backend PGNSP PGUID 12 f f t f s 1 23 "23" _null_ pg_cancel_backend - _null_ )); + DESCR("Cancel running query on a backend process"); + DATA(insert OID = 1946 ( encode PGNSP PGUID 12 f f t f i 2 25 "17 25" _null_ binary_encode - _null_ )); DESCR("Convert bytea value into some ascii-only text string"); DATA(insert OID = 1947 ( decode PGNSP PGUID 12 f f t f i 2 17 "25 25" _null_ binary_decode - _null_ )); Index: src/include/storage/sinval.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/storage/sinval.h,v retrieving revision 1.34 diff -c -r1.34 sinval.h *** src/include/storage/sinval.h 23 May 2004 03:50:45 -0000 1.34 --- src/include/storage/sinval.h 24 May 2004 18:59:17 -0000 *************** *** 97,102 **** --- 97,103 ---- extern bool DatabaseHasActiveBackends(Oid databaseId, bool ignoreMyself); extern bool TransactionIdIsInProgress(TransactionId xid); + extern bool IsBackendPid(int pid); extern TransactionId GetOldestXmin(bool allDbs); extern int CountActiveBackends(void); extern int CountEmptyBackendSlots(void); Index: src/include/utils/builtins.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/utils/builtins.h,v retrieving revision 1.240 diff -c -r1.240 builtins.h *** src/include/utils/builtins.h 26 May 2004 18:35:46 -0000 1.240 --- src/include/utils/builtins.h 27 May 2004 17:38:16 -0000 *************** *** 354,359 **** --- 354,361 ---- extern Datum nullvalue(PG_FUNCTION_ARGS); extern Datum nonnullvalue(PG_FUNCTION_ARGS); extern Datum current_database(PG_FUNCTION_ARGS); + extern Datum pg_terminate_backend(PG_FUNCTION_ARGS); + extern Datum pg_cancel_backend(PG_FUNCTION_ARGS); /* not_in.c */ extern Datum int4notin(PG_FUNCTION_ARGS);