Errata from Johannes Leveling
[idzebra-moved-to-github.git] / doc / administration.xml
1 <chapter id="administration">
2  <!-- $Id: administration.xml,v 1.12 2002-10-30 11:09:39 adam Exp $ -->
3  <title>Administrating Zebra</title>
4  <!-- ### It's a bit daft that this chapter (which describes half of
5           the configuration-file formats) is separated from
6           "recordmodel.xml" (which describes the other half) by the
7           instructions on running zebraidx and zebrasrv.  Some careful
8           re-ordering is required here.
9  -->
10
11  <para>
12   Unlike many simpler retrieval systems, Zebra supports safe, incremental
13   updates to an existing index.
14  </para>
15  
16  <para>
17   Normally, when Zebra modifies the index it reads a number of records
18   that you specify.
19   Depending on your specifications and on the contents of each record
20   one the following events take place for each record:
21   <variablelist>
22    
23    <varlistentry>
24     <term>Insert</term>
25     <listitem>
26      <para>
27       The record is indexed as if it never occurred before.
28       Either the Zebra system doesn't know how to identify the record or
29       Zebra can identify the record but didn't find it to be already indexed.
30      </para>
31     </listitem>
32    </varlistentry>
33    <varlistentry>
34     <term>Modify</term>
35     <listitem>
36      <para>
37       The record has already been indexed.
38       In this case either the contents of the record or the location
39       (file) of the record indicates that it has been indexed before.
40      </para>
41     </listitem>
42    </varlistentry>
43    <varlistentry>
44     <term>Delete</term>
45     <listitem>
46      <para>
47       The record is deleted from the index. As in the
48       update-case it must be able to identify the record.
49      </para>
50     </listitem>
51    </varlistentry>
52   </variablelist>
53  </para>
54  
55  <para>
56   Please note that in both the modify- and delete- case the Zebra
57   indexer must be able to generate a unique key that identifies the record 
58   in question (more on this below).
59  </para>
60  
61  <para>
62   To administrate the Zebra retrieval system, you run the
63   <literal>zebraidx</literal> program.
64   This program supports a number of options which are preceded by a dash,
65   and a few commands (not preceded by dash).
66 </para>
67  
68  <para>
69   Both the Zebra administrative tool and the Z39.50 server share a
70   set of index files and a global configuration file.
71   The name of the configuration file defaults to
72   <literal>zebra.cfg</literal>.
73   The configuration file includes specifications on how to index
74   various kinds of records and where the other configuration files
75   are located. <literal>zebrasrv</literal> and <literal>zebraidx</literal>
76   <emphasis>must</emphasis> be run in the directory where the
77   configuration file lives unless you indicate the location of the 
78   configuration file by option <literal>-c</literal>.
79  </para>
80  
81  <sect1 id="record-types">
82   <title>Record Types</title>
83   
84   <para>
85    Indexing is a per-record process, in which either insert/modify/delete
86    will occur. Before a record is indexed search keys are extracted from
87    whatever might be the layout the original record (sgml,html,text, etc..).
88    The Zebra system currently supports two fundamental types of records:
89    structured and simple text.
90    To specify a particular extraction process, use either the
91    command line option <literal>-t</literal> or specify a
92    <literal>recordType</literal> setting in the configuration file.
93   </para>
94   
95  </sect1>
96  
97  <sect1 id="configuration-file">
98   <title>The Zebra Configuration File</title>
99   
100   <para>
101    The Zebra configuration file, read by <literal>zebraidx</literal> and
102    <literal>zebrasrv</literal> defaults to <literal>zebra.cfg</literal>
103    unless specified by <literal>-c</literal> option.
104   </para>
105   
106   <para>
107    You can edit the configuration file with a normal text editor.
108    parameter names and values are separated by colons in the file. Lines
109    starting with a hash sign (<literal>#</literal>) are
110    treated as comments.
111   </para>
112   
113   <para>
114    If you manage different sets of records that share common
115    characteristics, you can organize the configuration settings for each
116    type into "groups".
117    When <literal>zebraidx</literal> is run and you wish to address a
118    given group you specify the group name with the <literal>-g</literal>
119    option.
120    In this case settings that have the group name as their prefix 
121    will be used by <literal>zebraidx</literal>.
122    If no <literal>-g</literal> option is specified, the settings
123    without prefix are used.
124   </para>
125   
126   <para>
127    In the configuration file, the group name is placed before the option
128    name itself, separated by a dot (.). For instance, to set the record type
129    for group <literal>public</literal> to <literal>grs.sgml</literal>
130    (the SGML-like format for structured records) you would write:
131   </para>
132   
133   <para>
134    <screen>
135     public.recordType: grs.sgml
136    </screen>   
137   </para>
138   
139   <para>
140    To set the default value of the record type to <literal>text</literal>
141    write:
142   </para>
143   
144   <para>
145    <screen>
146     recordType: text
147    </screen>
148   </para>
149   
150   <para>
151    The available configuration settings are summarized below. They will be
152    explained further in the following sections.
153   </para>
154   
155   <!--
156    FIXME - Didn't Adam make something to have multiple databases in multiple dirs...
157   -->
158   
159   <para>
160    <variablelist>
161     
162     <varlistentry>
163      <term>
164       <emphasis>group</emphasis>
165       .recordType[<emphasis>.name</emphasis>]:
166       <replaceable>type</replaceable>
167      </term>
168      <listitem>
169       <para>
170        Specifies how records with the file extension
171        <emphasis>name</emphasis> should be handled by the indexer.
172        This option may also be specified as a command line option
173        (<literal>-t</literal>). Note that if you do not specify a
174        <emphasis>name</emphasis>, the setting applies to all files.
175        In general, the record type specifier consists of the elements (each
176        element separated by dot), <emphasis>fundamental-type</emphasis>,
177        <emphasis>file-read-type</emphasis> and arguments. Currently, two
178        fundamental types exist, <literal>text</literal> and
179        <literal>grs</literal>.
180       </para>
181      </listitem>
182     </varlistentry>
183     <varlistentry>
184      <term><emphasis>group</emphasis>.recordId: 
185      <replaceable>record-id-spec</replaceable></term>
186      <listitem>
187       <para>
188        Specifies how the records are to be identified when updated. See
189        <xref linkend="locating-records"/>.
190       </para>
191      </listitem>
192     </varlistentry>
193     <varlistentry>
194      <term><emphasis>group</emphasis>.database:
195      <replaceable>database</replaceable></term>
196      <listitem>
197       <para>
198        Specifies the Z39.50 database name.
199        <!-- FIXME - now we can have multiple databases in one server. -H -->
200       </para>
201      </listitem>
202     </varlistentry>
203     <varlistentry>
204      <term><emphasis>group</emphasis>.storeKeys:
205      <replaceable>boolean</replaceable></term>
206      <listitem>
207       <para>
208        Specifies whether key information should be saved for a given
209        group of records. If you plan to update/delete this type of
210        records later this should be specified as 1; otherwise it
211        should be 0 (default), to save register space.
212        <!-- ### this is the first mention of "register" -->
213        See <xref linkend="file-ids"/>.
214       </para>
215      </listitem>
216     </varlistentry>
217     <varlistentry>
218      <term><emphasis>group</emphasis>.storeData:
219       <replaceable>boolean</replaceable></term>
220      <listitem>
221       <para>
222        Specifies whether the records should be stored internally
223        in the Zebra system files.
224        If you want to maintain the raw records yourself,
225        this option should be false (0).
226        If you want Zebra to take care of the records for you, it
227        should be true(1).
228       </para>
229      </listitem>
230     </varlistentry>
231     <varlistentry>
232      <!-- ### probably a better place to define "register" -->
233      <term>register: <replaceable>register-location</replaceable></term>
234      <listitem>
235       <para>
236        Specifies the location of the various register files that Zebra uses
237        to represent your databases.
238        See <xref linkend="register-location"/>.
239       </para>
240      </listitem>
241     </varlistentry>
242     <varlistentry>
243      <term>shadow: <replaceable>register-location</replaceable></term>
244      <listitem>
245       <para>
246        Enables the <emphasis>safe update</emphasis> facility of Zebra, and
247        tells the system where to place the required, temporary files.
248        See <xref linkend="shadow-registers"/>.
249       </para>
250      </listitem>
251     </varlistentry>
252     <varlistentry>
253      <term>lockDir: <replaceable>directory</replaceable></term>
254      <listitem>
255       <para>
256        Directory in which various lock files are stored.
257       </para>
258      </listitem>
259     </varlistentry>
260     <varlistentry>
261      <term>keyTmpDir: <replaceable>directory</replaceable></term>
262      <listitem>
263       <para>
264        Directory in which temporary files used during zebraidx's update
265        phase are stored. 
266       </para>
267      </listitem>
268     </varlistentry>
269     <varlistentry>
270      <term>setTmpDir: <replaceable>directory</replaceable></term>
271      <listitem>
272       <para>
273        Specifies the directory that the server uses for temporary result sets.
274        If not specified <literal>/tmp</literal> will be used.
275       </para>
276      </listitem>
277     </varlistentry>
278     <varlistentry>
279      <term>profilePath: <literal>path</literal></term>
280      <listitem>
281       <para>
282        Specifies a path of profile specification files. 
283        The path is composed of one or more directories separated by
284        colon. Similar to PATH for UNIX systems.
285       </para>
286      </listitem>
287     </varlistentry>
288     <varlistentry>
289      <term>attset: <replaceable>filename</replaceable></term>
290      <listitem>
291       <para>
292        Specifies the filename(s) of attribute set files for use in
293        searching. At least the Bib-1 set should be loaded
294        (<literal>bib1.att</literal>).
295        The <literal>profilePath</literal> setting is used to look for
296        the specified files.
297        See <xref linkend="attset-files"/>
298       </para>
299      </listitem>
300     </varlistentry>
301     <varlistentry>
302      <term>memMax: <replaceable>size</replaceable></term>
303      <listitem>
304       <para>
305        Specifies <replaceable>size</replaceable> of internal memory
306        to use for the zebraidx program.
307        The amount is given in megabytes - default is 4 (4 MB).
308       </para>
309      </listitem>
310     </varlistentry>
311
312     <varlistentry>
313      <term>root: <replaceable>dir</replaceable></term>
314      <listitem>
315       <para>
316        Specifies a directory base for Zebra. All relative paths
317        given (in profilePath, register, shadow) are based on this
318        directory. This setting is useful if your Zebra server
319        is running in a different directory from where
320        <literal>zebra.cfg</literal> is located.
321       </para>
322      </listitem>
323     </varlistentry>
324
325    </variablelist>
326   </para>
327   
328  </sect1>
329  
330  <sect1 id="locating-records">
331   <title>Locating Records</title>
332   
333   <para>
334    The default behavior of the Zebra system is to reference the
335    records from their original location, i.e. where they were found when you
336    ran <literal>zebraidx</literal>.
337    That is, when a client wishes to retrieve a record
338    following a search operation, the files are accessed from the place
339    where you originally put them - if you remove the files (without
340    running <literal>zebraidx</literal> again, the server will return
341    diagnostic number 14 (``System error in presenting records'') to
342    the client.
343   </para>
344   
345   <para>
346    If your input files are not permanent - for example if you retrieve
347    your records from an outside source, or if they were temporarily
348    mounted on a CD-ROM drive,
349    you may want Zebra to make an internal copy of them. To do this,
350    you specify 1 (true) in the <literal>storeData</literal> setting. When
351    the Z39.50 server retrieves the records they will be read from the
352    internal file structures of the system.
353   </para>
354   
355  </sect1>
356  
357  <sect1 id="simple-indexing">
358   <title>Indexing with no Record IDs (Simple Indexing)</title>
359   
360   <para>
361    If you have a set of records that are not expected to change over time
362    you may can build your database without record IDs.
363    This indexing method uses less space than the other methods and
364    is simple to use. 
365   </para>
366   
367   <para>
368    To use this method, you simply omit the <literal>recordId</literal> entry
369    for the group of files that you index. To add a set of records you use
370    <literal>zebraidx</literal> with the <literal>update</literal> command. The
371    <literal>update</literal> command will always add all of the records that it
372    encounters to the index - whether they have already been indexed or
373    not. If the set of indexed files change, you should delete all of the
374    index files, and build a new index from scratch.
375   </para>
376   
377   <para>
378    Consider a system in which you have a group of text files called
379    <literal>simple</literal>.
380    That group of records should belong to a Z39.50 database called
381    <literal>textbase</literal>.
382    The following <literal>zebra.cfg</literal> file will suffice:
383   </para>
384   <para>
385    
386    <screen>
387     profilePath: /usr/local/yaz
388     attset: bib1.att
389     simple.recordType: text
390     simple.database: textbase
391    </screen>
392
393   </para>
394   
395   <para>
396    Since the existing records in an index can not be addressed by their
397    IDs, it is impossible to delete or modify records when using this method.
398   </para>
399   
400  </sect1>
401  
402  <sect1 id="file-ids">
403   <title>Indexing with File Record IDs</title>
404   
405   <para>
406    If you have a set of files that regularly change over time: Old files
407    are deleted, new ones are added, or existing files are modified, you
408    can benefit from using the <emphasis>file ID</emphasis>
409    indexing methodology.
410    Examples of this type of database might include an index of WWW
411    resources, or a USENET news spool area.
412    Briefly speaking, the file key methodology uses the directory paths
413    of the individual records as a unique identifier for each record.
414    To perform indexing of a directory with file keys, again, you specify
415    the top-level directory after the <literal>update</literal> command.
416    The command will recursively traverse the directories and compare
417    each one with whatever have been indexed before in that same directory.
418    If a file is new (not in the previous version of the directory) it
419    is inserted into the registers; if a file was already indexed and
420    it has been modified since the last update, the index is also
421    modified; if a file has been removed since the last
422    visit, it is deleted from the index.
423   </para>
424   
425   <para>
426    The resulting system is easy to administrate. To delete a record you
427    simply have to delete the corresponding file (say, with the
428    <literal>rm</literal> command). And to add records you create new
429    files (or directories with files). For your changes to take effect
430    in the register you must run <literal>zebraidx update</literal> with
431    the same directory root again. This mode of operation requires more
432    disk space than simpler indexing methods, but it makes it easier for
433    you to keep the index in sync with a frequently changing set of data.
434    If you combine this system with the <emphasis>safe update</emphasis>
435    facility (see below), you never have to take your server off-line for
436    maintenance or register updating purposes.
437   </para>
438   
439   <para>
440    To enable indexing with pathname IDs, you must specify
441    <literal>file</literal> as the value of <literal>recordId</literal>
442    in the configuration file. In addition, you should set
443    <literal>storeKeys</literal> to <literal>1</literal>, since the Zebra
444    indexer must save additional information about the contents of each record
445    in order to modify the indexes correctly at a later time.
446   </para>
447   
448    <!--
449     FIXME - There must be a simpler way to do this with Adams string tags -H
450      -->
451
452   <para>
453    For example, to update records of group <literal>esdd</literal>
454    located below
455    <literal>/data1/records/</literal> you should type:
456    <screen>
457     $ zebraidx -g esdd update /data1/records
458    </screen>
459   </para>
460   
461   <para>
462    The corresponding configuration file includes:
463    <screen>
464     esdd.recordId: file
465     esdd.recordType: grs.sgml
466     esdd.storeKeys: 1
467    </screen>
468   </para>
469   
470   <note>
471    <para>You cannot start out with a group of records with simple
472     indexing (no record IDs as in the previous section) and then later
473     enable file record Ids. Zebra must know from the first time that you
474     index the group that
475     the files should be indexed with file record IDs.
476    </para>
477    </note>
478   
479   <para>
480    You cannot explicitly delete records when using this method (using the
481    <literal>delete</literal> command to <literal>zebraidx</literal>. Instead
482    you have to delete the files from the file system (or move them to a
483    different location)
484    and then run <literal>zebraidx</literal> with the
485    <literal>update</literal> command.
486   </para>
487   <!-- ### what happens if a file contains multiple records? -->
488 </sect1>
489  
490  <sect1 id="generic-ids">
491   <title>Indexing with General Record IDs</title>
492   
493   <para>
494    When using this method you construct an (almost) arbitrary, internal
495    record key based on the contents of the record itself and other system
496    information. If you have a group of records that explicitly associates
497    an ID with each record, this method is convenient. For example, the
498    record format may contain a title or a ID-number - unique within the group.
499    In either case you specify the Z39.50 attribute set and use-attribute
500    location in which this information is stored, and the system looks at
501    that field to determine the identity of the record.
502   </para>
503   
504   <para>
505    As before, the record ID is defined by the <literal>recordId</literal>
506    setting in the configuration file. The value of the record ID specification
507    consists of one or more tokens separated by whitespace. The resulting
508    ID is represented in the index by concatenating the tokens and
509    separating them by ASCII value (1).
510   </para>
511   
512   <para>
513    There are three kinds of tokens:
514    <variablelist>
515     
516     <varlistentry>
517      <term>Internal record info</term>
518      <listitem>
519       <para>
520        The token refers to a key that is
521        extracted from the record. The syntax of this token is
522        <literal>(</literal> <emphasis>set</emphasis> <literal>,</literal>
523        <emphasis>use</emphasis> <literal>)</literal>,
524        where <emphasis>set</emphasis> is the
525        attribute set name <emphasis>use</emphasis> is the
526        name or value of the attribute.
527       </para>
528      </listitem>
529     </varlistentry>
530     <varlistentry>
531      <term>System variable</term>
532      <listitem>
533       <para>
534        The system variables are preceded by
535        
536        <screen>
537         $
538        </screen>
539        and immediately followed by the system variable name, which
540        may one of
541        <variablelist>
542         
543         <varlistentry>
544          <term>group</term>
545          <listitem>
546           <para>
547            Group name.
548           </para>
549          </listitem>
550         </varlistentry>
551         <varlistentry>
552          <term>database</term>
553          <listitem>
554           <para>
555            Current database specified.
556           </para>
557          </listitem>
558         </varlistentry>
559         <varlistentry>
560          <term>type</term>
561          <listitem>
562           <para>
563            Record type.
564           </para>
565          </listitem>
566         </varlistentry>
567        </variablelist>
568       </para>
569      </listitem>
570     </varlistentry>
571     <varlistentry>
572      <term>Constant string</term>
573      <listitem>
574       <para>
575        A string used as part of the ID &mdash; surrounded
576        by single- or double quotes.
577       </para>
578      </listitem>
579     </varlistentry>
580    </variablelist>
581   </para>
582   
583   <para>
584    For instance, the sample GILS records that come with the Zebra
585    distribution contain a unique ID in the data tagged Control-Identifier.
586    The data is mapped to the Bib-1 use attribute Identifier-standard
587    (code 1007). To use this field as a record id, specify
588    <literal>(bib1,Identifier-standard)</literal> as the value of the
589    <literal>recordId</literal> in the configuration file.
590    If you have other record types that uses the same field for a
591    different purpose, you might add the record type
592    (or group or database name) to the record id of the gils
593    records as well, to prevent matches with other types of records.
594    In this case the recordId might be set like this:
595    
596    <screen>
597     gils.recordId: $type (bib1,Identifier-standard)
598    </screen>
599    
600   </para>
601   
602   <para>
603    (see <xref linkend="data-model"/>
604     for details of how the mapping between elements of your records and
605     searchable attributes is established).
606   </para>
607   
608   <para>
609    As for the file record ID case described in the previous section,
610    updating your system is simply a matter of running
611    <literal>zebraidx</literal>
612    with the <literal>update</literal> command. However, the update with general
613    keys is considerably slower than with file record IDs, since all files
614    visited must be (re)read to discover their IDs. 
615   </para>
616   
617   <para>
618    As you might expect, when using the general record IDs
619    method, you can only add or modify existing records with the
620    <literal>update</literal> command.
621    If you wish to delete records, you must use the,
622    <literal>delete</literal> command, with a directory as a parameter.
623    This will remove all records that match the files below that root
624    directory.
625   </para>
626   
627  </sect1>
628  
629  <sect1 id="register-location">
630   <title>Register Location</title>
631   
632   <para>
633    Normally, the index files that form dictionaries, inverted
634    files, record info, etc., are stored in the directory where you run
635    <literal>zebraidx</literal>. If you wish to store these, possibly large,
636    files somewhere else, you must add the <literal>register</literal>
637    entry to the <literal>zebra.cfg</literal> file.
638    Furthermore, the Zebra system allows its file
639    structures to span multiple file systems, which is useful for
640    managing very large databases. 
641   </para>
642   
643   <para>
644    The value of the <literal>register</literal> setting is a sequence
645    of tokens. Each token takes the form:
646    
647    <screen>
648     <emphasis>dir</emphasis><literal>:</literal><emphasis>size</emphasis>. 
649    </screen>
650    
651    The <emphasis>dir</emphasis> specifies a directory in which index files
652    will be stored and the <emphasis>size</emphasis> specifies the maximum
653    size of all files in that directory. The Zebra indexer system fills
654    each directory in the order specified and use the next specified
655    directories as needed.
656    The <emphasis>size</emphasis> is an integer followed by a qualifier
657    code, 
658    <literal>b</literal> for bytes,
659    <literal>k</literal> for kilobytes.
660    <literal>M</literal> for megabytes,
661    <literal>G</literal> for gigabytes.
662   </para>
663   
664   <para>
665    For instance, if you have allocated two disks for your register, and
666    the first disk is mounted
667    on <literal>/d1</literal> and has 2GB of free space and the
668    second, mounted on <literal>/d2</literal> has 3.6 GB, you could
669    put this entry in your configuration file:
670    
671    <screen>
672     register: /d1:2G /d2:3600M
673    </screen>
674    
675   </para>
676   
677   <para>
678    Note that Zebra does not verify that the amount of space specified is
679    actually available on the directory (file system) specified - it is
680    your responsibility to ensure that enough space is available, and that
681    other applications do not attempt to use the free space. In a large
682    production system, it is recommended that you allocate one or more
683    file system exclusively to the Zebra register files.
684   </para>
685   
686  </sect1>
687  
688  <sect1 id="shadow-registers">
689   <title>Safe Updating - Using Shadow Registers</title>
690   
691   <sect2>
692    <title>Description</title>
693    
694    <para>
695     The Zebra server supports <emphasis>updating</emphasis> of the index
696     structures. That is, you can add, modify, or remove records from
697     databases managed by Zebra without rebuilding the entire index.
698     Since this process involves modifying structured files with various
699     references between blocks of data in the files, the update process
700     is inherently sensitive to system crashes, or to process interruptions:
701     Anything but a successfully completed update process will leave the
702     register files in an unknown state, and you will essentially have no
703     recourse but to re-index everything, or to restore the register files
704     from a backup medium.
705     Further, while the update process is active, users cannot be
706     allowed to access the system, as the contents of the register files
707     may change unpredictably.
708    </para>
709    
710    <para>
711     You can solve these problems by enabling the shadow register system in
712     Zebra.
713     During the updating procedure, <literal>zebraidx</literal> will temporarily
714     write changes to the involved files in a set of "shadow
715     files", without modifying the files that are accessed by the
716     active server processes. If the update procedure is interrupted by a
717     system crash or a signal, you simply repeat the procedure - the
718     register files have not been changed or damaged, and the partially
719     written shadow files are automatically deleted before the new updating
720     procedure commences.
721    </para>
722    
723    <para>
724     At the end of the updating procedure (or in a separate operation, if
725     you so desire), the system enters a "commit mode". First,
726     any active server processes are forced to access those blocks that
727     have been changed from the shadow files rather than from the main
728     register files; the unmodified blocks are still accessed at their
729     normal location (the shadow files are not a complete copy of the
730     register files - they only contain those parts that have actually been
731     modified). If the commit process is interrupted at any point during the
732     commit process, the server processes will continue to access the
733     shadow files until you can repeat the commit procedure and complete
734     the writing of data to the main register files. You can perform
735     multiple update operations to the registers before you commit the
736     changes to the system files, or you can execute the commit operation
737     at the end of each update operation. When the commit phase has
738     completed successfully, any running server processes are instructed to
739     switch their operations to the new, operational register, and the
740     temporary shadow files are deleted.
741    </para>
742    
743   </sect2>
744   
745   <sect2>
746    <title>How to Use Shadow Register Files</title>
747    
748    <para>
749     The first step is to allocate space on your system for the shadow
750     files.
751     You do this by adding a <literal>shadow</literal> entry to the
752     <literal>zebra.cfg</literal> file.
753     The syntax of the <literal>shadow</literal> entry is exactly the
754     same as for the <literal>register</literal> entry
755     (see <xref linkend="register-location"/>).
756      The location of the shadow area should be
757      <emphasis>different</emphasis> from the location of the main register
758      area (if you have specified one - remember that if you provide no
759      <literal>register</literal> setting, the default register area is the
760      working directory of the server and indexing processes).
761    </para>
762    
763    <para>
764     The following excerpt from a <literal>zebra.cfg</literal> file shows
765     one example of a setup that configures both the main register
766     location and the shadow file area.
767     Note that two directories or partitions have been set aside
768     for the shadow file area. You can specify any number of directories
769     for each of the file areas, but remember that there should be no
770     overlaps between the directories used for the main registers and the
771     shadow files, respectively.
772    </para>
773    <para>
774     
775     <screen>
776      register: /d1:500M
777      
778      shadow: /scratch1:100M /scratch2:200M
779     </screen>
780     
781    </para>
782    
783    <para>
784     When shadow files are enabled, an extra command is available at the
785     <literal>zebraidx</literal> command line.
786     In order to make changes to the system take effect for the
787     users, you'll have to submit a "commit" command after a
788     (sequence of) update operation(s).
789    </para>
790    
791    <para>
792     
793     <screen>
794      $ zebraidx update /d1/records 
795      $ zebraidx commit
796     </screen>
797     
798    </para>
799    
800    <para>
801     Or you can execute multiple updates before committing the changes:
802    </para>
803    
804    <para>
805     
806     <screen>
807      $ zebraidx -g books update /d1/records  /d2/more-records
808      $ zebraidx -g fun update /d3/fun-records
809      $ zebraidx commit
810     </screen>
811     
812    </para>
813    
814    <para>
815     If one of the update operations above had been interrupted, the commit
816     operation on the last line would fail: <literal>zebraidx</literal>
817     will not let you commit changes that would destroy the running register.
818     You'll have to rerun all of the update operations since your last
819     commit operation, before you can commit the new changes.
820    </para>
821    
822    <para>
823     Similarly, if the commit operation fails, <literal>zebraidx</literal>
824     will not let you start a new update operation before you have
825     successfully repeated the commit operation.
826     The server processes will keep accessing the shadow files rather
827     than the (possibly damaged) blocks of the main register files
828     until the commit operation has successfully completed.
829    </para>
830    
831    <para>
832     You should be aware that update operations may take slightly longer
833     when the shadow register system is enabled, since more file access
834     operations are involved. Further, while the disk space required for
835     the shadow register data is modest for a small update operation, you
836     may prefer to disable the system if you are adding a very large number
837     of records to an already very large database (we use the terms
838     <emphasis>large</emphasis> and <emphasis>modest</emphasis>
839     very loosely here, since every application will have a
840     different perception of size).
841     To update the system without the use of the the shadow files,
842     simply run <literal>zebraidx</literal> with the <literal>-n</literal>
843     option (note that you do not have to execute the
844     <emphasis>commit</emphasis> command of <literal>zebraidx</literal>
845     when you temporarily disable the use of the shadow registers in
846     this fashion.
847     Note also that, just as when the shadow registers are not enabled,
848     server processes will be barred from accessing the main register
849     while the update procedure takes place.
850    </para>
851    
852   </sect2>
853   
854  </sect1>
855  
856 </chapter>
857  <!-- Keep this comment at the end of the file
858  Local variables:
859  mode: sgml
860  sgml-omittag:t
861  sgml-shorttag:t
862  sgml-minimize-attributes:nil
863  sgml-always-quote-attributes:t
864  sgml-indent-step:1
865  sgml-indent-data:t
866  sgml-parent-document: "zebra.xml"
867  sgml-local-catalogs: nil
868  sgml-namecase-general:t
869  End:
870  -->