Changeset: de576546cb43 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/de576546cb43
Modified Files:
common/stream/socket_stream.c
gdk/gdk.h
Branch: client_interrupts
Log Message:
While checking for interrupts, also check for disconnect from client.
diffs (112 lines):
diff --git a/common/stream/socket_stream.c b/common/stream/socket_stream.c
--- a/common/stream/socket_stream.c
+++ b/common/stream/socket_stream.c
@@ -319,6 +319,10 @@ socket_getoob(const stream *s)
.tv_sec = 0,
.tv_usec = 0,
};
+#ifdef FD_SETSIZE
+ if (fd >= FD_SETSIZE)
+ return 0;
+#endif
FD_ZERO(&fds);
FD_SET(fd, &fds);
if (select(
@@ -330,6 +334,15 @@ socket_getoob(const stream *s)
NULL, NULL, &fds, &t) > 0)
#endif
{
+#ifdef HAVE_POLL
+ if (pfd.revents & (POLLHUP | POLLNVAL))
+ return -1;
+ if ((pfd.revents & POLLPRI) == 0)
+ return -1;
+#else
+ if (!FD_ISSET(fd, &fds))
+ return 0;
+#endif
char b = 0;
switch (recv(fd, &b, 1, MSG_OOB)) {
case 0:
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2361,23 +2361,72 @@ gdk_export BAT *BATsample_with_seed(BAT
#define CHECK_QRY_TIMEOUT_MASK (CHECK_QRY_TIMEOUT_STEP - 1)
#define TIMEOUT_MSG "Timeout was reached!"
-#define INTERRUPT_MSG "Query interrupted"
+#define INTERRUPT_MSG "Query interrupted!"
+#define DISCONNECT_MSG "Client is disconnected!"
#define EXITING_MSG "Server is exiting!"
-#define QRY_TIMEOUT (-1)
-#define QRY_INTERRUPT (-2)
+#define QRY_TIMEOUT (-1) /* query timed out */
+#define QRY_INTERRUPT (-2) /* client indicated interrupt */
+#define QRY_DISCONNECT (-3) /* client disconnected */
+
+static inline void
+TIMEOUT_ERROR(QryCtx *qc, const char *file, const char *func, int lineno)
+{
+ if (GDKexiting())
+ GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
+ "%s\n", EXITING_MSG);
+ else {
+ switch (qc->endtime) {
+ case QRY_TIMEOUT:
+ GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
+ "%s\n", TIMEOUT_MSG);
+ break;
+ case QRY_INTERRUPT:
+ GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
+ "%s\n", INTERRUPT_MSG);
+ break;
+ case QRY_DISCONNECT:
+ GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
+ "%s\n", DISCONNECT_MSG);
+ break;
+ default:
+ MT_UNREACHABLE();
+ }
+ }
+}
#define TIMEOUT_HANDLER(rtpe, qc) \
do { \
- GDKerror("%s\n", GDKexiting() ? EXITING_MSG : (qc) &&
(qc)->endtime == QRY_INTERRUPT ? INTERRUPT_MSG : TIMEOUT_MSG); \
+ TIMEOUT_ERROR(qc, __FILE__, __func__, __LINE__); \
return rtpe; \
} while(0)
-#define TIMEOUT_TEST(QC) ((QC) && ((QC)->endtime < 0 || ((QC)->endtime
&& GDKusec() > (QC)->endtime && ((QC)->endtime = QRY_TIMEOUT)) ||
(bstream_getoob((QC)->bs) > 0 && ((QC)->endtime = QRY_INTERRUPT))))
+static inline bool
+TIMEOUT_TEST(QryCtx *qc)
+{
+ if (qc == NULL)
+ return false;
+ if (qc->endtime < 0)
+ return true;
+ if (qc->endtime && GDKusec() > qc->endtime) {
+ qc->endtime = QRY_TIMEOUT;
+ return true;
+ }
+ switch (bstream_getoob(qc->bs)) {
+ case -1:
+ qc->endtime = QRY_DISCONNECT;
+ return true;
+ case 0:
+ return false;
+ default:
+ qc->endtime = QRY_INTERRUPT;
+ return true;
+ }
+}
#define GOTO_LABEL_TIMEOUT_HANDLER(label, qc) \
do { \
- GDKerror("%s\n", GDKexiting() ? EXITING_MSG : (qc) &&
(qc)->endtime == QRY_INTERRUPT ? INTERRUPT_MSG : TIMEOUT_MSG); \
+ TIMEOUT_ERROR(qc, __FILE__, __func__, __LINE__); \
goto label; \
} while(0)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]