[pgpool-general-jp: 1108] replication_mode+parallel_mode でエラー

sho sho @ big.or.jp
2012年 10月 18日 (木) 13:45:26 JST


こんにちは、sho ともうします。

replication_mode と parallel_mode の同時利用を試していた所、
次のようなエラーが出ます。

testdb=> select * from rep_tbl left outer join para_tbl using(id);
ERROR:  pgpool2 sql restriction(notice from dblink)
DETAIL:   SELECT "pool_c$0"  AS id,"pool_c$1"  AS name,"pool_c$2"  AS id,"pool_c$3"  AS name FROM dblink('host=host01 dbname=testdb port=7999 user=test password=test','SELECT pool_loadbalance("SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl")',false) AS rep

内部関数の pool_loadbalance が処理されず、そのまま node DB へSQLが投げられている
ようです。

以上、よろしくお願いします。
(あ、別件でパッチ当ててるので、最後に載せときます)

-- 構成
pgpool-II 3.2.1
postgresql 9.1.6 : node 2 台

-- pgpool.conf 抜粋
replication_mode = on
replicate_select = off
load_balance_mode = off
master_slave_mode = off
parallel_mode = on
memory_cache_enabled = on

-- systemdb
CREATE OR REPLACE FUNCTION pgpool_catalog.node2(anyelement)
RETURNS integer AS $$
    SELECT $1 % 2;
$$ LANGUAGE sql;

INSERT INTO pgpool_catalog.dist_def VALUES (
    'testdb','public',
    'para_tbl',
    'id',
    ARRAY['id','name'],
    ARRAY['int4','varchar'],
    'pgpool_catalog.node2'
);

INSERT INTO pgpool_catalog.replicate_def VALUES (
    'testdb','public',
    'rep_tbl',
    ARRAY['id','name'],
    ARRAY['int4','varchar']
);

-- sample data
testdb=> create table para_tbl (id int4, name text);
testdb=> create table rep_tbl (id int4, name text);
testdb=> insert into para_tbl (id,name) VALUES (1,'para 1');
testdb=> insert into para_tbl (id,name) VALUES (2,'para 2');
testdb=> insert into para_tbl (id,name) VALUES (10,'para 10');
testdb=> insert into rep_tbl (id,name) VALUES (1,'rep 1');
testdb=> insert into rep_tbl (id,name) VALUES (2,'rep 2');
testdb=> insert into rep_tbl (id,name) VALUES (20,'rep 20');

-- test SQL
OK: select * from rep_tbl inner join para_tbl using(id);
OK: select * from para_tbl inner join rep_tbl using(id);
OK: select * from para_tbl left outer join rep_tbl using(id);

NG: select * from rep_tbl left outer join para_tbl using(id);

-- log 
2012-10-18 13:36:07 DEBUG: pid 24424: OneNode_do_command: Query:  SELECT "pool_c$0"  AS id,"pool_c$1"  AS name,"pool_c$2"  AS id,"pool_c$3"  AS name FROM dblink('host=host01 dbname=testdb port=7999 user=
test password=test','SELECT pool_loadbalance("SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl")',false) AS rep_tbl("pool_c$0" int4,"pool_c$1" varchar) LEFT OUTER JOIN dblink('host=host01 dbname=testdb por
t=7999 user=test password=test','SELECT pool_parallel("SELECT para_tbl.id, para_tbl.name FROM para_tbl")',false) AS para_tbl("pool_c$2" int4,"pool_c$3" varchar) ON "pool_c$0" = "pool_c$2"
(略)
2012-10-18 13:36:07 DEBUG: pid 24423: pool_set_query_in_progress: done
2012-10-18 13:36:07 DEBUG: pid 24423: can loadbalance_mode x SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl
2012-10-18 13:36:07 DEBUG: pid 24423: pool_do_parallel_query: load balancing query: SELECT pool_loadbalance("SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl")
2012-10-18 13:36:07 DEBUG: pid 24423: pool_has_insertinto_or_locking_clause: returns 0
2012-10-18 13:36:07 DEBUG: pid 24423: non_immutable_function_call_walker: function name: pool_loadbalance
2012-10-18 13:36:07 DEBUG: pid 24423: is_immutable_function: relcache created
2012-10-18 13:36:07 LOG:   pid 24423: DB node id: 0 backend pid: 13452 statement: SELECT count(*) FROM pg_catalog.pg_proc AS p WHERE p.proname = 'pool_loadbalance' AND p.provolatile = 'i'
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: extended:0 query:SELECT count(*) FROM pg_catalog.pg_proc AS p WHERE p.proname = 'pool_loadbalance' AND p.provolatile = 'i'
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: kind: T
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: row description received
2012-10-18 13:36:07 DEBUG: pid 24423: num_fileds: 1
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: kind: D
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: data row received
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: kind: C
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: Command complete received
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: kind: Z
2012-10-18 13:36:07 DEBUG: pid 24423: do_query: Ready for query
2012-10-18 13:36:07 DEBUG: pid 24423: is_immutable_function: search result:0
2012-10-18 13:36:07 DEBUG: pid 24423: pool_has_non_immutable_function_call: 1
2012-10-18 13:36:07 DEBUG: pid 24423: function_call_walker: function name: pool_loadbalance
2012-10-18 13:36:07 DEBUG: pid 24423: pattern_compare: black_function_list (^nextval$) not matched: pool_loadbalance
2012-10-18 13:36:07 DEBUG: pid 24423: pattern_compare: black_function_list (^setval$) not matched: pool_loadbalance
2012-10-18 13:36:07 LOG:   pid 24423: DB node id: 0 backend pid: 13452 statement: SELECT pool_loadbalance("SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl")
2012-10-18 13:36:07 DEBUG: pid 24423: wait_for_query_response: waiting for backend 0 completing the query
2012-10-18 13:36:07 LOG:   pid 24423: pool_send_and_wait: Error or notice message from backend: : DB node id: 0 backend pid: 13452 statement: SELECT pool_loadbalance("SELECT rep_tbl.id, rep_tbl.name FROM rep_tb
l") message: column "SELECT rep_tbl.id, rep_tbl.name FROM rep_tbl" does not exist

-- patch
*** pool_rewrite_outfuncs.c.orig        2012-04-11 17:32:02.000000000 +0900
--- pool_rewrite_outfuncs.c     2012-10-15 10:34:58.000000000 +0900
***************
*** 2943,2948 ****
--- 2943,2950 ----
                                {
                                        //delay_string_append_char(message, str, analyze->virtual->table_list[i]);
                                        //delay_string_append_char(message, str, "ooo.");
+                                       delay_string_append_char(message, str, analyze->virtual->table_list[i]);
+                                       delay_string_append_char(message, str, ".");
                                        if(strcmp(col_name,"\"?column?\""))
                                                delay_string_append_char(message, str, col_name);
                                        else


-- sho


pgpool-general-jp メーリングリストの案内