Skip to content

Commit

Permalink
Rearrange detect_deadlock_error().
Browse files Browse the repository at this point in the history
  • Loading branch information
y-asaba committed Jul 17, 2007
1 parent ab2c984 commit db555a0
Showing 1 changed file with 36 additions and 23 deletions.
59 changes: 36 additions & 23 deletions pool_process_query.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* -*-pgsql-c-*- */
/*
* $Header: /cvsroot/pgpool/pgpool-II/pool_process_query.c,v 1.30 2007/07/10 09:56:07 y-asaba Exp $
* $Header: /cvsroot/pgpool/pgpool-II/pool_process_query.c,v 1.31 2007/07/17 02:33:08 y-asaba Exp $
*
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
Expand Down Expand Up @@ -68,7 +68,6 @@ typedef struct {
} PreparedStatementList;



static POOL_STATUS NotificationResponse(POOL_CONNECTION *frontend,
POOL_CONNECTION_POOL *backend);

Expand Down Expand Up @@ -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);


Expand Down Expand Up @@ -4789,89 +4789,102 @@ 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;
char *p, *str;

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));
p += sizeof(len);

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;
}

0 comments on commit db555a0

Please sign in to comment.