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]