[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 メーリングリストの案内