[pgpool-general-jp: 139] Re: DBIx::Class::Schemaから接続した場合に、縮退モードに入らない

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2007年 5月 28日 (月) 10:51:40 JST


浅羽です。

From: hoshiba hisanari <hoshiba @ jp.fujitsu.com>
Subject: [pgpool-general-jp: 137] Re: DBIx::Class::Schemaから接続した場合に、縮退モードに入らない
Date: Sat, 26 May 2007 15:22:17 +0900

> ■発生条件
>  トランザクション内で、prepareを用いたselectで不整合を検出した場合は
>  縮退運転に入らない

ご報告ありがとうございます。確認したところ確かに prepare を使った場合
フェイルオーバしませんでした。修正しましたのでパッチを添付します(3.3
に対するパッチです)。

なお、

http://www.sraoss.jp/pipermail/pgpool-general-jp/2007-April/000115.html

にある通り、3.3 からは参照系のクエリはレプリケーションしないようにしま
したので、データ不整合はチェックしないようになっております。更新系のク
エリのみチェックするようにしています。

--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp
-------------- next part --------------
Index: pool_auth.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool/pool_auth.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -c -r1.11 -r1.12
*** pool_auth.c	4 Jan 2007 17:01:36 -0000	1.11
--- pool_auth.c	28 May 2007 01:26:12 -0000	1.12
***************
*** 1,6 ****
  /* -*-pgsql-c-*- */
  /*
!  * $Header: /cvsroot/pgpool/pgpool/pool_auth.c,v 1.11 2007/01/04 17:01:36 devrim Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
--- 1,6 ----
  /* -*-pgsql-c-*- */
  /*
!  * $Header: /cvsroot/pgpool/pgpool/pool_auth.c,v 1.12 2007/05/28 01:26:12 y-asaba Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
***************
*** 1019,1024 ****
--- 1019,1028 ----
  	return &length_array[0];
  }
  
+ /*
+  * return: -2 if kind does not match.
+  *         -1 if an error occured.
+  */
  signed char pool_read_kind(POOL_CONNECTION_POOL *cp)
  {
  	int status;
***************
*** 1044,1050 ****
  		{
  			pool_error("read_kind: kind does not match between backends master(%d) secondary(%d)",
  					   kind, kind1);
! 			return -1;
  		}
  	}
  
--- 1048,1054 ----
  		{
  			pool_error("read_kind: kind does not match between backends master(%d) secondary(%d)",
  					   kind, kind1);
! 			return -2;
  		}
  	}
  
Index: pool_process_query.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool/pool_process_query.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -c -r1.47 -r1.48
*** pool_process_query.c	22 May 2007 06:27:13 -0000	1.47
--- pool_process_query.c	28 May 2007 01:26:12 -0000	1.48
***************
*** 1,6 ****
  /* -*-pgsql-c-*- */
  /*
!  * $Header: /cvsroot/pgpool/pgpool/pool_process_query.c,v 1.47 2007/05/22 06:27:13 y-asaba Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
--- 1,6 ----
  /* -*-pgsql-c-*- */
  /*
!  * $Header: /cvsroot/pgpool/pgpool/pool_process_query.c,v 1.48 2007/05/28 01:26:12 y-asaba Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
***************
*** 136,141 ****
--- 136,142 ----
  static PreparedStatement *lookup_prepared_statement_by_portal(PreparedStatementList *p, const char *name);
  static int send_deallocate(POOL_CONNECTION_POOL *backend, PreparedStatementList *p, int n);
  static char *normalize_prepared_stmt_name(const char *name);
+ static POOL_STATUS error_kind_mismatch(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, int kind, int kind1);
  
  static POOL_CONNECTION_POOL_SLOT *slots[MAX_CONNECTION_SLOTS];
  
***************
*** 321,351 ****
  					pool_read(SECONDARY(backend), &kind1, 1);
  					if (kind == '\0' || kind != kind1)
  					{
! 						int sts;
! 
! 						pool_error("pool_process_query: kind does not match between backends master(%c) secondary(%c)",
! 								   kind, kind1);
! 						pool_send_error_message(frontend, MAJOR(backend), "XX000", 
! 												"kind mismatch between backends", "",
! 												"check data consistency between master and secondary", __FILE__, __LINE__);
! 
! 						/* health check */
! 						sts = health_check();
! 						if (sts == -1)
! 						{
! 							notice_backend_error(1);
! 							exit(1);
! 						}
! 						else if (sts == -2)
! 						{
! 							notice_backend_error(0);
! 							exit(1);
! 						}
! 
! 						if (pool_config.replication_stop_on_mismatch)
! 							return POOL_FATAL;
! 						else
! 							return POOL_ERROR;
  					}
  				}
  				pool_debug("read kind from backend pending data %c len: %d po: %d", kind, MASTER(backend)->len, MASTER(backend)->po);
--- 322,328 ----
  					pool_read(SECONDARY(backend), &kind1, 1);
  					if (kind == '\0' || kind != kind1)
  					{
! 						return error_kind_mismatch(frontend, backend, kind, kind1);
  					}
  				}
  				pool_debug("read kind from backend pending data %c len: %d po: %d", kind, MASTER(backend)->len, MASTER(backend)->po);
***************
*** 406,436 ****
  
  			if (kind == '\0' || kind != kind1)
  			{
! 				int sts;
! 
! 				pool_error("pool_process_query: kind does not match between backends master(%c) secondary(%c)",
! 						   kind, kind1);
! 				pool_send_error_message(frontend, MAJOR(backend), "XX000", 
! 										"kind mismatch between backends", "",
! 										"check data consistency between master and secondary", __FILE__, __LINE__);
! 
! 				/* health check */
! 				sts = health_check();
! 				if (sts == -1)
! 				{
! 					notice_backend_error(1);
! 					exit(1);
! 				}
! 				else if (sts == -2)
! 				{
! 					notice_backend_error(0);
! 					exit(1);
! 				}
! 
! 				if (pool_config.replication_stop_on_mismatch)
! 					return POOL_FATAL;
! 				else
! 					return POOL_ERROR;
  			}
  		}
  
--- 383,389 ----
  
  			if (kind == '\0' || kind != kind1)
  			{
! 				return error_kind_mismatch(frontend, backend, kind, kind1);
  			}
  		}
  
***************
*** 911,917 ****
  	while ((kind = pool_read_kind(backend)),
  		   (kind != 'C' && kind != 'E' && kind != 'l' && kind != 's'))
  	{
! 		if (kind < 0)
  		{
  			pool_error("Execute: pool_read_kind error");
  			return POOL_ERROR;
--- 864,874 ----
  	while ((kind = pool_read_kind(backend)),
  		   (kind != 'C' && kind != 'E' && kind != 'l' && kind != 's'))
  	{
! 		if (kind == -2) /* kind mismatch */
! 		{
! 			return error_kind_mismatch(frontend, backend, 0, 0);
! 		}
! 		else if (kind < 0)
  		{
  			pool_error("Execute: pool_read_kind error");
  			return POOL_ERROR;
***************
*** 3835,3837 ****
--- 3792,3823 ----
  
  	set_ps_display(psbuf, false);
  }
+ 
+ static POOL_STATUS error_kind_mismatch(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, int kind, int kind1)
+ {
+ 	int sts;
+ 
+ 	pool_error("pool_process_query: kind does not match between backends master(%c) secondary(%c)",
+ 			   kind, kind1);
+ 	pool_send_error_message(frontend, MAJOR(backend), "XX000", 
+ 							"kind mismatch between backends", "",
+ 							"check data consistency between master and secondary", __FILE__, __LINE__);
+ 
+ 	/* health check */
+ 	sts = health_check();
+ 	if (sts == -1)
+ 	{
+ 		notice_backend_error(1);
+ 		exit(1);
+ 	}
+ 	else if (sts == -2)
+ 	{
+ 		notice_backend_error(0);
+ 		exit(1);
+ 	}
+ 	
+ 	if (pool_config.replication_stop_on_mismatch)
+ 		return POOL_FATAL;
+ 	else
+ 		return POOL_ERROR;
+ }


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