dirty-fix.diff
application/octet-stream
Filename: dirty-fix.diff
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/async.c | 1 | 1 |
| src/bin/pgbench/pgbench.c | 86 | 21 |
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index 4bdf21c319c..663fa7fafbb 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -1855,7 +1855,7 @@ asyncQueueReadAllNotifications(void)
Snapshot snapshot;
/* page_buffer must be adequately aligned */
- alignas(AsyncQueueEntry) char page_buffer[QUEUE_PAGESIZE];
+ alignas(alignof(AsyncQueueEntry)) char page_buffer[QUEUE_PAGESIZE];
/* Fetch current state */
LWLockAcquire(NotifyQueueLock, LW_SHARED);
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index f165fabce36..8e8564ae8ae 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3246,7 +3246,7 @@ sendCommand(CState *st, Command *command)
/*
* Read and discard all available results from the connection.
*/
-static void
+static PGresult *
discardAvailableResults(CState *st)
{
PGresult *res = NULL;
@@ -3255,6 +3255,21 @@ discardAvailableResults(CState *st)
{
res = PQgetResult(st->con);
+ printf("EVAN: discardAvailableResults: Got result: res=%d, conn=%d\n",
+ PQresultStatus(res), PQstatus(st->con));
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ char *val = PQgetvalue(res, 0, 0);
+ printf("EVAN: discardAvailableResults: Got result value: %s, conn=%d\n",
+ val, PQstatus(st->con));
+ }
+ if (PQresultStatus(res) == PGRES_PIPELINE_SYNC)
+ {
+ printf("EVAN: discardAvailableResults: Got sync, returning, conn=%d\n",
+ PQstatus(st->con));
+ return res;
+ }
+
/*
* Read and discard results until PQgetResult() returns NULL (no more
* results) or a connection failure is detected. If the pipeline
@@ -3264,11 +3279,16 @@ discardAvailableResults(CState *st)
*/
if ((res == NULL && PQpipelineStatus(st->con) != PQ_PIPELINE_ABORTED) ||
PQstatus(st->con) == CONNECTION_BAD)
+ {
+ printf("EVAN: discardAvailableResults: breaking loop, conn=%d\n",
+ PQstatus(st->con));
break;
+ }
PQclear(res);
}
PQclear(res);
+ return NULL;
}
/*
@@ -3277,7 +3297,10 @@ discardAvailableResults(CState *st)
static EStatus
getSQLErrorStatus(CState *st, const char *sqlState)
{
- discardAvailableResults(st);
+ //discardAvailableResults(st);
+ if (st->estatus == ESTATUS_NO_ERROR)
+ return ESTATUS_NO_ERROR;
+
if (PQstatus(st->con) == CONNECTION_BAD)
return ESTATUS_CONN_ERROR;
@@ -3338,13 +3361,28 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
((meta == META_GSET || meta == META_ASET) && varprefix != NULL));
res = PQgetResult(st->con);
-
+ printf("EVAN: readCommandResponse: Got result: res=%d, conn=%d\n",
+ PQresultStatus(res), PQstatus(st->con));
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ char *val = PQgetvalue(res, 0, 0);
+ printf("EVAN: readCommandResponse: Got result value: %s, conn=%d\n",
+ val, PQstatus(st->con));
+ }
while (res != NULL)
{
bool is_last;
/* peek at the next result to know whether the current is last */
next_res = PQgetResult(st->con);
+ printf("EVAN: readCommandResponse2: Got result: next_res=%d, conn=%d\n",
+ PQresultStatus(next_res), PQstatus(st->con));
+ if (PQresultStatus(next_res) == PGRES_TUPLES_OK)
+ {
+ char *val = PQgetvalue(next_res, 0, 0);
+ printf("EVAN: readCommandResponse2: Got next-result value: %s, conn=%d\n",
+ val, PQstatus(st->con));
+ }
is_last = (next_res == NULL);
switch (PQresultStatus(res))
@@ -3431,8 +3469,19 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
case PGRES_NONFATAL_ERROR:
case PGRES_FATAL_ERROR:
+ {
+ PGresult *temp_res = discardAvailableResults(st);
+ if (temp_res != NULL)
+ {
+ next_res = temp_res;
+ break;
+ }
st->estatus = getSQLErrorStatus(st, PQresultErrorField(res,
PG_DIAG_SQLSTATE));
+ if (st->estatus == ESTATUS_NO_ERROR)
+ {
+ break;
+ }
if (canRetryError(st->estatus) || canContinueOnError(st->estatus))
{
if (verbose_errors)
@@ -3440,6 +3489,7 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
goto error;
}
/* fall through */
+ }
default:
/* anything else is unexpected */
@@ -3460,6 +3510,8 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
return false;
}
+ printf("EVAN: readCommandResponse: completed, conn=%d\n",
+ PQstatus(st->con));
return true;
error:
@@ -3588,9 +3640,14 @@ discardUntilSync(CState *st)
PGresult *res = PQgetResult(st->con);
if (PQresultStatus(res) == PGRES_PIPELINE_SYNC)
+ {
+ printf("EVAN: Got sync while discarding until sync, conn=%d\n", PQstatus(st->con));
received_sync = true;
- else if (received_sync && res == NULL)
+ }
+ else if (received_sync) // && res == NULL)
{
+ printf("EVAN: Got null while discarding until sync, conn=%d\n", PQstatus(st->con));
+ Assert(res == NULL);
/*
* Reset ongoing sync count to 0 since all PGRES_PIPELINE_SYNC
* results have been discarded.
@@ -3599,23 +3656,31 @@ discardUntilSync(CState *st)
PQclear(res);
break;
}
- else
- {
- if (PQstatus(st->con) == CONNECTION_BAD)
- {
- pg_log_error("client %d aborted: the backend died while rolling back the failed transaction after",
- st->id);
- PQclear(res);
- return 0;
- }
-
- /*
- * If a PGRES_PIPELINE_SYNC is followed by something other than
- * PGRES_PIPELINE_SYNC or NULL, another PGRES_PIPELINE_SYNC will
- * eventually follow.
- */
- received_sync = false;
- }
+ //else
+ //{
+ // printf("EVAN: Got result while discarding until sync: %d, conn=%d\n",
+ // PQresultStatus(res), PQstatus(st->con));
+ // if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ // {
+ // char *val = PQgetvalue(res, 0, 0);
+ // printf("EVAN: Got result value while discarding until sync: %s, conn=%d\n",
+ // val, PQstatus(st->con));
+ // }
+ // if (PQstatus(st->con) == CONNECTION_BAD)
+ // {
+ // pg_log_error("client %d aborted: the backend died while rolling back the failed transaction after",
+ // st->id);
+ // PQclear(res);
+ // return 0;
+ // }
+ //
+ // /*
+ // * If a PGRES_PIPELINE_SYNC is followed by something other than
+ // * PGRES_PIPELINE_SYNC or NULL, another PGRES_PIPELINE_SYNC will
+ // * eventually follow.
+ // */
+ // received_sync = false;
+ //}
PQclear(res);
}