msg->type = POOL_CLOSE;
break;
+ case 'S':
+ msg->type = POOL_SYNC;
+ break;
+
default:
ereport(ERROR,
(errmsg("pool_pending_message_create: unknow kind: %c", kind)));
break;
}
- msg->contents = palloc(len);
- memcpy(msg->contents, contents, len);
+ if (len > 0)
+ {
+ msg->contents = palloc(len);
+ memcpy(msg->contents, contents, len);
+ }
+ else
+ msg->contents = NULL;
+
msg->contents_len = len;
msg->query[0] = '\0';
msg->statement[0] = '\0';
StrNCpy(message->portal, message->contents+1, sizeof(message->portal));
break;
+ case POOL_SYNC:
+ break;
+
default:
ereport(ERROR,
(errmsg("pool_pending_message_add: unknown message type:%d", message->type)));
break;
}
- ereport(LOG,
- (errmsg("pool_pending_message_add: message type:%d message len:%d query:%s statement:%s portal:%s node_ids[0]:%d node_ids[1]:%d",
- message->type, message->contents_len, message->query, message->statement, message->portal,
- message->node_ids[0], message->node_ids[1])));
+ if (message->type != POOL_SYNC)
+ ereport(LOG,
+ (errmsg("pool_pending_message_add: message type:%d message len:%d query:%s statement:%s portal:%s node_ids[0]:%d node_ids[1]:%d",
+ message->type, message->contents_len, message->query, message->statement, message->portal,
+ message->node_ids[0], message->node_ids[1])));
+ else
+ ereport(LOG,
+ (errmsg("pool_pending_message_add: message type: sync")));
old_context = MemoryContextSwitchTo(session_context->memory_context);
msg = copy_pending_message(message);
}
else
{
- ereport(LOG,
- (errmsg("read_kind_from_backend: pending message exists. query context: %x",
- msg->query_context)));
- pool_pending_message_set_previous_message(msg);
- session_context->query_context = msg->query_context;
- pool_set_query_in_progress();
+ if (msg->type == POOL_SYNC)
+ {
+ ereport(LOG,
+ (errmsg("read_kind_from_backend: sync pending message exists")));
+ session_context->query_context = NULL;
+ pool_unset_query_in_progress();
+ }
+ else
+ {
+ ereport(LOG,
+ (errmsg("read_kind_from_backend: pending message exists. query context: %x",
+ msg->query_context)));
+ pool_pending_message_set_previous_message(msg);
+ session_context->query_context = msg->query_context;
+ pool_set_query_in_progress();
+ }
}
}
pool_unset_ignore_till_sync();
if (STREAM)
+ {
+ POOL_PENDING_MESSAGE *msg;
+
pool_unset_query_in_progress();
+ msg = pool_pending_messages_create('S', 0, NULL);
+ pool_pending_message_add(msg);
+ }
else if (!pool_is_query_in_progress())
pool_set_query_in_progress();
status = SimpleForwardToBackend(fkind, frontend, backend, len, contents);