dblink/isolationtester/fe_utils: Use new cancel API

Commit 61461a300c introduced new functions to libpq for cancelling
queries.  This replaces the usage of the old ones in parts of the
codebase with these newer ones.  This specifically leaves out changes to
psql and pgbench, as those would need a much larger refactor to be able
to call them due to the new functions not being signal-safe; and also
postgres_fdw, because the original code there is not clear to me
(Álvaro) and not fully tested.

Author: Jelte Fennema-Nio <postgres@jeltef.nl>
Discussion: https://postgr.es/m/CAGECzQT_VgOWWENUqvUV9xQmbaCyXjtRRAYO8W07oqashk_N+g@mail.gmail.com
pull/159/head
Alvaro Herrera 2 years ago
parent 61f352ece9
commit 66ab9371a2
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
  1. 26
      contrib/dblink/dblink.c
  2. 11
      src/fe_utils/connect_utils.c
  3. 29
      src/test/isolation/isolationtester.c

@ -1346,22 +1346,28 @@ PG_FUNCTION_INFO_V1(dblink_cancel_query);
Datum
dblink_cancel_query(PG_FUNCTION_ARGS)
{
int res;
PGconn *conn;
PGcancel *cancel;
char errbuf[256];
PGcancelConn *cancelConn;
char *msg;
dblink_init();
conn = dblink_get_named_conn(text_to_cstring(PG_GETARG_TEXT_PP(0)));
cancel = PQgetCancel(conn);
cancelConn = PQcancelCreate(conn);
res = PQcancel(cancel, errbuf, 256);
PQfreeCancel(cancel);
PG_TRY();
{
if (!PQcancelBlocking(cancelConn))
msg = pchomp(PQcancelErrorMessage(cancelConn));
else
msg = "OK";
}
PG_FINALLY();
{
PQcancelFinish(cancelConn);
}
PG_END_TRY();
if (res == 1)
PG_RETURN_TEXT_P(cstring_to_text("OK"));
else
PG_RETURN_TEXT_P(cstring_to_text(errbuf));
PG_RETURN_TEXT_P(cstring_to_text(msg));
}

@ -157,19 +157,14 @@ connectMaintenanceDatabase(ConnParams *cparams,
void
disconnectDatabase(PGconn *conn)
{
char errbuf[256];
Assert(conn != NULL);
if (PQtransactionStatus(conn) == PQTRANS_ACTIVE)
{
PGcancel *cancel;
PGcancelConn *cancelConn = PQcancelCreate(conn);
if ((cancel = PQgetCancel(conn)))
{
(void) PQcancel(cancel, errbuf, sizeof(errbuf));
PQfreeCancel(cancel);
}
(void) PQcancelBlocking(cancelConn);
PQcancelFinish(cancelConn);
}
PQfinish(conn);

@ -946,26 +946,21 @@ try_complete_step(TestSpec *testspec, PermutationStep *pstep, int flags)
*/
if (td > max_step_wait && !canceled)
{
PGcancel *cancel = PQgetCancel(conn);
PGcancelConn *cancel_conn = PQcancelCreate(conn);
if (cancel != NULL)
if (PQcancelBlocking(cancel_conn))
{
char buf[256];
if (PQcancel(cancel, buf, sizeof(buf)))
{
/*
* print to stdout not stderr, as this should appear
* in the test case's results
*/
printf("isolationtester: canceling step %s after %d seconds\n",
step->name, (int) (td / USECS_PER_SEC));
canceled = true;
}
else
fprintf(stderr, "PQcancel failed: %s\n", buf);
PQfreeCancel(cancel);
/*
* print to stdout not stderr, as this should appear in
* the test case's results
*/
printf("isolationtester: canceling step %s after %d seconds\n",
step->name, (int) (td / USECS_PER_SEC));
canceled = true;
}
else
fprintf(stderr, "PQcancel failed: %s\n", PQcancelErrorMessage(cancel_conn));
PQcancelFinish(cancel_conn);
}
/*

Loading…
Cancel
Save