pg.discon_cancel.v1.patch
application/octet-stream
Filename: pg.discon_cancel.v1.patch
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
Series: patch v1
| File | + | − |
|---|---|---|
| src/backend/libpq/pqcomm.c | 0 | 0 |
| src/backend/tcop/postgres.c | 0 | 0 |
| src/backend/utils/init/globals.c | 0 | 0 |
| src/include/miscadmin.h | 0 | 0 |
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index b83a2ef..2b114e0 100644
*** a/src/backend/libpq/pqcomm.c
--- b/src/backend/libpq/pqcomm.c
*************** internal_flush(void)
*** 1247,1255 ****
/*
* We drop the buffered data anyway so that processing can
! * continue, even though we'll probably quit soon.
*/
PqSendStart = PqSendPointer = 0;
return EOF;
}
--- 1247,1260 ----
/*
* We drop the buffered data anyway so that processing can
! * continue, even though we'll probably quit soon. We also
! * set a flag that'll cause the next CHECK_FOR_INTERRUPTS
! * to cancel the current query.
*/
PqSendStart = PqSendPointer = 0;
+ InterruptPending = 1;
+ QueryCancelPending = 1;
+ ClientConnectionLostPending = 1;
return EOF;
}
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 976a832..5e53c24 100644
*** a/src/backend/tcop/postgres.c
--- b/src/backend/tcop/postgres.c
*************** ProcessInterrupts(void)
*** 2876,2881 ****
--- 2876,2891 ----
errmsg("canceling statement due to conflict with recovery"),
errdetail_recovery_conflict()));
}
+ if (ClientConnectionLostPending)
+ {
+ ImmediateInterruptOK = false; /* not idle anymore */
+ ClientConnectionLostPending = false;
+ DisableNotifyInterrupt();
+ DisableCatchupInterrupt();
+ ereport(FATAL,
+ (errcode(ERRCODE_QUERY_CANCELED),
+ errmsg("canceling statement due to client disconnect")));
+ }
/*
* If we are reading a command from the client, just ignore the cancel
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index c4c4154..a8201ed 100644
*** a/src/backend/utils/init/globals.c
--- b/src/backend/utils/init/globals.c
*************** ProtocolVersion FrontendProtocol;
*** 29,34 ****
--- 29,35 ----
volatile bool InterruptPending = false;
volatile bool QueryCancelPending = false;
volatile bool ProcDiePending = false;
+ bool ClientConnectionLostPending = false;
volatile bool ImmediateInterruptOK = false;
volatile uint32 InterruptHoldoffCount = 0;
volatile uint32 CritSectionCount = 0;
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 9d19417..78ebbe3 100644
*** a/src/include/miscadmin.h
--- b/src/include/miscadmin.h
*************** extern PGDLLIMPORT volatile bool Interru
*** 70,75 ****
--- 70,77 ----
extern volatile bool QueryCancelPending;
extern volatile bool ProcDiePending;
+ extern bool ClientConnectionLostPending;
+
/* these are marked volatile because they are examined by signal handlers: */
extern volatile bool ImmediateInterruptOK;
extern PGDLLIMPORT volatile uint32 InterruptHoldoffCount;