From e204830545e686dc6a0ec04de9922f9c717a5ce2 Mon Sep 17 00:00:00 2001 From: mar Date: Thu, 19 Aug 1993 15:05:22 +0000 Subject: [PATCH] detect deadlock errors --- regtape/students.dc | 62 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/regtape/students.dc b/regtape/students.dc index d0a69cad..80462c78 100644 --- a/regtape/students.dc +++ b/regtape/students.dc @@ -77,8 +77,9 @@ struct entry { char *whoami; int newfinger = 0; -#define sqlfail() (sqlca.sqlcode && sqlca.sqlcode != 100) #define SQL_DUPLICATE -40100 +#define SQL_DEADLOCK -49900 +#define sqlfail() (sqlca.sqlcode && sqlca.sqlcode != 100) main(argc, argv) int argc; @@ -124,11 +125,17 @@ char **argv; } while (e = get_next_entry(in)) { + again: process_entry(e); EXEC SQL COMMIT WORK; if (sqlca.sqlcode != 0) { - com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); - exit(1); + if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "commiting work"); + goto again; + } else { + com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); + exit(1); + } } if (wait) { printf("Next"); @@ -277,6 +284,10 @@ struct entry *e; if (sqlca.sqlcode == SQL_DUPLICATE) { com_err(whoami, 0, "duplicate ID number %s on user %s %s", sid, first, last); return; + } else if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "looking up user %s", sid); + EXEC SQL ROLLBACK; + return process_entry(e); } else sqlexit(); } @@ -285,7 +296,14 @@ struct entry *e; INTO :id, :dfirst, :dlast, :dmiddle, :class, :haddr, :hphone, :ophone, :status, :dept FROM users WHERE last = :last and first = :first and clearid = :eid; - if (sqlfail() && sqlca.sqlcode != SQL_DUPLICATE) sqlexit(); + if (sqlfail()) { + if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "looking up user %s", sid); + EXEC SQL ROLLBACK; + return process_entry(e); + } else if (sqlca.sqlcode != SQL_DUPLICATE) + sqlexit(); + } encrypted++; if (id == 0) { newuser(e); @@ -458,8 +476,14 @@ struct entry *e; xmodtime = date('now'), clearid = :sid WHERE users_id = :id; if (sqlca.sqlcode != 0) { - com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); - exit(1); + if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "updating user %s", sid); + EXEC SQL ROLLBACK; + return process_entry(e); + } else { + com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); + exit(1); + } } } else { EXEC SQL REPEATED UPDATE users @@ -468,8 +492,14 @@ struct entry *e; xmodtime = date('now'), clearid = :sid WHERE users_id = :id; if (sqlca.sqlcode != 0) { - com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); - exit(1); + if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "updating user %s", sid); + EXEC SQL ROLLBACK; + return process_entry(e); + } else { + com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); + exit(1); + } } } } @@ -570,8 +600,14 @@ struct entry *e; :ophone, :dept, 'now', :who, :prog, 'NONE', :name, :dept, :title, :raddr, :hphone, :ophone, date('now')); if (sqlca.sqlcode != 0) { - com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); - exit(1); + if (sqlca.sqlcode == SQL_DEADLOCK) { + com_err(whoami, MR_DEADLOCK, "adding user %s", sid); + EXEC SQL ROLLBACK; + return newuser(e); + } else { + com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); + exit(1); + } } else com_err(whoami, 0, "adding user %s %s", e->first, e->last); } @@ -670,7 +706,11 @@ set_next_uid(limit) sqlexit() { - com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); + if (sqlca.sqlcode == SQL_DEADLOCK) + com_err(whoami, MR_DEADLOCK, "unrecoverable ingres error %d", + sqlca.sqlcode); + else + com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); EXEC SQL ROLLBACK WORK; exit(1); } -- 2.45.2