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];
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;
+ 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);
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;
+ return error_kind_mismatch(frontend, backend, kind, kind1);
}
}
while ((kind = pool_read_kind(backend)),
(kind != 'C' && kind != 'E' && kind != 'l' && kind != 's'))
{
- if (kind < 0)
+ 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;
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;
+}