pgpool2.git / summary / log / commit / refs

commit    84ec03df6654f5cbff7c41848fb271a8075894bc
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Mon Oct 19 23:22:14 2015 +0000

    Fix in memory query in streaming replication mode and extended protocol case.
    
    In streaming replication mode and extended query case, before
    returning cached results, we need to read and forward any pending
    responses such as parse complete and bind complete etc. For this
    purpose we send flush message and retrieve the packets and forward to
    frontend. The logic was there, but it was broken.


src/query_cache/pool_memqcache.c | 42 +++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/query_cache/pool_memqcache.c b/src/query_cache/pool_memqcache.c index 6e9ecf7e9..8e8505ac7 100644 --- a/src/query_cache/pool_memqcache.c +++ b/src/query_cache/pool_memqcache.c @@ -3939,6 +3939,7 @@ void forward_pending_data(POOL_CONNECTION *frontend, POOL_CONNECTION *backend) { ereport(DEBUG1, (errmsg("forward_pending_data: no peding data"))); + return; } /* Send flush messsage to backend to retrieve response of backend */ @@ -3951,43 +3952,40 @@ void forward_pending_data(POOL_CONNECTION *frontend, POOL_CONNECTION *backend) */ for(;;) { - /* check if there's any pending data */ - if (!pool_ssl_pending(backend) && pool_read_buffer_is_empty(backend)) - { - pool_set_timeout(0); - if (pool_check_fd(backend) != 0) - { - ereport(DEBUG1, - (errmsg("forward_pending_data: no pending data"))); - pool_set_timeout(-1); - break; - } - } - - pool_set_timeout(-1); - pool_read(backend, &kind, 1); ereport(DEBUG1, (errmsg("forward_pending_data: forwarding kind: '%c'", kind))); pool_write(frontend, &kind, 1); - ereport(DEBUG1, - (errmsg("forward_pending_data: reading len"))); pool_read(backend, &len, sizeof(len)); ereport(DEBUG1, - (errmsg("forward_pending_data: finished reading len:%d", ntohl(len)))); - pool_write(frontend, &kind, 1); + (errmsg("forward_pending_data: forwarding len: '%d'", ntohl(len)))); + pool_write(frontend, &len, sizeof(len)); len = ntohl(len); if ((len - sizeof(len)) > 0) { len -= sizeof(len); ereport(DEBUG1, - (errmsg("forward_pending_data: saving message len:%d", len))); - + (errmsg("forward_pending_data: fowarding rest of packet. len:%d", len))); buf = palloc(len); pool_read(backend, buf, len); - pool_write(frontend, &kind, 1); + pool_write(frontend, buf, len); + } + + /* check if there's any pending data */ + if (!pool_ssl_pending(backend) && pool_read_buffer_is_empty(backend)) + { + pool_set_timeout(0); + if (pool_check_fd(backend) != 0) + { + ereport(DEBUG1, + (errmsg("forward_pending_data: select shows no pending data"))); + pool_set_timeout(-1); + break; + } + pool_set_timeout(-1); } } + pool_flush(frontend); } [parent: 65d5df235dd8]