[Pgpool-hackers] Problems with PgPool 2.3.3 Prepare/Deallocation handling in Master/Slave mode

Tatsuo Ishii ishii at sraoss.co.jp
Mon May 31 04:08:54 UTC 2010


Thanks. I will look into this.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp

> Hi,
> 
> we experienced problems with PgPool 2.3.3 and the Prepare Deallocation 
> handling in Master/Slave mode:
> 
> statement: DEALLOCATE pdo_pgsql_stmt_00e01cf0
> statement: BEGIN
> statement: DEALLOCATE pdo_pgsql_stmt_00e01cf0
> SimpleQuery: Error or notice message from backend: : DB node id: 1 
> statement: DEALLOCATE pdo_pgsql_stmt_00e01cf0 message: prepared 
> statement "pdo_pgsql_stmt_00e01cf0" does not exist
> SimpleQuery: Error or notice message from backend: : DB node id: 2 
> statement: DEALLOCATE pdo_pgsql_stmt_00e01cf0 message: prepared 
> statement "pdo_pgsql_stmt_00e01cf0" does not exist
> read_kind_from_backend: 0 th kind C does not match with master or 
> majority connection kind E
> kind mismatch among backends. Possible last query was: "DEALLOCATE 
> pdo_pgsql_stmt_00e01cf0" kind details are: 0[C] 1[E: prepared statement 
> "pdo_pgsql_stmt_00e01cf0" does not exist][SELECT NEXTVAL('xxx')] 2[E: 
> prepared statement "pdo_pgsql_stmt_00e01cf0" does not exist][SELECT 
> NEXTVAL('xxx')]
> do_child: exits with status 1 due to error
> 
> 
> Some notices: First we issue a prepared SELECT NEXTVAL in a transaction. 
> This is only send to the master. Later we try to deallocate the prepared 
> statement. This works on the master, but fails on the slaves. Seems to 
> be a logic flaw.
> 
> I wrote a little patch to fix this:
> 
> --- pgpool-II-2.3.3/pool_process_query.c	2010-04-16 07:44:56.000000000 +0000
> +++ pgpool-II-2.3.3-patched/pool_process_query.c	2010-05-28 
> 18:45:16.000000000 +0000
> @@ -3522,6 +3522,18 @@
>   				kind = 'E';
>   #endif
> 
> +
> +            // In some cases a PrepareStmt may only happen on master 
> node in MASTER/SLAVE mode.
> +            // DeallocateStmt will fail in that cases at slave nodes. 
> We just ignore that here.
> +			if ( master_slave_was_enabled && kind == 'E' && !IS_MASTER_NODE_ID(i) &&
> +				pending_function && pending_prepared_portal &&
> +				IsA(pending_prepared_portal->stmt, DeallocateStmt)) {
> +
> +    			pool_debug("Fixed DeallocateStmt error on backend:%d kind:%c 
> pending_function:%x pending_prepared_portal:%x",
> +			        i, kind, pending_function, pending_prepared_portal);
> +				kind = 'C';
> +            }
> +
>   			kind_list[i] = kind;
> 
>   			pool_debug("read_kind_from_backend: read kind from %d th backend %c 
> NUM_BACKENDS: %d", i, kind_list[i], NUM_BACKENDS);
> 
> 
> May be you can commit that to trunk.
> 
> 
> Regards,
> Jan
> _______________________________________________
> Pgpool-hackers mailing list
> Pgpool-hackers at pgfoundry.org
> http://pgfoundry.org/mailman/listinfo/pgpool-hackers


More information about the Pgpool-hackers mailing list