Making Search Collections Read-Only

Many administrative tasks require that the data on which they are operating does not change while that operation is taking place. The most common system-level examples of such operations are system administration tasks such as backups or replication, but data consistency is also required by some administrative Watson Explorer Engine operations, such as using a data export operation to create a new collection from an existing one (discussed in Creating a New Collection by Exporting Existing Collection Data).

Watson Explorer Engine enforces consistency within search collections by providing functions that put search collections into and take them out of read-only mode. When in read-only mode, collections can still respond to queries, but cannot be changed in significant way (including internal changes related to index merging and related optimizations). Read-only mode protects files in the search collection directory that meet one or more of the following criteria:

Watson Explorer Engine's read-only mode functions are the following:

The period of time that the crawler for a collection continues to run when that collection is put into read-only mode can be configured using the read-only-running-time crawl-option. See Crawler Configuration Options for information about this and other options for the Watson Explorer Engine crawler.

Files and directories that can change in a search collection directory when that search collection is in read-only mode are the following:

The following C# code example shows how to put a single search collection into read-only mode using the search-collection-read-only call, where v is the VelocityPortClient object, and collection is a string containing the name of the collection that you want to act on:

SearchCollectionReadOnly ro = new SearchCollectionReadOnly();
ro.Collection = collection;
ro.mode = SearchCollectionReadOnlyMode.enable;
SearchCollectionReadOnlyResponse ror = v.SearchCollectionReadOnly(ro);

The following code example shows the same task implemented in Java, where vp is the port associated with the service, and collection is a string containing the name of the collection that you want to act on:

SearchCollectionReadOnly ro = new SearchCollectionReadOnly();
ro.setCollection(collection);
ro.setMode("enable");
SearchCollectionReadOnlyResponse ror = vp.searchCollectionReadOnly(ro);

The following C# code example shows how to use the search-collection-read-only-all function to put all of your search collections in read-only mode, do whatever tasks you want to perform, and then return the collections to non-read-only mode:

SearchCollectionReadOnlyAll roa;
SearchCollectionReadOnlyAllResponse roar;

do
{
    roa = new SearchCollectionReadOnlyAll();
    roa.mode = SearchCollectionReadOnlyAllMode.enable;
    roar = v.SearchCollectionReadOnlyAll(roa);
} while (roar.readonlystateall.ndisabled > 0
           || roar.readonlystateall.npending > 0);

// now in read-only mode, do whatever ...

roa.mode = SearchCollectionReadOnlyAllMode.disable;
v.SearchCollectionReadOnlyAll(roa);

The following C# code example illustrates how to check the state that is returned by this function:

foreach (readonlystate ros in roar.readonlystateall.readonlystate)
{
    Console.WriteLine(ros.collection + ": " + ros.mode);
    if (ro.requestedSpecified)
          Console.WriteLine("     Requested: " + ros.requested);
    if (ro.acquiredSpecified)
          Console.WriteLine ("      Granted:   " + ros.acquired);
}

The following Java code example shows how to use the search-collection-read-only-all function to put all of your search collections in read-only mode, do whatever tasks you want to perform, and then return the collections to non-read-only mode:

SearchCollectionReadOnlyAll roa;
SearchCollectionReadOnlyAllResponse roar;

do
{
    roa = searchCollectionReadOnlyAll();
    roa.setMode("enable");
    roar = vp.searchCollectionReadOnlyAll(roa);
} while (roar.getNdisabled() > 0
           || roar.getNpending > 0);

// now in read-only mode, do whatever ...

roa.setMode = "disable";
roar = vp.searchCollectionReadOnlyAll(roa);

The following Java code example illustrates how to check the state information that is returned by the search-collection-read-only-all function:

SearchCollectionReadOnlyAllResponse roar;

foreach (ReadOnlyState ros in roar.getReadOnlyState())
{
    System.out.println(ro.getCollection + ": " + ros.getMode());
    System.out.println("      Requested: " + ros.getRequested());
    System.out.println("       Granted:   " + ros.getAcquired());}