From 741abed826c794a5b85a3ab1eb33de8db69f905d Mon Sep 17 00:00:00 2001 From: danw Date: Sun, 29 Sep 1996 20:55:36 +0000 Subject: [PATCH] Diane Delgado's changes for a fixed table-locking order --- db/schema | 42 ++++- gen/aliases.dc | 13 +- gen/ca.dc | 8 + gen/hesiod.dc | 24 ++- gen/hosts.dc | 5 + gen/mailhub.dc | 1 + gen/nfs.dc | 23 ++- gen/sis.dc | 4 + gen/stats.dc | 8 +- gen/zephyr.dc | 8 +- server/queries2.c | 364 ++++++++++++++++++++++++++++++-------------- server/query.h | 3 +- server/qvalidate.dc | 63 +++++++- 13 files changed, 424 insertions(+), 142 deletions(-) diff --git a/db/schema b/db/schema index cb276f5c..238e4468 100644 --- 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 ( diff --git a/gen/aliases.dc b/gen/aliases.dc index a65cff59..5fa8f8be 100644 --- a/gen/aliases.dc +++ b/gen/aliases.dc @@ -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); } + + + diff --git a/gen/ca.dc b/gen/ca.dc index 5ff09983..4bd97f32 100644 --- 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); } + + diff --git a/gen/hesiod.dc b/gen/hesiod.dc index d99b2f87..f83218b1 100644 --- a/gen/hesiod.dc +++ b/gen/hesiod.dc @@ -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); } + + + + + + + diff --git a/gen/hosts.dc b/gen/hosts.dc index 8119f6e3..46a76745 100644 --- a/gen/hosts.dc +++ b/gen/hosts.dc @@ -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"); diff --git a/gen/mailhub.dc b/gen/mailhub.dc index 86987d24..74c70f49 100644 --- a/gen/mailhub.dc +++ b/gen/mailhub.dc @@ -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; diff --git a/gen/nfs.dc b/gen/nfs.dc index 36683030..8e9e0ddb 100644 --- a/gen/nfs.dc +++ b/gen/nfs.dc @@ -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)) { diff --git a/gen/sis.dc b/gen/sis.dc index 987612d9..938f073f 100644 --- a/gen/sis.dc +++ b/gen/sis.dc @@ -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 diff --git a/gen/stats.dc b/gen/stats.dc index 0933aba1..00b90ec9 100644 --- a/gen/stats.dc +++ b/gen/stats.dc @@ -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); } diff --git a/gen/zephyr.dc b/gen/zephyr.dc index e6fca3ee..75c6309a 100644 --- a/gen/zephyr.dc +++ b/gen/zephyr.dc @@ -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 diff --git a/server/queries2.c b/server/queries2.c index cf0dcb14..5e0954ad 100644 --- a/server/queries2.c +++ b/server/queries2.c @@ -97,7 +97,6 @@ int count_members_of_list(); int get_lists_of_member(); int register_user(); int _sdl_followup(); -int get_hostalias(); @@ -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, }; - - - /* 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, diff --git a/server/query.h b/server/query.h index 9a0e9aef..e82d2fa2 100644 --- a/server/query.h +++ b/server/query.h @@ -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 diff --git a/server/qvalidate.dc b/server/qvalidate.dc index 188d4ffb..8cdf76a3 100644 --- a/server/qvalidate.dc +++ b/server/qvalidate.dc @@ -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. -- 2.45.2