pgpool2.git / summary / log / commit / refs
commit e00762684dc045b67a07b5c76ee6b5c138a0a0b6
Author: Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date: Tue Jul 17 02:33:08 2007 +0000
Rearrange detect_deadlock_error().
pool_process_query.c | 57 ++++++++++++++++++++++++++++++++--------------------
1 file changed, 35 insertions(+), 22 deletions(-)
diff --git a/pool_process_query.c b/pool_process_query.c
index 3ae00add8..b3d744d58 100644
--- a/pool_process_query.c
+++ b/pool_process_query.c
@@ -68,7 +68,6 @@ typedef struct {
} PreparedStatementList;
-
static POOL_STATUS NotificationResponse(POOL_CONNECTION *frontend,
POOL_CONNECTION_POOL *backend);
@@ -197,6 +196,7 @@ static void query_cache_register(char kind, POOL_CONNECTION *frontend, char *dat
static POOL_STATUS start_internal_transaction(POOL_CONNECTION_POOL *backend, Node *node);
static POOL_STATUS end_internal_transaction(POOL_CONNECTION_POOL *backend);
static int extract_ntuples(char *message);
+static int detect_error(POOL_CONNECTION *master, char *error_code, int major);
static int detect_deadlock_error(POOL_CONNECTION *master, int major);
@@ -4789,7 +4789,18 @@ static int extract_ntuples(char *message)
static int detect_deadlock_error(POOL_CONNECTION *master, int major)
{
- int deadlock = 0;
+ int r = detect_error(master, DEADLOCK_ERROR_CODE, major);
+ if (r == 1)
+ pool_debug("detect_deadlock_error: receive deadlock error from master node.");
+ return r;
+}
+
+/*
+ * detect_error: Detect specified error from error code.
+ */
+static int detect_error(POOL_CONNECTION *backend, char *error_code, int major)
+{
+ int is_error = 0;
char kind;
int readlen = 0, len;
char *buf;
@@ -4797,26 +4808,25 @@ static int detect_deadlock_error(POOL_CONNECTION *master, int major)
if ((buf = malloc(1024)) == NULL)
{
- pool_error("detect_deadlock_error: malloc failed");
+ pool_error("detect_error: malloc failed");
return -1;
}
- if (pool_read(master, &kind, sizeof(kind)))
+ if (pool_read(backend, &kind, sizeof(kind)))
return POOL_END;
readlen += sizeof(kind);
p = buf;
memcpy(p, &kind, sizeof(kind));
p += sizeof(kind);
- if (kind == 'E') /* deadlock error? */
+ if (kind == 'E') /* ErrorResponseMessage? */
{
- pool_debug("error");
/* read actual query */
if (major == PROTO_MAJOR_V3)
{
- char *error_code;
+ char *e;
- if (pool_read(master, &len, sizeof(len)) < 0)
+ if (pool_read(backend, &len, sizeof(len)) < 0)
return POOL_END;
readlen += sizeof(len);
memcpy(p, &len, sizeof(len));
@@ -4824,54 +4834,57 @@ static int detect_deadlock_error(POOL_CONNECTION *master, int major)
len = ntohl(len) - 4;
str = malloc(len);
- pool_read(master, str, len);
+ pool_read(backend, str, len);
readlen += len;
if (readlen > 1024)
{
buf = realloc(buf, readlen);
if (buf == NULL)
{
- pool_error("detect_deadlock_error: malloc failed");
+ pool_error("detect_error: malloc failed");
return -1;
}
}
memcpy(p, str, len);
- error_code = str;
- while (*error_code)
+ /*
+ * Checks error code which it is formatted 'Cxxxxxx'
+ * (xxxxxx is error code).
+ */
+ e = str;
+ while (*e)
{
- if (*error_code == 'C')
+ if (*e == 'C')
{
- if (strcmp(error_code+1, DEADLOCK_ERROR_CODE) == 0) /* deadlock error */
+ if (strcmp(e+1, error_code) == 0) /* specified error? */
{
- pool_debug("SimpleQuery: receive deadlock error from master node.");
- deadlock = 1;
+ is_error = 1;
}
break;
}
else
- error_code = error_code + strlen(error_code) + 1;
+ e = e + strlen(e) + 1;
}
free(str);
}
else
{
- str = pool_read_string(master, &len, 0);
+ str = pool_read_string(backend, &len, 0);
readlen += len;
if (readlen > 1024)
{
buf = realloc(buf, readlen);
if (buf == NULL)
{
- pool_error("detect_deadlock_error: malloc failed");
+ pool_error("detect_error: malloc failed");
return -1;
}
}
memcpy(p, str, len);
}
}
- if (pool_unread(master, buf, readlen) != 0)
- deadlock = -1;
+ if (pool_unread(backend, buf, readlen) != 0)
+ is_error = -1;
free(buf);
- return deadlock;
+ return is_error;
}
[parent: 3c2962000e69]