From c5f4d7f6a085bd007dbbd532c5e8b07676e3f39c Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Tue, 31 Jan 1989 11:59:56 +0000 Subject: [PATCH] ING_DB --- WEGA/contrib/ingres/dbs/ing_src/teil2/lock | 368 +++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 WEGA/contrib/ingres/dbs/ing_src/teil2/lock diff --git a/WEGA/contrib/ingres/dbs/ing_src/teil2/lock b/WEGA/contrib/ingres/dbs/ing_src/teil2/lock new file mode 100644 index 0000000..f54413e --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_src/teil2/lock @@ -0,0 +1,368 @@ +.lp 66 +.ds RH \f3LOCK-DEV \f1 +.ds RF \f3ING_DB \f +.ds LH Anwendung +.ds LF ING_DB 6.3/0 +.bp +.NH 2 +.ft B +Installieren des ING_DB +.br + lock-device *** +.ft R +.LP +.sp 10 +.NH 3 +.ft B +\o'U"'berblick +.ft R +.LP +ING_DB 6.3/0 +hat einen vollst\o'a"'ndigen concurrency control Mechanismus. +ING_DB 6.3/0 setzt und l\o'o"'scht Sperren (locks) +durch Schrei\%ben in ein device, +das "/dev/lock" genannt wird. +Wenn das device nicht zum Schreiben er\o'o"'ffnet werden kann, +l\o'a"'uft +ING_DB 6.3/0 ohne concurrency control. +.LP +Anfangs ist es ratsam, +ING_DB 6.3/0 ohne concurrency control aufzubauen. +Wenn die geplante Nutzung von +ING_DB 6.3/0 concurrency control erfordert, +muss man das "/dev/lock" in UNIX (V7), also einen entsprechenden +Driver in\%stallieren. +.NH 3 +.ft B +Arbeitsschritte +.ft R +.NH 4 +.ft B +\o'U"'bersetzen des concurrency device +.ft R +.LP +Sie melden sich als "root" an. +Das concurrency device besteht aus zwei Files: +.br + .../source/support/ildr.c und +.br + .../source/support/ildr.h +.br +.LP +Das source-File ist in /usr/sys/dev/ildr.c und +das header-File in /usr/sys/h/ildr.h umzubenennen. +.br + mv .../source/support/ildr.c /usr/sys/dev/ildr.c +.br + mv .../source/support/ildr.h /usr/sys/h/ildr.h +.br +.LP +Es gibt einen Parameter in m.h, mit dem der Nutzer festlegen kann, +wo die lock table liegen soll. +Mit +.br + #define XLOCK +.br +wird die lock table ausserhalb des Kerns angelegt. +Im Kern liegt sie, wenn diese Zeile ein Kommentar ist: +.br + /*#define XLOCK */ +.br +Es gibt einige Parameter in ildr.h, die der Nutzer setzen kann: +.DS I +NLOCKS Anzahl der locks +PLOCKS page locks +RLOCKS relation locks +DLOCKS database locks +.DE +NLOCKS ist die Anzahl der erlaubten locks. Sie +bestimmt die Gr\o'o"'sse der lock table. +PLOCKS ist die gr\o'o"'sste Zahl der page, relation und database locks. +RLOCKS ist die gr\o'o"'sste Zahl der relation und database locks. +DLOCKS ist die gr\o'o"'sste Zahl der database locks. +ING_DB 6.3/0 kann nur DLOCKS-mal gleichzeitig aktiv sein. +.LP +Die folgenden Bedingungen m\o'u"'ssen erf\o'u"'llt sein, +um gegen deadlock durch lock table \o'U"'berlauf gesch\o'u"'tzt zu sein. +.br + NLOCKS > PLOCKS > RLOCKS > DLOCKS + 6 +.LP +Die Zahl RLOCKS ist erforderlich, +damit 6-Variablen-Queries laufen k\o'o"'nnen. +.LP +Wir empfehlen zuerst DLOCKS festzulegen +und dann die anderen Parameter zu setzen: +.DS I +RLOCKS = 2 * DLOCKS + 6 +PLOCKS = RLOCKS + 3 +NLOCKS = PLOCKS + 1 +.DE +Z.B. k\o'o"'nnte man, um die Gr\o'o"'sse der lock table zu ver\%kleinern, +DLOCKS = 2, RLOCKS = 10, PLOCKS = 13 und NLOCKS = 14 setzen. +In diesem Fall k\o'o"'nnten nur zwei Personen gleichzeitig mit +ING_DB 6.3/0 arbeiten. +In einem anderen Beispiel k\o'o"'nnte man +DLOCKS = 20, RLOCKS = 46, PLOCKS = 49 und NLOCKS = 50 setzen. Das +w\o'u"'rde 20 +ING_DB 6.3/0-Nutzern simultane Arbeit erm\o'o"'glichen. +.LP +Der f\o'u"'r den lock-Driver erforderliche +Speicherplatz betr\o'a"'gt 1008 Byte +im text segment und 36 + 18 * NLOCKS im data and bss segment. +(Nur wenn XLOCK in m.h nicht definiert wurde.) +.LP +Das current directory wird in das Verzeichnis ge\o'a"'ndert, das die device-Driver enth\o'a"'llt. +.br + cd /usr/sys/dev +.br +.NH 4 +.ft B +\o'U"'bersetzen und Ablegen der +.br + UNIX-Library +.ft R +.LP +Der UNIX-Objektcode ist in zwei +Bibliotheken eingeteilt, LIB1 (Systemcode) +und LIB2 (device-Driver). +Das File ildr.c ist zu \o'u"'bersetzen und dann in LIB2 abzulegen. +.DS I +cc -c -O ildr.c +ar rv LIB2 ildr.o +.DE +.NH 4 +.ft B +Ablegen der Systemroutine exit() +.ft R +.LP +Das current-Directory wird in das Verzeichnis f\o'u"'r +den Systemcode ge\o'a"'ndert. +.DS I +cd ../sys +.DE +Editieren von /usr/sys/sys/sys1.c : +.LP +Der system exit call muss ge\o'a"'ndert werden, um das +concurrency device rufen zu k\o'o"'nnen, +wenn ING_DB 6.3/0 unnormal beendet wird, +z.B. der Prozess gekillt wird oder ein Systemfehler auftritt. +Der Aufruf "ildrm(q->p_pid)" muss in exit() im File /usr/sys/sys/sys1.c +nach der Zeile "q->p_stat = SZOMB;" +hinzugef\o'u"'gt werden. Der Quelltext von exit wird dann so aussehen: +.LP +.nf +exit(rv) +{ + register int i; + register struct proc *p, *q; + register struct file *f; + + p = u.u_procp; + p->p_flag &= ~(STRC|SULOCK); + p->p_clktim = 0; + for(i=0; ip_size, p->p_addr); + p->p_stat = SZOMB; + /* + * remove outstanding locks + * for the dying process + */ + ilrma(p->p_pid); + ((struct xproc *)p)->xp_xstat = rv; + ((struct xproc *)p)->xp_utime = u.u_cutime + + u.u_utime; + ((struct xproc *)p)->xp_stime = u.u_cstime + + u.u_stime; +#ifndef EXIT + for(q = &proc[0]; q <= MAX_PROC; q++) + if(q->p_ppid == p->p_pid) { + wakeup((caddr_t)&proc[1]); + q->p_ppid = 1; + if (q->p_stat==SSTOP) + setrun(q); + } + for(q = &proc[0]; q <= MAX_PROC; q++) + if(p->p_ppid == q->p_pid) { + wakeup((caddr_t)q); + swtch(); + /* no return */ + } + swtch(); +#else + for(i = 0, q = &proc[0]; + q <= MAX_PROC; q++){ + if(q->p_ppid == p->p_pid){ + q->p_ppid = 1; + if(q->p_stat == SZOMB) + i++; + else if(q->p_stat == SSTOP) + setrun(q); + } + else if(q->p_pid == p->p_ppid){ + wakeup(q); + } + } + if(i) + wakeup(&proc[1]); + swtch(); +#endif EXIT +} +.fi + +Ablegen von /usr/sys/sys/LIB1 : +.LP +Das File sys1.c wird \o'u"'bersetzt und sys1.o in LIB1 gebracht. +.DS I +cc -c -O sys1.c +ar rv LIB1 sys1.o +.DE +.NH 4 +.ft B +Installieren des device in das +.br +UNIX-Filesystem +.ft R +.LP +Um ein device in UNIX +zu in\%stallieren, ist die Konfiguration zu \o'a"'ndern. +.LP +Das current-Directory wird in das Verzeichnis ge\o'a"'ndert, +das das configuration-File c.c enth\o'a"'lt. +.br +.DS I +cd /usr/sys/conf +.DE +Editieren von /usr/sys/conf/c.c : +.LP +Das configuration-File ist zu editieren und das lock device +in der character_device-Liste hinzuzuf\o'u"'gen. +Nach dem letzten device unter "cdevsw[]" ist folgende Zeile einzuf\o'u"'gen: +.br + nulldev, nulldev, nulldev, ilwrite, nulldev, nodev, 0, +.LP +Die Zeilennummer f\o'u"'r dieses device wird die major device number. +Zu beachten ist, das die Z\o'a"'hlung bei Null beginnt. +Dieser Schritt kann nicht gleichzeitig mit einer notwendigen +Systemneuerstellung erfolgen, da durch +.ft B +makeconf +.ft R +das File c.c erzeugt wird und die eingegebenen \o'A"'nderungen +wieder \o'u"'berschrieben werden. +Das Basisfile zu makeconf +.ft B +conf +.ft R +kennt die Informationen zu +.ft B +ilwrite +.ft R +nicht! +\o'U"'bersetzen von c.c : +.LP +Das configuration-File wird \o'u"'bersetzt +.DS I +cc -c c.c +.DE +.NH 4 +.ft B +Laden des Systems +.ft R +.LP +UNIX ist nun bereit zum reloading. +Folgende Files sind f\o'u"'r die individuelle In\%stallation wichtig: +.DS I +l.o +smch.o +c.o +.DE +Erzeugt werden sie mit folgenden Kommandos: +.DS I +as -o l.o l.s +cc -P smch.c;mv smch.i smch.s;as -o smch.o smch.s +cc -c c.c +ld -o ../unix -X l.o smch.o \\ + c.o ../sys/LIB1 ../dev/LIB2 +.DE +.NH 4 +.ft B +Vorbereiten zum reboot +.ft R +.LP +Das neue unix kann noch nicht /unix genannt werden. +Da die namelist ge\o'a"'ndert wurde, +muss man in den single user-Betrieb gehen. +.NH 4 +.ft B +Rebooting UNIX V.7 +.ft R +.LP +Das neue unix wird in das directory gebracht, aus dem gebootet wird: +.br + cp unix /unix +.LP +Jetzt wird das sync Kommando gegeben und das +System mit der normalen boot-Prozedur gestartet. +.NH 4 +.ft B +Hinzuf\o'u"'gen des device in /dev +.ft R +.LP +Das concurrency device muss in "/dev" gestellt werden, nachdem +UNIX gebootet wurde. +Folgendes Kommando wird ausgef\o'u"'hrt: +.DS I +/etc/mknod /dev/lock c major 0 +.DE +wobei "major" die major device number des lock device +im File c.c ist. +Die major device number ist +die Position des device in der "cdevsw[]" liste. +Man beachte, dass die Z\o'a"'hlung mit Null beginnt. +.LP +Nun wird der mode des device so ge\o'a"'ndert, +dass es schreibbar durch den owner +.ft B +ing_db +.ft R +wird. +.DS I +chown ing_db /dev/lock +chgrp ing_db /dev/lock +chmod 200 /dev/lock +.DE +.NH 3 +.ft B +Abschluss +.ft R +.LP +ING_DB wird nun das /dev/lock device f\o'u"'r sein +concurrency control benutzen. +Ein einfacher Weg, um dies zu pr\o'u"'fen, +ist, "purge" auf einer Datenbank zu versuchen, +w\o'a"'hrend ein anderer +auf der gleichen Datenbank arbeitet. +.LP +Ausser den Massnahmen, die hier exakt beschrieben +wurden, m\o'u"'ssen sie garantieren, dass die +Systemreserven (INODEs, FILE-Deskriptoren, Puffer, Anzahl +m\o'o"'glicher Prozesse, swap- und /tmp-Bereich) +ausreichen. Versuchen sie deshalb ersteinmal bescheidene +Dimensionen. +.OC