[pgpool-general-jp: 1119] Re: replication_mode+parallel_mode でエラー
Tatsuo Ishii
ishii @ sraoss.co.jp
2012年 11月 14日 (水) 17:26:31 JST
こんにちは。石井です。
お返事が遅くなり申し訳ありません。
パッチの有無に関わらず、現象が発生することを確認しました。
残念ながらパラレルクエリ周りはあまり見切れてなくて、今のところちょっと
わかりません。
# コードもコメントが少なくて難読状態:-)
解析を手伝ってくれる方がいたら歓迎します。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
> こんにちは、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 mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
pgpool-general-jp メーリングリストの案内