Add new pending message type 'Sync'.
authorTatsuo Ishii <[email protected]>
Mon, 27 Feb 2017 04:23:21 +0000 (13:23 +0900)
committerTatsuo Ishii <[email protected]>
Wed, 29 Mar 2017 04:15:55 +0000 (13:15 +0900)
This is used upon receiving a sync message from client.  The pending
message created here is a fake one, just let read_kind_from_backend to
unset in progress flag, so that it reads from all healthy backends,
because the sync message is always forwarded to all health backends.

src/context/pool_session_context.c
src/include/context/pool_session_context.h
src/protocol/pool_process_query.c
src/protocol/pool_proto_modules.c

index daa1346315c33f0d86067e6409ed995b27ff6fbe..22ca6d0761b4c4f8c6290082b8df0edef719d3aa 100644 (file)
@@ -1150,14 +1150,24 @@ POOL_PENDING_MESSAGE *pool_pending_messages_create(char kind, int len, char *con
                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';
@@ -1245,6 +1255,9 @@ void pool_pending_message_add(POOL_PENDING_MESSAGE* message)
                                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)));
@@ -1252,10 +1265,14 @@ void pool_pending_message_add(POOL_PENDING_MESSAGE* message)
                        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);
index 3300addc96099b24e9b13e4e6540d127da7cfa24..cc8d924c1a912fca8b64075ae82791b5ffff1667 100644 (file)
@@ -113,7 +113,8 @@ typedef enum {
        POOL_BIND,
        POOL_EXECUTE,
        POOL_DESCRIBE,
-       POOL_CLOSE
+       POOL_CLOSE,
+       POOL_SYNC
 } POOL_MESSAGE_TYPE;
 
 typedef struct {
index 0a1f75694141d3d40dffd48183efa5d5b55a9c39..aac4a672c7d4da15f9ff54e85738550602eb2c17 100644 (file)
@@ -3265,12 +3265,22 @@ void read_kind_from_backend(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *bac
                }
                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();
+                       }
                }
        }
 
index fcbb040d96cf30de04b52a33a63dc3fe2a502e77..122fc0114482c1603efc265ced9d79e30d274bd6 100644 (file)
@@ -2526,7 +2526,13 @@ POOL_STATUS ProcessFrontendResponse(POOL_CONNECTION *frontend,
                                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);