Changeset: a9ec95c08325 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a9ec95c08325
Modified Files:
sql/server/sql_mvc.c
sql/server/sql_qc.c
sql/server/sql_qc.h
Branch: Aug2011
Log Message:
query cache: keep last ID when renewing the cache
For bug #2834 (and #2899), make sure that we do not return the same id
on a connection to a client twice. When a scheme update is performed,
the query cache and prepared statements are destroyed. This is done for
all connected clients. Since clients cannot know that someone else
invalidated their prepared statements, the client must have a means to
figure out that the handle is invalid (or in the worst case, doesn't
belong to the query it thinks it belongs to).
We simply keep the id before we empty the cache, and put it back in
place again, such that the client always sees an incrementing counter.
diffs (53 lines):
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -164,9 +164,10 @@ mvc_trans(mvc *m)
schema_changed = sql_trans_begin(m->session);
if (m->qc && (schema_changed || m->qc->nr > 20000 || err)){
if (schema_changed || err) {
+ int seqnr = m->qc->id;
if (m->qc)
qc_destroy(m->qc);
- m->qc = qc_create(m->clientid);
+ m->qc = qc_create(m->clientid, seqnr);
} else { /* clean all but the prepared statements */
qc_clean(m->qc);
}
@@ -379,7 +380,7 @@ mvc_create(int clientid, backend_stack s
/* if an error exceeds the buffer we don't want garbage at the end */
m->errstr[ERRSIZE-1] = '\0';
- m->qc = qc_create(clientid);
+ m->qc = qc_create(clientid, 0);
m->sa = sa_create();
m->params = NULL;
diff --git a/sql/server/sql_qc.c b/sql/server/sql_qc.c
--- a/sql/server/sql_qc.c
+++ b/sql/server/sql_qc.c
@@ -54,11 +54,11 @@
#include "sql_atom.h"
qc *
-qc_create(int clientid)
+qc_create(int clientid, int seqnr)
{
qc *r = NEW(qc);
r->clientid = clientid;
- r->id = 0;
+ r->id = seqnr;
r->nr = 0;
r->q = NULL;
diff --git a/sql/server/sql_qc.h b/sql/server/sql_qc.h
--- a/sql/server/sql_qc.h
+++ b/sql/server/sql_qc.h
@@ -48,7 +48,7 @@ typedef struct qc {
cq *q;
} qc;
-extern qc *qc_create(int clientid);
+extern qc *qc_create(int clientid, int seqnr);
extern void qc_destroy(qc *cache);
extern void qc_clean(qc *cache);
extern cq *qc_find(qc *cache, int id);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list