]> andersk Git - moira.git/commitdiff
Diane Delgado's changes for a fixed table-locking order LOCKING
authordanw <danw>
Sun, 29 Sep 1996 20:55:36 +0000 (20:55 +0000)
committerdanw <danw>
Sun, 29 Sep 1996 20:55:36 +0000 (20:55 +0000)
13 files changed:
db/schema
gen/aliases.dc
gen/ca.dc
gen/hesiod.dc
gen/hosts.dc
gen/mailhub.dc
gen/nfs.dc
gen/sis.dc
gen/stats.dc
gen/zephyr.dc
server/queries2.c
server/query.h
server/qvalidate.dc

index cb276f5ccf4d8e94a86ac333313c8c925f0c9dc3..238e4468826568c704ccd392539ad73a442d1855 100644 (file)
--- a/db/schema
+++ b/db/schema
@@ -47,7 +47,11 @@ create table users
 create table krbmap
 (
        users_id        INTEGER         NOT NULL WITH DEFAULT,
-       string_id       INTEGER         NOT NULL WITH DEFAULT
+       string_id       INTEGER         NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table machine
 (
@@ -77,7 +81,11 @@ create table machine
 create table hostalias
 (
        name            VARCHAR(40)     NOT NULL WITH DEFAULT,
-       mach_id         INTEGER         NOT NULL WITH DEFAULT
+       mach_id         INTEGER         NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table subnet
 (
@@ -108,13 +116,21 @@ create table cluster
 create table mcmap
 (
        mach_id         INTEGER         NOT NULL WITH DEFAULT,
-       clu_id          INTEGER         NOT NULL WITH DEFAULT
+       clu_id          INTEGER         NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table svc
 (
        clu_id          INTEGER         NOT NULL WITH DEFAULT,
        serv_label      VARCHAR(16)     NOT NULL WITH DEFAULT,
-       serv_cluster    CHAR(32)        NOT NULL WITH DEFAULT
+       serv_cluster    CHAR(32)        NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table list
 (
@@ -139,7 +155,11 @@ create table imembers
        member_type     CHAR(8)         NOT NULL WITH DEFAULT,
        member_id       INTEGER         NOT NULL WITH DEFAULT,
        ref_count       SMALLINT        NOT NULL WITH DEFAULT,
-       direct          SMALLINT        NOT NULL WITH DEFAULT
+       direct          SMALLINT        NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table servers 
 (
@@ -203,7 +223,11 @@ create table fsgroup
 (
        group_id        INTEGER         NOT NULL WITH DEFAULT,
        filsys_id       INTEGER         NOT NULL WITH DEFAULT,
-       key             CHAR(8)         NOT NULL WITH DEFAULT
+       key             CHAR(8)         NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table nfsphys 
 (
@@ -295,7 +319,11 @@ create table capacls
 (
        capability      CHAR(32)        NOT NULL WITH DEFAULT,
        tag             CHAR(4)         NOT NULL WITH DEFAULT,
-       list_id         INTEGER         NOT NULL WITH DEFAULT
+       list_id         INTEGER         NOT NULL WITH DEFAULT,
+       modtime         DATE            NOT NULL WITH DEFAULT,
+       modby           INTEGER         NOT NULL WITH DEFAULT,
+       modwith         CHAR(8)         NOT NULL WITH DEFAULT
+
 );
 create table alias 
 (
index a65cff59d31a345069a2708d1eb5dfb0810d8567..5fa8f8be667d74d97ef6ebb3316354c5d64bfa55 100644 (file)
@@ -139,15 +139,17 @@ get_info()
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
     /* get locks */
-    EXEC SQL SELECT modtime INTO :buf FROM list WHERE LIST_ID = 0;
+    EXEC SQL SELECT modtime INTO :buf FROM imembers WHERE list_id = 0;
     EXEC SQL SELECT modtime INTO :buf FROM users WHERE USERS_ID = 0;
+    EXEC SQL SELECT modtime INTO :buf FROM machine WHERE mach_id = 0;
+    EXEC SQL SELECT modtime INTO :buf FROM list WHERE LIST_ID = 0;
 
     fprintf(stderr, "Loading machines\n");
     machines = create_hash(1000);
 
     EXEC SQL DECLARE m_cursor CURSOR FOR 
       SELECT mach_id, name 
-      FROM machine
+      FROM machine WHERE mach_id != 0
       ORDER BY mach_id;
     EXEC SQL OPEN m_cursor;
     while (1) {
@@ -218,7 +220,7 @@ get_info()
 
     EXEC SQL DECLARE l_cursor CURSOR FOR
       SELECT list_id, name, maillist, description, acl_type, acl_id
-      FROM list WHERE active != 0
+      FROM list WHERE active != 0 AND list_id != 0
       ORDER BY list_id;
     EXEC SQL OPEN l_cursor;
     while (1) {
@@ -247,6 +249,8 @@ get_info()
     while (1) {
         EXEC SQL FETCH mem_cursor INTO :id, :type, :mid;
        if (sqlca.sqlcode != 0) break;
+        if (id == 0)
+            continue;
        if (l = (struct list *) hash_lookup(lists, id)) {
            m = (struct member *) malloc(sizeof(struct member));
            if (type[0] == 'U' &&
@@ -457,3 +461,6 @@ register char *string;
 
     (void) fputc('\n', aliases);
 }
+
+
+
index 5ff09983556132c2c01d6e59fa91fa748f4980f2..4bd97f32911e452c7173e0d005660fecf8821f57 100644 (file)
--- a/gen/ca.dc
+++ b/gen/ca.dc
@@ -77,6 +77,12 @@ char **argv;
     }
 
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
+
+    /* Get locks */
+    EXEC SQL SELECT modtime INTO :name FROM filesys WHERE filsys_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM users WHERE users_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM machine WHERE mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM nfsphys WHERE mach_id = 0;
     sq = sq_create();
 
     cnt = 0;
@@ -179,3 +185,5 @@ char **argv;
                   sqlca.sqlcode);
     exit(MR_INGRES_ERR);
 }
+
+
index d99b2f87c809fd71841fd9c8e7c0099fe2bee8d8..f83218b1b8cdcdcdf878e90cab527a526ce824ca 100644 (file)
@@ -122,7 +122,7 @@ get_mach()
     EXEC SQL DECLARE m_cursor CURSOR FOR
       SELECT name, mach_id
       FROM machine
-      WHERE status = 1
+      WHERE status = 1 and mach_id != 0
       ORDER BY mach_id;
     EXEC SQL OPEN m_cursor;
     while (1) {
@@ -309,8 +309,10 @@ do_groups()
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
     /* get lock records */
-    EXEC SQL SELECT modtime INTO :name FROM list WHERE list_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM imembers WHERE list_id = 0;
     EXEC SQL SELECT modtime INTO :name FROM users WHERE users_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM list WHERE list_id = 0;
+
 
     EXEC SQL DECLARE l_cursor CURSOR FOR
       SELECT name, gid, list_id
@@ -458,6 +460,11 @@ do_filsys()
     sq = sq_create();
     sq2 = sq_create();
 
+    /* get lock records */
+
+    EXEC SQL SELECT modtime INTO :name from filesys where filsys_id = 0;
+    EXEC SQL SELECT modtime INTO :name from fsgroup where filsys_id = 0;
+
     EXEC SQL DECLARE f_cursor CURSOR FOR
       SELECT label, type, name, mach_id, access, mount, comments, filsys_id
       FROM filesys
@@ -646,6 +653,12 @@ do_cluster()
     fprintf(stderr, "Building cluster.db\n");
     get_mach();
 
+    /* get lock records */
+    EXEC SQL SELECT modtime INTO :name  FROM machine where mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM cluster where clu_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM mcmap where mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name  FROM svc where clu_id = 0;
+
     EXEC SQL SELECT MAX(clu_id) INTO :maxclu FROM cluster;
     maxclu++;
     setsize = howmany(maxclu, NSETBITS);
@@ -1063,3 +1076,10 @@ do_service()
     db_error(sqlca.sqlcode);
     return(0);
 }
+
+
+
+
+
+
+
index 8119f6e3e99e3e9dae1a511b7bf8019cd0e7d616..46a76745d4bd4c302e23ebe3894574a4660c3f05 100644 (file)
@@ -68,6 +68,11 @@ char **argv;
 
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
+    /* Acquire the required locks in the appropriate order */
+
+    EXEC SQL SELECT modtime INTO :name FROM machine WHERE mach_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM hostalias WHERE mach_id = 0;
+
     gettimeofday(&now, NULL);
     
     fprintf(out, "; MIT Network Host Table\n;\n");
index 86987d2474cd776018653615657bfd18394769d8..74c70f49c178b90b523dced258d205f499a52aab 100644 (file)
@@ -155,6 +155,7 @@ get_info()
 
     /* Get Locks */
 
+    EXEC SQL SELECT modtime INTO :buf FROM imembers WHERE list_id = 0;
     EXEC SQL SELECT modtime INTO :buf FROM users WHERE users_id = 0;
     EXEC SQL SELECT modtime INTO :buf FROM list WHERE list_id = 0;
 
index 36683030be03a29c611fe521da156eef7afd75c4..8e9e0ddbf0f6f177b267c91b54dcf547e7864538 100644 (file)
@@ -88,6 +88,15 @@ int do_nfs()
     machs = sq_create();
     lists = sq_create();
 
+    /* Get Locks */
+    EXEC SQL SELECT modtime INTO :listname FROM imembers WHERE list_id = 0;
+    EXEC SQL SELECT modtime INTO :listname FROM filesys WHERE filsys_id = 0;
+    EXEC SQL SELECT modtime INTO :listname FROM users WHERE users_id = 0;
+    EXEC SQL SELECT modtime INTO :listname FROM machine where mach_id=0;
+    EXEC SQL SELECT modtime INTO :listname FROM list WHERE list_id = 0;
+    EXEC SQL SELECT serverhosts INTO :listname FROM machine where mach_id=0;
+
+
     /* The following is declarative, not executed,
      * and so is dependent on where it is in the file,
      * not in the order of execution of statements.
@@ -119,7 +128,10 @@ int do_nfs()
 
 
 /* Make all of the credentials lists that will be needed.  Returns 0 if
- * no files were actually changed */
+ * no files were actually changed 
+ *
+ * The caller is responsible for acquiring locks on imembers, users, list
+ */
 
 int do_lists(lists)
 struct save_queue *lists;
@@ -146,9 +158,6 @@ struct save_queue *lists;
     }
     */
 
-    /* get locks */
-    EXEC SQL SELECT modtime INTO :lname FROM list WHERE list_id = 0;
-    EXEC SQL SELECT modtime INTO :lname FROM users WHERE users_id = 0;
 
     /* build the list of everyone, and store it in a file whose name
      * corresponds to the empty list.
@@ -313,6 +322,8 @@ do_everyone()
 
 /* Now do each of the servers, linking the credentials list file and 
  * compiling the quota and dirs files.
+ *
+ * Caller is responsible for acquiring locks on machine, filesys, users
  */
 
 int do_machs(machs)
@@ -329,10 +340,6 @@ struct save_queue *machs;
 
     fprintf(stderr, "Building machine files\n");
 
-    /* acquire locks on machines & filesystems */
-    EXEC SQL SELECT modtime INTO :listname FROM users WHERE users_id = 0;
-    EXEC SQL SELECT modtime INTO :listname FROM machine WHERE mach_id = 0;
-    EXEC SQL SELECT modtime INTO :listname FROM filesys WHERE filsys_id = 0;
 
     machines = create_hash(100);
     while (sq_get_data(machs, &machname)) {
index 987612d91bb1703f1a37b38cebbe39042f1a8a15..938f073fad008438b2bbaa8bb241a5ff13507726 100644 (file)
@@ -88,6 +88,10 @@ char **argv;
      */
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
+    /* lock user table first */
+
+    EXEC SQL SELECT modtime INTO :id FROM users WHERE users_id = 0;
+
     EXEC SQL DECLARE x CURSOR FOR
       SELECT u.login, u.clearid, u.signature, u.sigdate, s.string
       FROM users u, strings s
index 0933aba1cd6d95b9ce69890d4c2ccbfcc261cde2..00b90ec9d351e1913fce46778808dc599a65306a 100644 (file)
@@ -74,8 +74,14 @@ char **argv;
      */
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
 
+    EXEC SQL SELECT modtime INTO :name FROM filesys  WHERE filsys_id = 0;
+    EXEC SQL SELECT modtime INTO :name FROM machine  WHERE mach_id = 0;
+
+
     machines = create_hash(1000);
 
+   
+
     EXEC SQL DECLARE m CURSOR FOR 
       SELECT mach_id, name 
        FROM machine;
@@ -121,7 +127,7 @@ char **argv;
     if (sqlca.sqlcode == 17700 || sqlca.sqlcode == -37000)
       exit(MR_DEADLOCK);
 #endsql
-    critical_alert("DCM", "Central America build encountered INGRES ERROR %d",
+    critical_alert("DCM", "Stats build encountered INGRES ERROR %d",
                   sqlca.sqlcode);
     exit(MR_INGRES_ERR);
 }
index e6fca3ee39598799da398d6c9fb64beaf2483916..75c6309a6b7ebaf73db3171dff82b1768964ef6c 100644 (file)
@@ -122,9 +122,15 @@ int do_classes()
      * not in the order of execution of statements.
      */
     EXEC SQL WHENEVER SQLERROR GOTO sqlerr;
+
+    /* Acquire locks for tables */
+    EXEC SQL SELECT modtime INTO :zclass FROM imembers WHERE list_id=0;
+    EXEC SQL SELECT modtime INTO :zclass FROM users  WHERE list_id = 0;
+    EXEC SQL SELECT modtime INTO :zclass FROM zephyr WHERE xmt_id = 0;
+
     EXEC SQL DECLARE classes CURSOR FOR SELECT class, xmt_type, xmt_id,
        sub_type, sub_id, iws_type, iws_id, iui_type, iui_id
-      FROM zephyr;
+      FROM zephyr WHERE xmt_id != 0;
     EXEC SQL OPEN classes;
     while (1) {
        EXEC SQL FETCH classes INTO
index cf0dcb14a730714d212c7f8e14cb250f17deaf30..5e0954add3b942a2b98b5e7b8e5ec444a0f58d39 100644 (file)
@@ -97,7 +97,6 @@ int count_members_of_list();
 int get_lists_of_member();
 int register_user();
 int _sdl_followup();
-int get_hostalias();
 
 
 \f
@@ -120,6 +119,7 @@ static char DIR[] = "dir";
 static char FILESYS[] = "filesys";
 static char FILSYS_ID[] = "filsys_id";
 static char FIRST[] = "firstname";
+static char HOSTACCESS[] = "hostaccess";
 static char LABEL[] = "label";
 static char LAST[] = "lastname";
 static char LIST[] = "list";
@@ -134,10 +134,12 @@ static char MOD1[] = "modtime";
 static char MOD2[] = "modby";
 static char MOD3[] = "modwith";
 static char NAME[] = "name";
+static char PRINTCAP[] = "printcap";
 static char QUOTA[] = "quota";
 static char QUOTA_TYPE[] = "quota_type";
 static char SECURE[] = "secure";
 static char SERVICE[] = "service";
+static char SERVERS[] = "servers";
 static char SHELL[] = "shell";
 static char SIGNATURE[] = "signature";
 static char SNET_ID[] = "snet_id";
@@ -147,7 +149,8 @@ static char TYPE[] = "type";
 static char USERS[] = "users";
 static char USERS_ID[] = "users_id";
 static char UID[] = "uid";
-
+static char ZEPH[] = "zephyr";
+static char ZEPH_ID[] = "xmt_id";
 
 
 /* VALOBJS
@@ -155,6 +158,14 @@ static char UID[] = "uid";
  * can be shared.
  */
 
+/*
+ * A word about validation objects and locking:  The validation object
+ * for a query should also request locks on behalf of the pre-processing
+ * and post-processing routines.  This helps to ensure that tables are
+ * accessed and locked in the proper order and thus avoids deadlock 
+ * situations
+ */
+
 static struct valobj VOsort0[] = {
   {V_SORT, 0},
 };
@@ -197,14 +208,12 @@ static struct valobj VOwild012sort0[] = {  /* get_alias */
   {V_SORT, 0},
 };
 
-static struct valobj VOdate1[] = {
-  {V_DATE, 1, 0, 0, 0, MR_DATE},
-};
 
 static struct valobj VOuser0[] = {
   {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
 };
 
+
 static struct valobj VOuser0lock[] = {
   {V_LOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
@@ -222,23 +231,12 @@ static struct valobj VOlist0[] = {
   {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST},
 };
 
-static struct valobj VOfilsys0[] = {
-  {V_ID, 0, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
-};
 
 static struct valobj VOchar0[] = {
   {V_CHAR, 0},
 };
 
-static struct valobj VOsort01[] = {
-  {V_SORT, 1},
-  {V_SORT, 0},
-};
 
-static struct valobj VOuser0sort[] = {
-  {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
-  {V_SORT, 0},
-};
 
 static struct valobj VOfilsys0user1[] = {
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
@@ -253,10 +251,8 @@ static struct valobj VOfilsys0user1[] = {
  */
 
 static struct validate VDmach = { VOmach0, 1 };
-static struct validate VDsort0= { VOsort0, 1 };
 static struct validate VDwild0= { VOwild0, 1 };
 static struct validate VDupwild0= { VOupwild0, 1 };
-static struct validate VDsort2= { VOsort01,2 };
 static struct validate VDwild2sort2 = { VOwild01sort01,4 };
 static struct validate VDwild3sort1 = { VOwild012sort0,4 };
 static struct validate VDsortf = { 
@@ -282,20 +278,10 @@ static struct validate VDwildsortf = {
   0,
   followup_fix_modby,
 };
+static struct validate VDsort0= { VOsort0, 1 };
 
-static struct validate VDwild2sortf = { 
-  VOwild01sort01,
-  4,
-  0,
-  0,
-  0,
-  0,
-  0,
-  0,
-  followup_fix_modby,
-};
 
-static struct validate VDupwildsortf = { 
+static struct validate VDupwildsortf = {
   VOupwild0sort,
   2,
   0,
@@ -306,9 +292,6 @@ static struct validate VDupwildsortf = {
   0,
   followup_fix_modby,
 };
-
-
-\f
 /* Query data */
 
 static char *galo_fields[] = {
@@ -472,15 +455,19 @@ static char *rusr_fields[] = {
     };
 
 static struct valobj rusr_valobj[] = {
+  {V_LOCK, 0, "imembers", 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
   {V_LOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE,0,MACH_ID, MR_DEADLOCK},
   {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
-  {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
   {V_LOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_LOCK, 0, QUOTA,0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK,0, "serverhosts",0, MACH_ID, MR_DEADLOCK},
 };
 
 static struct validate rusr_validate = {
   rusr_valobj,
-  4,
+  8,
   0,
   0,
   0,
@@ -575,9 +562,20 @@ static char *dusr_fields[] = {
   LOGIN,
 };
 
+struct valobj dusr_valobj[]= {
+  {V_LOCK, 0, "imembers", 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, FILESYS, 0,  FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, HOSTACCESS, 0, MACH_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "krbmap", 0, "users_id", MR_DEADLOCK},
+  {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
+};
 static struct validate dusr_validate = {
-  VOuser0lock,
-  2,
+/*  VOuser0lock, */
+  dusr_valobj,
+  8,
   0,
   0,
   0,
@@ -615,14 +613,16 @@ static char *akum_fields[] = { LOGIN, "kerberos" };
 
 static struct valobj akum_valobj[] =
 {
+  {V_LOCK, 0, "krbmap", 0, "users_id", MR_DEADLOCK},
   {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
   {V_ID, 1, "strings", "string", "string_id", MR_NO_MATCH},
+
 };
 
 static struct validate akum_validate =
 {
   akum_valobj,
-  1,
+  2,
   USERS_ID,
   "users_id = %d or string_id = %d",
   2,
@@ -635,7 +635,7 @@ static struct validate akum_validate =
 static struct validate dkum_validate =
 {
   akum_valobj,
-  2,
+  3,
   USERS_ID,
   "users_id = %d and string_id = %d",
   2,
@@ -704,9 +704,14 @@ static char *gpox_fields[] = {
   LOGIN, TYPE, "box",
 };
 
+struct valobj gpox_valobj[]={
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK}
+};
+
 static struct validate gpox_validate = {
-  0,
-  0,
+  gpox_valobj,
+  2,
   0,
   0,
   0,
@@ -722,6 +727,7 @@ static char *spob_fields[] = {
 
 static struct valobj spob_valobj[] = {
   {V_LOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
   {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
   {V_TYPE, 1, "pobox", 0, 0, MR_TYPE},
 };
@@ -729,7 +735,7 @@ static struct valobj spob_valobj[] = {
 static struct validate spob_validate = /* SET_POBOX */
 {
   spob_valobj,
-  3,
+  4,
   0,
   0,
   0,
@@ -738,11 +744,16 @@ static struct validate spob_validate =    /* SET_POBOX */
   0,
   set_pobox,
 };
+struct valobj spop_valobj[] = {
+  {V_LOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_ID, 0, USERS, LOGIN, USERS_ID, MR_USER},
+};
 
 static struct validate spop_validate = /* SET_POBOX_POP */
 {
-  VOuser0lock,
-  2,
+  spop_valobj,
+  3,
   0,
   0,
   0,
@@ -754,8 +765,8 @@ static struct validate spop_validate =      /* SET_POBOX_POP */
 
 static struct validate dpob_validate = /* DELETE_POBOX */
 {
-  VOuser0lock,
-  2,
+  spop_valobj,
+  3,
   0,
   0,
   0,
@@ -805,7 +816,11 @@ static struct valobj ahst_valobj[] = {
   {V_CHAR, 2},
   {V_CHAR, 3},
   {V_CHAR, 4},
+  {V_RLOCK,0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "hostalias", 0, MACH_ID, MR_DEADLOCK},
   {V_ID, 8, SUBNET, NAME, SNET_ID, MR_SUBNET},
   {V_TYPE, 10, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 11, 0, 0, 0, MR_ACE},
@@ -815,7 +830,7 @@ static struct valobj ahst_valobj[] = {
 
 static struct validate ahst_validate = {
   ahst_valobj,
-  11,
+  15,
   NAME,
   "name = uppercase(LEFT('%s',SIZE(name)))",
   1,
@@ -831,6 +846,10 @@ static char *uhst_fields[] = {
 };
 
 static struct valobj uhst_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_CHAR, 0},
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
   {V_RENAME, 1, MACHINE, NAME, MACH_ID, MR_NOT_UNIQUE},
@@ -838,7 +857,6 @@ static struct valobj uhst_valobj[] = {
   {V_CHAR, 3},
   {V_CHAR, 4},
   {V_CHAR, 5},
-  {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
   {V_ID, 9, SUBNET, NAME, SNET_ID, MR_SUBNET},
   {V_TYPE, 11, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 12, 0, 0, 0, MR_ACE},
@@ -848,7 +866,7 @@ static struct valobj uhst_valobj[] = {
 
 static struct validate uhst_validate = {
   uhst_valobj,
-  13,
+  16,
   0,
   0,
   0,
@@ -863,13 +881,21 @@ static char *dhst_fields[] = {
 };
 
 static struct valobj dhst_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_RLOCK, 0, "serverhosts", 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, HOSTACCESS, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "hostalias", 0, MACH_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "mcmap", 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, PRINTCAP, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "palladium", 0, MACH_ID, MR_DEADLOCK},
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
 };
 
 static struct validate dhst_validate = {
   dhst_valobj,
-  2,
+  10,
   0,
   0,
   0,
@@ -899,7 +925,7 @@ static struct validate ghal_validate = {
   0,
   access_ahal,
   0,
-  get_hostalias,
+  0,
 };
 
 static struct valobj ahal_valobj[] = {
@@ -945,13 +971,16 @@ static char *gsnt_fields[] = {
 };
 
 static struct valobj gsnt_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_UPWILD, 0},
   {V_SORT, 0},
 };
 
 static struct validate gsnt_validate = {
   gsnt_valobj,
-  2,
+  5,
   0,
   0,
   0,
@@ -966,7 +995,9 @@ static char *asnt_fields[] = {
 };
 
 static struct valobj asnt_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_CHAR, 0},
   {V_TYPE, 7, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 8, 0, 0, 0, MR_ACE},
@@ -975,7 +1006,7 @@ static struct valobj asnt_valobj[] = {
 static struct validate asnt_validate = 
 {
     asnt_valobj,
-    4,
+    6,
     NAME,
     "name = uppercase(LEFT('%s',SIZE(name)))",
     1,
@@ -991,7 +1022,9 @@ static char *usnt_fields[] = {
 };
 
 static struct valobj usnt_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_ID, 0, SUBNET, NAME, SNET_ID, MR_NO_MATCH},
   {V_RENAME, 1, SUBNET, NAME, SNET_ID, MR_NOT_UNIQUE},
   {V_TYPE, 8, ACE_TYPE, 0, 0, MR_ACE},
@@ -1001,7 +1034,7 @@ static struct valobj usnt_valobj[] = {
 static struct validate usnt_validate = 
 {
     usnt_valobj,
-    5,
+    7,
     NAME,
     "snet_id = %d",
     1,
@@ -1016,13 +1049,14 @@ static char *dsnt_fields[] = {
 };
 
 static struct valobj dsnt_valobj[] = {
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
   {V_LOCK, 0, SUBNET, 0, SNET_ID, MR_DEADLOCK},
   {V_ID, 0, SUBNET, NAME, SNET_ID, MR_SUBNET},
 };
 
 static struct validate dsnt_validate = {
   dsnt_valobj,
-  2,
+  3,
   0,
   0,
   0,
@@ -1189,13 +1223,15 @@ static char *gsin_fields[] = {
 
 static struct valobj gsin_valobj[] =
 {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   { V_UPWILD, 0 },
 };
 
 static struct validate gsin_validate = 
 {
   gsin_valobj,
-  1,
+  3,
   0,
   0,
   0,
@@ -1234,7 +1270,9 @@ static char *asin_fields[] = {
 };
 
 static struct valobj asin_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_CHAR, 0},
   {V_TYPE, 4, "service", 0, 0, MR_TYPE},
   {V_TYPE, 6, ACE_TYPE, 0, 0, MR_ACE},
@@ -1244,7 +1282,7 @@ static struct valobj asin_valobj[] = {
 static struct validate asin_validate = /* for asin, usin */
 {
   asin_valobj,
-  5,
+  7,
   NAME,
   "name = uppercase(LEFT('%s',SIZE(name)))",
   1,
@@ -1256,7 +1294,7 @@ static struct validate asin_validate =    /* for asin, usin */
 
 static struct validate rsve_validate = {
   asin_valobj,
-  1,
+  3,
   NAME,
   "name = uppercase('%s')",
   1,
@@ -1272,7 +1310,7 @@ static char *ssif_fields[] = {
 
 static struct validate ssif_validate = {
   asin_valobj,
-  1,
+  3,
   NAME,
   "name = uppercase('%s')",
   1,
@@ -1288,7 +1326,7 @@ static char *dsin_fields[] = {
 
 static struct validate dsin_validate = {
   asin_valobj,
-  1,
+  3,
   NAME,
   "name = uppercase('%s')",
   1,
@@ -1354,13 +1392,14 @@ static char *ashi_fields[] = {
 static struct valobj ashi_valobj[] = {
   {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
   {V_NAME, 0, "servers", NAME, 0, MR_SERVICE},
+  {V_LOCK, 0, "serverhosts",0, MACH_ID, MR_DEADLOCK},
   {V_ID, 1, MACHINE, NAME, MACH_ID, MR_MACHINE},
 };
 
 static struct validate ashi_validate = /* ashi & ushi */
 {
   ashi_valobj,
-  3,
+  4,
   SERVICE,
   "service = uppercase(LEFT('%s',SIZE(service))) AND mach_id = %d",
   2,
@@ -1373,7 +1412,7 @@ static struct validate ashi_validate = /* ashi & ushi */
 static struct validate rshe_validate = 
 {
   ashi_valobj,
-  3,
+  4,
   SERVICE,
   "service = uppercase('%s') AND mach_id = %d",
   2,
@@ -1386,7 +1425,7 @@ static struct validate rshe_validate =
 static struct validate ssho_validate = 
 {
   ashi_valobj,
-  3,
+  4,
   SERVICE,
   "service = uppercase('%s') AND mach_id = %d",
   2,
@@ -1402,6 +1441,7 @@ static char *sshi_fields[] = {
 };
 
 static struct valobj sshi_valobj[] = {
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
   {V_NAME, 0, "servers", NAME, 0, MR_SERVICE},
   {V_ID, 1, MACHINE, NAME, MACH_ID, MR_MACHINE},  /** Was this ok to add? */
 };
@@ -1409,7 +1449,7 @@ static struct valobj sshi_valobj[] = {
 static struct validate sshi_validate = 
 {
   sshi_valobj,
-  2,
+  3,
   0,
   0,
   0,
@@ -1426,7 +1466,7 @@ static char *dshi_fields[] = {
 static struct validate dshi_validate = 
 {
   ashi_valobj,
-  3,
+  4,
   SERVICE,
   "service = uppercase('%s') AND mach_id = %d",
   2,
@@ -1459,7 +1499,9 @@ static char *asha_fields[] = {
 };
 
 static struct valobj asha_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_TYPE, 1, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 2, 0, 0, 0, MR_ACE},
 };
@@ -1467,7 +1509,7 @@ static struct valobj asha_valobj[] = {
 static struct validate asha_validate = 
 {
   asha_valobj,
-  3,
+  5,
   MACH_ID,
   "mach_id = %d",
   1,
@@ -1494,9 +1536,14 @@ static char *gfsm_fields[] = {
   "create", "lockertype", MOD1, MOD2, MOD3,
 };
 
+static struct valobj gfsm_valobj[] = {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
+};
+
 static struct validate gfsm_validate = {
-  VOmach0,
-  1,
+  gfsm_valobj,
+  2,
   0,
   0,
   0,
@@ -1514,13 +1561,14 @@ static char *gfsn_fields[] = {
 
 static struct valobj gfsn_valobj[] =
 {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
   {V_WILD, 1},
 };
 
 static struct validate gfsn_validate = {
   gfsn_valobj,
-  2,
+  3,
   0,
   0,
   0,
@@ -1541,10 +1589,14 @@ static char *gfsg_fields[] = {
   LABEL, TYPE, MACHINE, NAME, "mount", "access", COMMENTS, "owner", "owners",
   "create", "lockertype", MOD1, MOD2, MOD3,
 };
+static struct valobj gfsg_valobj[] = {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST}
+};
 
 static struct validate gfsg_validate = {
-  VOlist0,
-  1,
+  gfsg_valobj,
+  2,
   0,
   0,
   0,
@@ -1560,8 +1612,11 @@ static char *afil_fields[] = {
 };
 
 static struct valobj afil_valobj[] = {
-  {V_CHAR, 0},
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_CHAR, 0},
   {V_TYPE, 1, FILESYS, 0, 0, MR_FSTYPE},
   {V_ID, 2, MACHINE, NAME, MACH_ID, MR_MACHINE},
   {V_CHAR, 3},
@@ -1572,7 +1627,7 @@ static struct valobj afil_valobj[] = {
 
 static struct validate afil_validate = {
   afil_valobj,
-  8,
+  11,
   LABEL,
   "label = LEFT('%s',SIZE(label))",
   1,
@@ -1589,6 +1644,10 @@ static char *ufil_fields[] = {
 
 static struct valobj ufil_valobj[] = {
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
   {V_ID, 0, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
   {V_RENAME, 1, FILESYS, LABEL, FILSYS_ID, MR_NOT_UNIQUE},
   {V_TYPE, 2, FILESYS, 0, 0, MR_FSTYPE},
@@ -1601,7 +1660,7 @@ static struct valobj ufil_valobj[] = {
 
 static struct validate ufil_validate = {
   ufil_valobj,
-  9,
+  13,
   LABEL,
   "filsys_id = %d",
   1,
@@ -1617,12 +1676,15 @@ static char *dfil_fields[] = {
 
 static struct valobj dfil_valobj[] = {
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_LOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "fsgroup", 0, "filsys_id", MR_DEADLOCK},
   {V_ID, 0, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
 };
 
 static struct validate dfil_validate = {
   dfil_valobj,
-  2,
+  5,
   "label",
   "filsys_id = %d",
   1,
@@ -1656,13 +1718,14 @@ static struct validate gfgm_validate = {
 
 static struct valobj aftg_valobj[] = {
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "fsgroup", 0, "filsys_id", MR_DEADLOCK},
   {V_ID, 0, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
   {V_ID, 1, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
 };
 
 static struct validate aftg_validate = {
   aftg_valobj,
-  3,
+  4,
   "group_id",
   "group_id = %d and filsys_id = %d",
   2,
@@ -1683,12 +1746,13 @@ static char *gnfp_fields[] = {
 
 static struct valobj gnfp_valobj[] = {
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
+  {V_RLOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
   {V_WILD, 1},
 };
 
 static struct validate gnfp_validate = {
   gnfp_valobj,
-  2,
+  3,
   0,
   0,
   0,
@@ -1699,13 +1763,15 @@ static struct validate gnfp_validate = {
 };
 
 static struct valobj anfp_valobj[] = {
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
   {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
   {V_CHAR, 1},
 };
 
 static struct validate anfp_validate = {
   anfp_valobj,
-  2,
+  4,
   DIR,
   "mach_id = %d and dir = LEFT('%s',SIZE(dir))",
   2,
@@ -1717,7 +1783,7 @@ static struct validate anfp_validate = {
 
 static struct validate unfp_validate = {
   anfp_valobj,
-  2,
+  4,
   DIR,
   "mach_id = %d and dir = '%s'",
   2,
@@ -1735,9 +1801,17 @@ static char *dnfp_fields[] = {
   MACHINE, DIR,
 };
 
+static struct valobj dnfp_valobj[] = {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_ID, 0, MACHINE, NAME, MACH_ID, MR_MACHINE},
+
+};
+
 static struct validate dnfp_validate = {
-  VOmach0,
-  1,
+  dnfp_valobj,
+  4,
   DIR,
   "mach_id = %d and dir = '%s'",
   2,
@@ -1753,6 +1827,11 @@ static char *gqot_fields[] = {
 };
 
 static struct valobj gqot_valobj[] = {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_RLOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
   {V_WILD, 0},
   {V_TYPE, 1, QUOTA_TYPE, 0, 0, MR_TYPE},
   {V_TYPEDATA, 2, 0, 0, 0, MR_ACE},
@@ -1761,7 +1840,7 @@ static struct valobj gqot_valobj[] = {
 
 static struct validate gqot_validate = {
   gqot_valobj,
-  4,
+  9,
   0,
   0,
   0,
@@ -1794,6 +1873,10 @@ static char *aqot_fields[] = {
 
 static struct valobj aqot_valobj[] = {
   {V_LOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, "nfsphys", 0, "nfsphys_id", MR_DEADLOCK},
+  {V_LOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
   {V_ID, 0, FILESYS, LABEL, FILSYS_ID, MR_FILESYS},
   {V_TYPE, 1, QUOTA_TYPE, 0, 0, MR_TYPE},
   {V_TYPEDATA, 2, 0, 0, 0, MR_ACE},
@@ -1801,7 +1884,7 @@ static struct valobj aqot_valobj[] = {
 
 static struct validate aqot_validate = {
   aqot_valobj,
-  4,
+  8,
   FILSYS_ID,
   "filsys_id = %d and type = '%s' and entity_id = %d",
   3,
@@ -1813,7 +1896,7 @@ static struct validate aqot_validate = {
 
 static struct validate uqot_validate = {
   aqot_valobj,
-  4,
+  8,
   FILSYS_ID,
   "filsys_id = %d AND type = '%s' AND entity_id = %d",
   3,
@@ -1825,7 +1908,7 @@ static struct validate uqot_validate = {
 
 static struct validate dqot_validate = {
   aqot_valobj,
-  4,
+  8,
   FILSYS_ID,
   "filsys_id = %d AND type = '%s' AND entity_id = %d",
   3,
@@ -1928,6 +2011,7 @@ static char *alis_fields[] = {
 };
 
 static struct valobj alis_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_CHAR, 0},
   {V_TYPE, 7, ACE_TYPE, 0, 0, MR_ACE},
@@ -1936,7 +2020,7 @@ static struct valobj alis_valobj[] = {
 
 static struct validate alis_validate = {
   alis_valobj,
-  4,
+  5,
   NAME,
   "name = LEFT('%s',SIZE(name))",
   1,
@@ -1953,6 +2037,7 @@ static char *ulis_fields[] = {
 };
 
 static struct valobj ulis_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST},
   {V_RENAME, 1, LIST, NAME, LIST_ID, MR_NOT_UNIQUE},
@@ -1962,7 +2047,7 @@ static struct valobj ulis_valobj[] = {
 
 static struct validate ulis_validate = {
   ulis_valobj,
-  5,
+  6,
   NAME,
   "list_id = %d",
   1,
@@ -1976,9 +2061,20 @@ static char *dlis_fields[] = {
   NAME,
 };
 
+static struct valobj dlis_valobj[] ={
+  {V_RLOCK, 0, "capacls", 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, "imembers", 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, QUOTA, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, ZEPH, 0, ZEPH_ID, MR_DEADLOCK},  
+  {V_RLOCK, 0, HOSTACCESS, 0, MACH_ID, MR_DEADLOCK},
+  {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST}
+};
+
 static struct validate dlis_validate = {
-  VOlist0,
-  1,
+  dlis_valobj,
+  8,
   NAME,
   "list_id = %d",
   1,
@@ -1993,6 +2089,7 @@ static char *amtl_fields[] = {
 };
 
 static struct valobj amtl_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
   {V_LOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
   {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST},
   {V_TYPE, 1, "member", 0, 0, MR_TYPE},
@@ -2002,7 +2099,7 @@ static struct valobj amtl_valobj[] = {
 static struct validate amtl_validate =
 {
   amtl_valobj,
-  4,
+  5,
   0,
   0,
   0,
@@ -2015,7 +2112,7 @@ static struct validate amtl_validate =
 static struct validate dmfl_validate =
 {
   amtl_valobj,
-  4,
+  5,
   0,
   0,
   0,
@@ -2031,13 +2128,18 @@ static char *gaus_fields[] = {
 };
 
 static struct valobj gaus_valobj[] = {
+  {V_RLOCK, 0, FILESYS, 0, FILSYS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, ZEPH, 0, ZEPH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, HOSTACCESS, 0, MACH_ID, MR_DEADLOCK},
   {V_TYPE, 0, "gaus", 0, 0, MR_TYPE},
   {V_TYPEDATA, 1, 0, 0, 0, MR_NO_MATCH},
 };
 
 static struct validate gaus_validate = {
   gaus_valobj,
-  2,
+  7,
   0,
   0,
   0,
@@ -2077,9 +2179,15 @@ static char *gmol_fields[] = {
   "member_type", "member_name",
 };
 
+static struct valobj gmol_valobj[]={
+  {V_LOCK, 0, "imembers", 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_ID, 0, LIST, NAME, LIST_ID, MR_LIST},
+
+};
 static struct validate gmol_validate = {
 VOlist0,
-  1,
gmol_valobj,
+  3,
   0,
   0,
   0,
@@ -2090,8 +2198,8 @@ static struct validate gmol_validate = {
 };
 
 static struct validate geml_validate = {
-  VOlist0,
-  1,
+  gmol_valobj,
+  2,
   0,
   0,
   0,
@@ -2107,14 +2215,17 @@ static char *glom_fields[] = {
 };
 
 static struct valobj glom_valobj[] = {
-  {V_TYPE, 0, "rmember", 0, 0, MR_TYPE},
-  {V_TYPEDATA, 1, 0, 0, 0, MR_NO_MATCH},
-  {V_SORT, 0},
+   {V_LOCK, 0, "imembers", 0, LIST_ID, MR_DEADLOCK},
+   {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+   {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+   {V_TYPE, 0, "rmember", 0, 0, MR_TYPE},
+   {V_TYPEDATA, 1, 0, 0, 0, MR_NO_MATCH},
+   {V_SORT, 0},
 };
 
 static struct validate glom_validate = {
   glom_valobj,
-  3,
+  5,
   0,
   0,
   0,
@@ -2147,9 +2258,16 @@ static char *gzcl_fields[] = {
   "iws_type", "iws_name", "iui_type", "iui_name", MOD1, MOD2, MOD3, 
 };
 
+static struct valobj gzcl_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, ZEPH, 0, ZEPH_ID, MR_DEADLOCK},
+  {V_WILD, 0},
+  {V_SORT, 0},
+};
 static struct validate gzcl_validate = {
-  VOwild0sort,
-  2,
+  gzcl_valobj,
+  5,
   0,
   0,
   0,
@@ -2165,6 +2283,9 @@ static char *azcl_fields[] = {
 };
 
 static struct valobj azcl_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, ZEPH, 0, ZEPH_ID, MR_DEADLOCK}, 
   {V_CHAR, 0},
   {V_TYPE, 1, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 2, 0, 0, LIST_ID, MR_ACE},
@@ -2178,7 +2299,7 @@ static struct valobj azcl_valobj[] = {
 
 static struct validate azcl_validate = {
   azcl_valobj,
-  9,
+  12,
   CLASS,
   "class = LEFT('%s',SIZE(class))",
   1,
@@ -2194,6 +2315,9 @@ static char *uzcl_fields[] = {
 };
 
 static struct valobj uzcl_valobj[] = {
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, LIST, 0, LIST_ID, MR_DEADLOCK},
+  {V_LOCK, 0, ZEPH, 0, ZEPH_ID, MR_DEADLOCK},
   {V_RENAME, 1, "zephyr", CLASS, 0, MR_NOT_UNIQUE},
   {V_TYPE, 2, ACE_TYPE, 0, 0, MR_ACE},
   {V_TYPEDATA, 3, 0, 0, LIST_ID, MR_ACE},
@@ -2207,7 +2331,7 @@ static struct valobj uzcl_valobj[] = {
 
 static struct validate uzcl_validate = {
   uzcl_valobj,
-  9,
+  11,
   CLASS,
   "class = '%s'",
   1,
@@ -2257,9 +2381,17 @@ static char *gpce_fields[] = {
   MOD1, MOD2, MOD3,
 };
 
+static struct valobj gpce_valobj[]={
+  {V_RLOCK, 0, USERS, 0, USERS_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, MACHINE, 0, MACH_ID, MR_DEADLOCK},
+  {V_RLOCK, 0, PRINTCAP, 0, MACH_ID, MR_DEADLOCK},
+  {V_WILD, 0},
+  {V_SORT, 0},
+};
+
 static struct validate gpce_validate = {
-  VOwild0sort,
-  2,
+  gpce_valobj,
+  5,
   0,
   0,
   0,
@@ -3050,7 +3182,7 @@ struct query Queries2[] = {
     "get_hostalias",
     "ghal",
     RETRIEVE,
-    0,
+    "a",
     "hostalias",
     "CHAR(a.name), CHAR(m.name) FROM hostalias a, machine m",
     ghal_fields,
@@ -3531,7 +3663,7 @@ struct query Queries2[] = {
     "gsha",
     RETRIEVE,
     "ha",
-    "hostaccess",
+    HOSTACCESS,
     "CHAR(m.name), ha.acl_type, CHAR(ha.acl_id), CHAR(ha.modtime), CHAR(ha.modby), ha.modwith FROM hostaccess ha, machine m",
     gsha_fields,
     6,
@@ -3546,7 +3678,7 @@ struct query Queries2[] = {
     "asha",
     APPEND,
     "ha",
-    "hostaccess",
+    HOSTACCESS,
     "INTO hostaccess (mach_id, acl_type, acl_id) VALUES (%d,'%s',%d)",
     asha_fields,
     3,
@@ -3561,7 +3693,7 @@ struct query Queries2[] = {
     "usha",
     UPDATE,
     "ha",
-    "hostaccess",
+    HOSTACCESS,
     "hostaccess SET acl_type = '%s', acl_id = %d",
     asha_fields,
     2,
@@ -3576,7 +3708,7 @@ struct query Queries2[] = {
     "dsha",
     DELETE,
     "ha",
-    "hostaccess",
+    HOSTACCESS,
     0,
     asha_fields,
     0,
@@ -4311,7 +4443,7 @@ struct query Queries2[] = {
     "gpce",
     RETRIEVE,
     "pc",
-    "printcap",
+    PRINTCAP,
     "CHAR(pc.name), CHAR(m.name), pc.dir, pc.rp, CHAR(pc.quotaserver), CHAR(pc.auth), CHAR(pc.price), pc.comments, CHAR(pc.modtime), CHAR(pc.modby), pc.modwith FROM printcap pc, machine m",
     gpce_fields,
     11,
@@ -4326,7 +4458,7 @@ struct query Queries2[] = {
     "apce",
     APPEND,
     "pc",
-    "printcap",
+    PRINTCAP,
     "INTO printcap (name, mach_id, dir, rp, quotaserver, auth, price, comments) VALUES ('%s',%d,'%s','%s',%d,%s,%s,'%s')",
     apce_fields,
     8,
@@ -4341,7 +4473,7 @@ struct query Queries2[] = {
     "dpce",
     DELETE,
     "pc",
-    "printcap",
+    PRINTCAP,
     0,
     apce_fields,
     0,
@@ -4356,7 +4488,7 @@ struct query Queries2[] = {
     "gpcp",
     RETRIEVE,
     "pc",
-    "printcap",
+    PRINTCAP,
     "CHAR(pc.name), CHAR(m.name), pc.dir, pc.rp, pc.comments, CHAR(pc.modtime), CHAR(pc.modby), pc.modwith FROM printcap pc, machine m",
     gpcp_fields,
     8,
@@ -4371,7 +4503,7 @@ struct query Queries2[] = {
     "dpcp",
     DELETE,
     "pc",
-    "printcap",
+    PRINTCAP,
     0,
     apce_fields,
     0,
index 9a0e9aef7f049ada01da61ad6f424a6e0764fdc0..e82d2fa24a94223d5eef237c9b2b4c2e3476c480 100644 (file)
@@ -46,7 +46,8 @@ struct validate
        
 /* Validated Object Types */
 enum vo_type {V_NAME, V_ID, V_TYPE, V_TYPEDATA, V_DATE, 
-             V_SORT, V_RENAME, V_CHAR, V_LOCK, V_WILD, V_UPWILD};
+             V_SORT, V_RENAME, V_CHAR, V_LOCK, V_WILD, V_UPWILD,
+              V_RLOCK};
 
 /* Validated Object Definition */
 struct valobj
index 188d4ffb88a36748698e69cb5960b9e71795dcce..8cdf76a36f037adfe2ed03b5645a9715d1d03395 100644 (file)
@@ -140,7 +140,10 @@ validate_fields(q, argv, vo, n)
            status = lock_table(vo);
            break;
 
-       case V_WILD:
+        case V_RLOCK:
+            status = readlock_table(vo);
+            break;
+        case V_WILD:
            status = convert_wildcards(argv[vo->index]);
            break;
 
@@ -150,7 +153,10 @@ validate_fields(q, argv, vo, n)
 
        }
 
-       if (status != MR_EXISTS) return(status);
+       if (status != MR_EXISTS){
+           com_err(whoami,0,"validation failed type=%ld, code=%ld\n",vo->type, status);
+           return(status);
+        }
        vo++;
     }
 
@@ -484,13 +490,64 @@ struct valobj *vo;
     sprintf(stmt_buf,"UPDATE %s SET modtime='now' WHERE %s.%s = 0",
            vo->table,vo->table,vo->idfield);
     EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
-    if (ingres_errno) return(mr_errcode);
+    if (sqlca.sqlcode == 100){
+        fprintf(stderr,"readlock_table: no matching rows found for %s\n",
+                stmt_buf);
+        return(MR_INTERNAL);
+    }
+    if (ingres_errno) 
+        return(mr_errcode);
     if (sqlca.sqlerrd[2] != 1)
       return(vo->error);
     else
       return(MR_EXISTS);
 }
 
+/*
+ * Get a read lock on the table by accessing the magic lock
+ * record.  Certain tables are constructed so that they contain
+ * an id field whose value is zero and a modtime field.  We 
+ * manipulate the modtime field of the id 0 record to effect 
+ * locking of the table
+ */
+
+readlock_table(vo)
+    struct valobj *vo;
+{
+    EXEC SQL BEGIN DECLARE SECTION;
+        int id;
+        char buf[256];
+        char *tbl, *idfield;
+    EXEC SQL END DECLARE SECTION;
+
+    tbl=vo->table;
+    idfield=vo->idfield;
+    sprintf(buf,"SELECT %s FROM %s WHERE %s.%s = 0",
+        vo->idfield, vo->table, vo->table, vo->idfield);
+    EXEC SQL PREPARE stmt FROM :buf;
+    EXEC SQL DESCRIBE stmt INTO SQLDA;
+    EXEC SQL DECLARE rcsr CURSOR FOR stmt;
+    EXEC SQL OPEN rcsr;
+    EXEC SQL FETCH rcsr USING DESCRIPTOR :SQLDA;
+    /* Check for no matching rows found - this is 
+     * flagged as an internal error since the table should
+     * have a magic lock record.
+     */
+    if (sqlca.sqlcode == 100){
+        EXEC SQL CLOSE rcsr;
+        com_err(whoami,0,"readlock_table: no matching rows found for %s\n",
+                buf);
+        return(MR_INTERNAL);
+    }
+    EXEC SQL CLOSE rcsr;
+    if (ingres_errno)
+        return(mr_errcode);
+    if (sqlca.sqlcode)
+        return(vo->error);
+    return(MR_EXISTS);  /* validate_fields expects us to return
+                           * this value if everything went okay
+                           */
+}
 
 /* Check the database at startup time.  For now this just resets the
  * inprogress flags that the DCM uses.
This page took 0.10891 seconds and 5 git commands to generate.