From 22bc6c270e26bce92cad006c57aa7481a3569999 Mon Sep 17 00:00:00 2001 From: mar Date: Mon, 21 Dec 1992 18:03:12 +0000 Subject: [PATCH] performance improvements --- gen/aliases.dc | 26 +++++++++----- gen/nfs.dc | 92 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 81 insertions(+), 37 deletions(-) diff --git a/gen/aliases.dc b/gen/aliases.dc index e85cdfa4..1326dc7a 100644 --- a/gen/aliases.dc +++ b/gen/aliases.dc @@ -44,6 +44,7 @@ char **argv; initialize_sms_error_table(); #ifsql INGRES EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; #endsql #ifsql INFORMIX EXEC SQL DATABASE moira; @@ -142,11 +143,12 @@ get_info() EXEC SQL SELECT modtime INTO :buf FROM users WHERE USERS_ID = 0; fprintf(stderr, "Loading machines\n"); - machines = create_hash(1000); + machines = create_hash(10); EXEC SQL DECLARE m_cursor CURSOR FOR SELECT mach_id, name - FROM machine; + FROM machine + ORDER BY mach_id; EXEC SQL OPEN m_cursor; while (1) { EXEC SQL FETCH m_cursor INTO :id, :name; @@ -162,16 +164,17 @@ get_info() fprintf(stderr, "Loading strings\n"); - strings = create_hash(2000); + strings = create_hash(11001); EXEC SQL DECLARE s_cursor CURSOR FOR - SELECT string_id, string - FROM strings; + SELECT string_id, trim(string) + FROM strings + ORDER BY string_id; EXEC SQL OPEN s_cursor; while (1) { EXEC SQL FETCH s_cursor INTO :id, :name; if (sqlca.sqlcode != 0) break; - hash_store(strings, id, strsave(strtrim(name))); + hash_store(strings, id, strsave(name)); } EXEC SQL CLOSE s_cursor; @@ -180,7 +183,8 @@ get_info() EXEC SQL DECLARE u_cursor CURSOR FOR SELECT users_id, login, potype, pop_id, box_id - FROM users WHERE status = 1 OR status = 5 OR status = 6; + FROM users WHERE status = 1 OR status = 5 OR status = 6 + ORDER BY users_id; EXEC SQL OPEN u_cursor; while (1) { EXEC SQL FETCH u_cursor INTO :id, :name, :type, :pid, :bid; @@ -207,13 +211,15 @@ get_info() hash_store(users, id, u); } EXEC SQL CLOSE u_cursor; + EXEC SQL COMMIT; fprintf(stderr, "Loading lists\n"); lists = create_hash(15001); 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 + ORDER BY list_id; EXEC SQL OPEN l_cursor; while (1) { EXEC SQL FETCH l_cursor INTO :id, :name, :maillistp, @@ -229,12 +235,14 @@ get_info() hash_store(lists, id, l); } EXEC SQL CLOSE l_cursor; + EXEC SQL COMMIT; fprintf(stderr, "Loading members\n"); EXEC SQL DECLARE mem_cursor CURSOR FOR SELECT list_id, member_type, member_id - FROM imembers WHERE direct = 1; + FROM imembers WHERE direct = 1 + ORDER BY list_id; EXEC SQL OPEN mem_cursor; while (1) { EXEC SQL FETCH mem_cursor INTO :id, :type, :mid; diff --git a/gen/nfs.dc b/gen/nfs.dc index d8b68a8e..c7cb3af2 100644 --- a/gen/nfs.dc +++ b/gen/nfs.dc @@ -22,6 +22,8 @@ EXEC SQL INCLUDE sqlca; char *whoami = "nfs.gen"; char *malloc(), *strsave(); char nfs_dir[64]; +struct hash *users, *groups; + main(argc, argv) int argc; @@ -40,10 +42,11 @@ char **argv; sprintf(nfs_dir, "%s/nfs", DCM_DIR); #ifsql INGRES - EXEC SQL CONNECT sms; + EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; #endsql #ifsql INFORMIX - EXEC SQL DATABASE sms; + EXEC SQL DATABASE moira; #endsql changed = do_nfs(); @@ -85,11 +88,15 @@ int do_nfs() machs = sq_create(); lists = sq_create(); + /* 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. + */ EXEC SQL WHENEVER SQLERROR GOTO sqlerr; EXEC SQL DECLARE s_cursor CURSOR FOR SELECT m.name, s.value3 FROM machine m, serverhosts s - WHERE m.mach_id = s.mach_id AND s.service = "NFS" AND s.enable != 0; + WHERE m.mach_id = s.mach_id AND s.service = 'NFS' AND s.enable != 0; EXEC SQL OPEN s_cursor; while (1) { EXEC SQL FETCH s_cursor INTO :machname, :listname; @@ -100,6 +107,7 @@ int do_nfs() EXEC SQL CLOSE s_cursor; changed = do_lists(lists); + EXEC SQL COMMIT; changed += do_machs(machs); return(changed); sqlerr: @@ -117,7 +125,6 @@ int do_lists(lists) struct save_queue *lists; { char file[64], *u; - struct hash *users, *do_everyone(); struct stat sb; FILE *fd; EXEC SQL BEGIN DECLARE SECTION; @@ -126,6 +133,7 @@ struct save_queue *lists; EXEC SQL END DECLARE SECTION; sprintf(file, "%s/list-", nfs_dir); + /* if (stat(file, &sb) == 0) { if ((ModDiff (&flag1, "users", sb.st_mtime)) || (ModDiff (&flag2, "list", sb.st_mtime)) || @@ -136,6 +144,7 @@ struct save_queue *lists; return(0); } } + */ /* get locks */ EXEC SQL SELECT modtime INTO :lname FROM list WHERE list_id = 0; @@ -144,7 +153,7 @@ struct save_queue *lists; /* build the list of everyone, and store it in a file whose name * corresponds to the empty list. */ - users = do_everyone(); + do_everyone(); fprintf(stderr, "Building specific lists\n"); /* now do each of the lists used by an NFS server */ @@ -163,7 +172,8 @@ struct save_queue *lists; SELECT m.member_id FROM imembers m, list l WHERE m.list_id=l.list_id AND l.name = :listname AND - m.member_type="USER"; + m.member_type='USER' + ORDER BY member_id; EXEC SQL OPEN m_cursor; while (1) { EXEC SQL FETCH m_cursor INTO :id; @@ -201,10 +211,9 @@ struct user { }; -struct hash *do_everyone() +do_everyone() { char buf[BUFSIZ], *l; - struct hash *groups, *users; struct user *u; struct grp *g; struct bucket *b, **p; @@ -231,7 +240,8 @@ struct hash *do_everyone() EXEC SQL DECLARE l_cursor CURSOR FOR SELECT gid, list_id FROM list - WHERE grp <> 0 AND active != 0; + WHERE grouplist != 0 AND active != 0 + ORDER BY list_id; EXEC SQL OPEN l_cursor; while (1) { EXEC SQL FETCH l_cursor INTO :gid, :lid; @@ -246,7 +256,8 @@ struct hash *do_everyone() EXEC SQL DECLARE u_cursor CURSOR FOR SELECT users_id, login, uid FROM users - WHERE status = 1; + WHERE status = 1 + ORDER BY users_id; EXEC SQL OPEN u_cursor; while (1) { EXEC SQL FETCH u_cursor INTO :id, :name, :uid; @@ -262,7 +273,8 @@ struct hash *do_everyone() EXEC SQL DECLARE m_cursor2 CURSOR FOR SELECT list_id, member_id FROM imembers - WHERE member_type = "USER"; + WHERE member_type = 'USER' + ORDER BY list_id; EXEC SQL OPEN m_cursor2; while (1) { EXEC SQL FETCH m_cursor2 INTO :lid, :id; @@ -290,7 +302,7 @@ struct hash *do_everyone() fclose(fd); free(groups); - return(users); + return(1); sqlerr: com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode); critical_alert("DCM", "NFS build encountered DATABASE ERROR %d", @@ -319,7 +331,7 @@ struct save_queue *machs; /* 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 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); @@ -327,7 +339,8 @@ struct save_queue *machs; EXEC SQL SELECT s.value3, m.mach_id INTO :listname, :id FROM serverhosts s, machine m - WHERE s.mach_id = m.mach_id AND m.name = :machname; + WHERE s.mach_id = m.mach_id AND m.name = :machname AND + s.service = 'NFS'; strtrim(machname); sprintf(f1, "%s/list-%s", nfs_dir, strtrim(listname)); sprintf(f2, "%s/%s.cred", nfs_dir, machname); @@ -344,17 +357,22 @@ struct save_queue *machs; fd = stdin; EXEC SQL DECLARE q_cursor CURSOR FOR - SELECT DISTINCT q.quota, u.uid, q.phys_id, n.device, n.mach_id - FROM quota q, users u, nfsphys n - WHERE u.users_id = q.entity_id AND n.nfsphys_id = q.phys_id AND - q.phys_id != 0 AND n.status < 16 AND q.type = "USER" - ORDER BY mach_id, phys_id, uid; + SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id + FROM quota q, nfsphys n + WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND + n.status < 16 AND q.type = 'USER' + ORDER BY n.mach_id, q.phys_id, q.entity_id; EXEC SQL OPEN q_cursor; while (1) { EXEC SQL FETCH q_cursor INTO :quota, :uid, :flag1, :dev, :flag2; if (sqlca.sqlcode != 0) break; if (flag1 != olddev || flag2 != oldmach) { - fclose(fd); + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + if (flag2 == 0 || !hash_lookup(machines, flag2)) + continue; + if (fd != stdin) + fclose(fd); olddev = flag1; oldmach = flag2; while (cp = index(dev, '/')) *cp = '@'; @@ -369,6 +387,9 @@ struct save_queue *machs; quotasum = 0; } if (uid != prevuid) { + if ((cp = hash_lookup(users, prevuid)) && + (cp = index(cp, ':'))) + prevuid = atoi(cp+1); if (quotasum) fprintf(fd, "%d %d\n", prevuid, quotasum); prevuid = uid; @@ -378,6 +399,9 @@ struct save_queue *machs; } } EXEC SQL CLOSE q_cursor; + if ((cp = hash_lookup(users, prevuid)) && + (cp = index(cp, ':'))) + prevuid = atoi(cp+1); if (quotasum) fprintf(fd, "%d %d\n", prevuid, quotasum); if (fd != stdin && fclose(fd) == EOF) { @@ -388,18 +412,24 @@ struct save_queue *machs; olddev = oldmach = -1; fd = stdin; EXEC SQL DECLARE q_cursor2 CURSOR FOR - SELECT DISTINCT q.quota, l.gid, q.phys_id, n.device, n.mach_id, n.status - FROM quota q, list l, nfsphys n - WHERE l.list_id = q.entity_id AND n.nfsphys_id = q.phys_id AND - q.phys_id != 0 AND n.status > 15 AND q.type = "GROUP" - ORDER BY mach_id, phys_id, gid; + SELECT DISTINCT q.quota, q.entity_id, q.phys_id, n.device, n.mach_id, + n.status + FROM quota q, nfsphys n + WHERE n.nfsphys_id = q.phys_id AND q.phys_id != 0 AND + n.status > 15 AND q.type = 'GROUP' + ORDER BY mach_id, phys_id, entity_id; EXEC SQL OPEN q_cursor2; while (1) { EXEC SQL FETCH q_cursor2 INTO :quota, :gid, :flag1, :dev, :flag2, :flag3; if (sqlca.sqlcode != 0) break; if (flag1 != olddev || flag2 != oldmach) { - fclose(fd); + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + if (flag2 == 0 || !hash_lookup(machines, flag2)) + continue; + if (fd != stdin) + fclose(fd); olddev = flag1; oldmach = flag2; while (cp = index(dev, '/')) *cp = '@'; @@ -414,6 +444,8 @@ struct save_queue *machs; quotasum = 0; } if (gid != prevuid) { + if (cp = hash_lookup(groups, prevuid)) + prevuid = atoi(cp + 1); if (quotasum) fprintf(fd, "%d %d\n", prevuid, quotasum); prevuid = gid; @@ -423,6 +455,8 @@ struct save_queue *machs; } } EXEC SQL CLOSE q_cursor2; + if (cp = hash_lookup(groups, prevuid)) + prevuid = atoi(cp + 1); if (quotasum) fprintf(fd, "%d %d\n", prevuid, quotasum); if (fd != stdin && fclose(fd) == EOF) { @@ -431,6 +465,7 @@ struct save_queue *machs; } olddev = oldmach = -1; + fd = stdin; EXEC SQL DECLARE q_cursor3 CURSOR FOR SELECT DISTINCT f.name, f.lockertype, u.uid, l.gid, f.phys_id, @@ -439,7 +474,7 @@ struct save_queue *machs; WHERE u.users_id = f.owner AND l.list_id = f.owners AND f.createflg != 0 AND f.phys_id != 0 AND - f.type = "NFS" AND + f.type = 'NFS' AND f.phys_id = n.nfsphys_id ORDER BY mach_id, phys_id; EXEC SQL OPEN q_cursor3; @@ -448,7 +483,8 @@ struct save_queue *machs; :flag2, :dev; if (sqlca.sqlcode != 0) break; if (flag1 != olddev || flag2 != oldmach) { - fclose(fd); + if (fd != stdin) + fclose(fd); olddev = flag1; oldmach = flag2; while (cp = index(dev, '/')) *cp = '@'; -- 2.45.2