]> andersk Git - moira.git/commitdiff
detect deadlock errors
authormar <mar>
Thu, 19 Aug 1993 15:05:22 +0000 (15:05 +0000)
committermar <mar>
Thu, 19 Aug 1993 15:05:22 +0000 (15:05 +0000)
regtape/students.dc

index d0a69cadc73e12278cb028d64958bd083b440616..80462c781370628ca552c4ddd08fbcea566aad11 100644 (file)
@@ -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);
 }
This page took 0.167449 seconds and 5 git commands to generate.