summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2011-04-19 20:22:08 +0000
committerMarko Kreen2011-04-19 20:22:08 +0000
commit026f67b5861fa5844ef0e05ccea6d4d5356e57f5 (patch)
treebfd06369eb502c38119ae81f5a628840df23422a
parent366d52bcf84df1e2519403de6b169f7bfc36e296 (diff)
pgq.insert_event: Fix rare crash
If hash_search(HASH_ENTER) succeeds, but make_plan() fails, due to statement_timeout/deadlock, then HTAB entry will contain invalid values which leads to crash on next call. Fix it by always fully initializing struct before calling make_plan(). Debugged-by: Martin Pihlak
-rw-r--r--sql/pgq/lowlevel/insert_event.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sql/pgq/lowlevel/insert_event.c b/sql/pgq/lowlevel/insert_event.c
index 7cb0154e..f63890d8 100644
--- a/sql/pgq/lowlevel/insert_event.c
+++ b/sql/pgq/lowlevel/insert_event.c
@@ -166,13 +166,17 @@ static void *load_insert_plan(Datum qname, struct QueueState *state)
entry = hash_search(insert_cache, &queue_id, HASH_ENTER, &did_exist);
if (did_exist) {
- if (state->cur_table == entry->cur_table)
+ if (entry->plan && state->cur_table == entry->cur_table)
goto valid_table;
- SPI_freeplan(entry->plan);
- } else {
- entry->last_xid = 0;
+ if (entry->plan)
+ SPI_freeplan(entry->plan);
}
+
entry->cur_table = state->cur_table;
+ entry->last_xid = 0;
+ entry->plan = NULL;
+
+ /* this can fail, struct must be valid before */
entry->plan = make_plan(state);
valid_table: