Changeset: 94542d05b6dc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/94542d05b6dc
Modified Files:
clients/mapiclient/mclient.c
clients/mapilib/mapi.c
common/stream/mapi_stream.c
monetdb5/modules/mal/tablet.c
Branch: client_interrupts
Log Message:
Implemented abort in COPY INTO ON CLIENT.
diffs (91 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -3135,6 +3135,10 @@ getfile(void *data, const char *filename
return (char*) mnstr_peek_error(NULL);
}
while (offset > 1) {
+ if (state == INTERRUPT) {
+ close_stream(f);
+ return "interrupted";
+ }
s = mnstr_readline(f, buf, READSIZE);
if (s < 0) {
close_stream(f);
@@ -3158,6 +3162,11 @@ getfile(void *data, const char *filename
return NULL;
}
}
+ if (state == INTERRUPT) {
+ close_stream(f);
+ priv->f = NULL;
+ return "interrupted";
+ }
s = mnstr_read(f, buf, 1, READSIZE);
if (s <= 0) {
close_stream(f);
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -3340,6 +3340,12 @@ read_file(MapiHdl hdl, uint64_t off, cha
data = mid->getfilecontent(mid->filecontentprivate,
NULL, false, 0, &size);
}
}
+ if (data != NULL && size == 0) {
+ /* some error occurred */
+ mnstr_clearerr(mid->from);
+ if (mid->oobintr)
+ mnstr_putoob(mid->to, 1);
+ }
mnstr_flush(mid->to, MNSTR_FLUSH_DATA);
line = read_line(mid);
if (line == NULL)
diff --git a/common/stream/mapi_stream.c b/common/stream/mapi_stream.c
--- a/common/stream/mapi_stream.c
+++ b/common/stream/mapi_stream.c
@@ -150,6 +150,7 @@ setup_transfer(const char *req, const ch
ssize_t nwritten;
ssize_t nread;
bool ok;
+ int oob = 0;
while (!bs->eof)
bstream_next(bs);
@@ -169,9 +170,19 @@ setup_transfer(const char *req, const ch
char buf[256];
nread = mnstr_readline(rs, buf, sizeof(buf));
- ok = (nread == 0 || (nread == 1 && buf[0] == '\n'));
+ ok = (nread == 0 || (nread == 1 && buf[0] == '\n') || !(oob =
mnstr_getoob(rs)));
if (!ok) {
- msg = buf;
+ switch (oob) {
+ case 1: /* client side
interrupt */
+ msg = "Query aborted";
+ break;
+ case 2:
+ msg = "Read error on client";
+ break;
+ default:
+ msg = nread > 0 ? buf : "Unknown error";
+ break;
+ }
discard(rs);
goto end;
}
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -1249,6 +1249,12 @@ SQLproducer(void *p)
// we may be reading from standard input and may be out of input
// warn the consumers
+ if (bstream_getoob(task->cntxt->fdin)) {
+ tablet_error(task, rowno, lineno, int_nil,
+ "problem reported by client",
s);
+ goto reportlackofinput;
+ }
+
if (ateof[cur] && partial) {
if (unlikely(partial)) {
tablet_error(task, rowno, lineno, int_nil,
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]