Changeset 4264


Ignore:
Timestamp:
2010-09-16 12:48:17 (3 years ago)
Author:
bruno
Message:
  • Moved indexerconf from indexer-engine to indexer-model project. This allows indexer-model to perform basic validation of the indexerconf.
  • Indexer admin CLI: parse indexerconf against repository to perform full validation. This verifies that the field types and record types specified in the indexerconf exist. The indexer model itself does not do this validation as it does not have/require a connection to a running Lily repository. This validation is optional and can be skipped with the option --force.
  • Indexer admin CLI: some general improvements to the output (configure logging, don't print stack traces for expectable exceptions like index conf errors).
Location:
trunk/indexer
Files:
19 added
3 deleted
15 edited
1 copied
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/indexer/admin-cli/pom.xml

    r4246 r4264  
    4747      <artifactId>joda-time</artifactId> 
    4848    </dependency> 
     49    <dependency> 
     50      <groupId>log4j</groupId> 
     51      <artifactId>log4j</artifactId> 
     52      <scope>compile</scope> 
     53    </dependency> 
     54    <dependency> 
     55      <groupId>org.slf4j</groupId> 
     56      <artifactId>slf4j-log4j12</artifactId> 
     57    </dependency> 
     58    <dependency> 
     59      <groupId>org.lilycms</groupId> 
     60      <artifactId>lily-client</artifactId> 
     61    </dependency> 
    4962  </dependencies> 
    5063 
  • trunk/indexer/admin-cli/src/main/java/org/lilycms/indexer/admin/cli/AddIndexCli.java

    r4260 r4264  
    3838    } 
    3939 
    40     public void run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
     40    public int run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
    4141        WriteableIndexerModel model = new IndexerModelImpl(zk); 
    4242 
     
    6262 
    6363        System.out.println("Index created: " + indexName); 
     64 
     65        return 0; 
    6466    } 
    6567 
  • trunk/indexer/admin-cli/src/main/java/org/lilycms/indexer/admin/cli/BaseIndexerAdminCli.java

    r4260 r4264  
    33import org.apache.commons.cli.*; 
    44import org.apache.commons.io.FileUtils; 
     5import org.apache.log4j.ConsoleAppender; 
     6import org.apache.log4j.Level; 
     7import org.apache.log4j.Logger; 
     8import org.apache.log4j.PatternLayout; 
    59import org.apache.zookeeper.WatchedEvent; 
    610import org.apache.zookeeper.Watcher; 
     11import org.lilycms.client.LilyClient; 
    712import org.lilycms.indexer.model.api.IndexBatchBuildState; 
    813import org.lilycms.indexer.model.api.IndexGeneralState; 
    914import org.lilycms.indexer.model.api.IndexUpdateState; 
     15import org.lilycms.indexer.model.api.IndexValidityException; 
     16import org.lilycms.indexer.model.indexerconf.IndexerConfBuilder; 
     17import org.lilycms.indexer.model.indexerconf.IndexerConfException; 
     18import org.lilycms.indexer.model.sharding.ShardingConfigException; 
    1019import org.lilycms.util.zookeeper.ZooKeeperImpl; 
    1120import org.lilycms.util.zookeeper.ZooKeeperItf; 
    1221 
     22import java.io.ByteArrayInputStream; 
    1323import java.io.File; 
    1424import java.net.URI; 
     
    3747 
    3848    public static void start(String[] args, BaseIndexerAdminCli cli) { 
     49        setupLogging(); 
     50        int result = 1; 
    3951        try { 
    40             cli.runBase(args); 
     52            System.out.println(); 
     53            result = cli.runBase(args); 
     54        } catch (IndexValidityException e) { 
     55            System.out.println("ATTENTION"); 
     56            System.out.println("---------"); 
     57            System.out.println("The index could not be created or updated because:"); 
     58            printExceptionMessages(e); 
    4159        } catch (Throwable t) { 
    4260            t.printStackTrace(); 
    4361        } 
    44     } 
    45  
    46     public void runBase(String[] args) throws Exception { 
     62        System.out.println(); 
     63 
     64        if (result != 0) 
     65            System.exit(result); 
     66    } 
     67 
     68    private static void printExceptionMessages(Throwable throwable) { 
     69        Throwable cause = throwable; 
     70        while (cause != null) { 
     71            String prefix = ""; 
     72            if (cause instanceof IndexValidityException) { 
     73                prefix = "Index definition: "; 
     74            } else if (cause instanceof IndexerConfException) { 
     75                prefix = "Indexer configuration: "; 
     76            } else if (cause instanceof ShardingConfigException) { 
     77                prefix = "Sharding configuration: "; 
     78            } 
     79            System.out.println(prefix + cause.getMessage()); 
     80            cause = cause.getCause(); 
     81        } 
     82    } 
     83 
     84    private static void setupLogging() { 
     85        Logger rootLogger = Logger.getRootLogger(); 
     86        rootLogger.setLevel(Level.WARN); 
     87 
     88        final String CONSOLE_LAYOUT = "[%-5p][%d{ABSOLUTE}][%-10.10t] %c - %m%n"; 
     89 
     90        ConsoleAppender consoleAppender = new ConsoleAppender(); 
     91        consoleAppender.setLayout(new PatternLayout(CONSOLE_LAYOUT)); 
     92 
     93        consoleAppender.activateOptions(); 
     94        rootLogger.addAppender(consoleAppender); 
     95    } 
     96 
     97    public int runBase(String[] args) throws Exception { 
    4798        Options cliOptions = new Options(); 
    4899 
     
    60111                .create("z"); 
    61112        cliOptions.addOption(zkOption); 
     113 
     114        Option forceOption = OptionBuilder 
     115                .withDescription("Skips optional validations.") 
     116                .withLongOpt("force") 
     117                .create("f"); 
     118        cliOptions.addOption(forceOption); 
    62119 
    63120        // 
     
    138195        } catch (ParseException e) { 
    139196            System.out.println(e.getMessage()); 
     197            System.out.println(); 
    140198            showHelp = true; 
    141199        } 
     
    146204        if (showHelp || cmd.hasOption(helpOption.getOpt())) { 
    147205            printHelp(cliOptions); 
    148             System.exit(1); 
     206            return 1; 
    149207        } 
    150208 
    151209        if (!cmd.hasOption(zkOption.getOpt())) { 
    152             System.out.println("Zookeeper connection string not specified, using default: " + DEFAULT_ZK_CONNECT); 
     210            System.out.println("ZooKeeper connection string not specified, using default: " + DEFAULT_ZK_CONNECT); 
     211            System.out.println(); 
    153212            zkConnectionString = DEFAULT_ZK_CONNECT; 
    154213        } else { 
     
    173232                    System.out.println("SOLR shards should be specified as 'name:URL' pairs, which the following is not:"); 
    174233                    System.out.println(shardEntry); 
    175                     System.exit(1); 
     234                    return 1; 
    176235                } 
    177236 
     
    180239                    System.out.println("Zero-length shard name in the following shard entry:"); 
    181240                    System.out.println(shardEntry); 
    182                     System.exit(1); 
     241                    return 1; 
    183242                } 
    184243 
     
    188247                    if (!uri.isAbsolute()) { 
    189248                        System.out.println("Not an absolute URI: " + shardAddress); 
    190                         System.exit(1); 
     249                        return 1; 
    191250                    } 
    192251                } catch (URISyntaxException e) { 
    193252                    System.out.println("Invalid SOLR shard URI: " + shardAddress); 
    194253                    System.out.println(e.getMessage()); 
    195                     System.exit(1); 
     254                    return 1; 
    196255                } 
    197256 
    198257                if (solrShards.containsKey(shardName)) { 
    199258                    System.out.println("Duplicate shard name: " + shardName); 
    200                     System.exit(1); 
     259                    return 1; 
    201260                } 
    202261 
     
    205264                    System.out.println("Warning: you have two shards pointing to the same URI:"); 
    206265                    System.out.println(shardAddress); 
    207                     System.out.println(); 
    208266                } 
    209267 
     
    216274                // Probably cannot occur 
    217275                System.out.println("No SOLR shards specified though option is used."); 
    218                 System.exit(1); 
     276                return 1; 
    219277            } 
    220278        } 
     
    226284                System.out.println("Specified sharding configuration file not found:"); 
    227285                System.out.println(configurationFile.getAbsolutePath()); 
    228                 System.exit(1); 
     286                return 1; 
    229287            } 
    230288 
     
    238296                System.out.println("Specified indexer configuration file not found:"); 
    239297                System.out.println(configurationFile.getAbsolutePath()); 
    240                 System.exit(1); 
     298                return 1; 
    241299            } 
    242300 
    243301            indexerConfiguration = FileUtils.readFileToByteArray(configurationFile); 
     302 
     303            if (!cmd.hasOption(forceOption.getOpt())) { 
     304                try { 
     305                    LilyClient lilyClient = new LilyClient(zkConnectionString); 
     306                    IndexerConfBuilder.build(new ByteArrayInputStream(indexerConfiguration), lilyClient.getRepository()); 
     307                } catch (Exception e) { 
     308                    System.out.println(); // separator line because LilyClient might have produced some error logs 
     309                    System.out.println("Failed to parse & build the indexer configuration."); 
     310                    System.out.println(); 
     311                    System.out.println("If this problem occurs because no Lily node is available"); 
     312                    System.out.println("or because certain field types or record types do not exist,"); 
     313                    System.out.println("then you can skip this validation using the option --" + forceOption.getLongOpt()); 
     314                    System.out.println(); 
     315                    if (e instanceof IndexerConfException) { 
     316                        printExceptionMessages(e); 
     317                    } else { 
     318                        e.printStackTrace(); 
     319                    } 
     320                    return 1; 
     321                } 
     322            } 
    244323        } 
    245324 
     
    250329            } catch (IllegalArgumentException e) { 
    251330                System.out.println("Invalid index state: " + stateName); 
    252                 System.exit(1); 
     331                return 1; 
    253332            } 
    254333        } 
     
    260339            } catch (IllegalArgumentException e) { 
    261340                System.out.println("Invalid index update state: " + stateName); 
    262                 System.exit(1); 
     341                return 1; 
    263342            } 
    264343        } 
     
    270349            } catch (IllegalArgumentException e) { 
    271350                System.out.println("Invalid index build state: " + stateName); 
    272                 System.exit(1); 
     351                return 1; 
    273352            } 
    274353 
    275354            if (buildState != IndexBatchBuildState.BUILD_REQUESTED) { 
    276355                System.out.println("The build state can only be set to " + IndexBatchBuildState.BUILD_REQUESTED); 
    277                 System.exit(1); 
     356                return 1; 
    278357            } 
    279358        } 
     
    281360        ZooKeeperItf zk = new ZooKeeperImpl(zkConnectionString, 3000, new MyWatcher()); 
    282361 
    283         run(zk, cmd); 
     362        return run(zk, cmd); 
    284363    } 
    285364 
     
    296375    public abstract List<Option> getOptions(); 
    297376 
    298     public abstract void run(ZooKeeperItf zk, CommandLine cmd) throws Exception; 
     377    public abstract int run(ZooKeeperItf zk, CommandLine cmd) throws Exception; 
    299378 
    300379    private class MyWatcher implements Watcher { 
  • trunk/indexer/admin-cli/src/main/java/org/lilycms/indexer/admin/cli/ListIndexesCli.java

    r4260 r4264  
    2828    } 
    2929 
    30     public void run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
     30    public int run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
    3131        WriteableIndexerModel model = new IndexerModelImpl(zk); 
    3232 
     
    6363                System.out.println("    + Job state: " + lastBatchBuild.getJobState()); 
    6464            } 
     65        } 
    6566 
    66             System.out.println(); 
    67         } 
     67        return 0; 
    6868    } 
    6969} 
  • trunk/indexer/admin-cli/src/main/java/org/lilycms/indexer/admin/cli/TouchIndexCli.java

    r4250 r4264  
    3131    } 
    3232 
    33     public void run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
     33    public int run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
    3434        WriteableIndexerModel model = new IndexerModelImpl(zk); 
    3535 
    3636        if (!model.hasIndex(indexName)) { 
    3737            System.out.println("Index does not exist: " + indexName); 
    38             System.exit(1); 
     38            return 1; 
    3939        } 
    4040 
     
    4848            model.unlockIndex(lock); 
    4949        } 
     50 
     51        return 0; 
    5052    } 
    5153} 
  • trunk/indexer/admin-cli/src/main/java/org/lilycms/indexer/admin/cli/UpdateIndexCli.java

    r4260 r4264  
    3939    } 
    4040 
    41     public void run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
     41    public int run(ZooKeeperItf zk, CommandLine cmd) throws Exception { 
    4242        WriteableIndexerModel model = new IndexerModelImpl(zk); 
    4343 
    4444        if (!model.hasIndex(indexName)) { 
    4545            System.out.println("Index does not exist: " + indexName); 
    46             System.exit(1); 
     46            return 1; 
    4747        } 
    4848 
     
    9494            model.unlockIndex(lock); 
    9595        } 
     96 
     97        return 0; 
    9698    } 
    9799} 
  • trunk/indexer/engine/src/main/java/org/lilycms/indexer/engine/IndexUpdater.java

    r4263 r4264  
    1414 * limitations under the License. 
    1515 */ 
    16 package org.lilycms.indexer; 
     16package org.lilycms.indexer.engine; 
    1717 
    1818import org.apache.commons.logging.Log; 
    1919import org.apache.commons.logging.LogFactory; 
    2020import org.apache.hadoop.metrics.*; 
    21 import org.lilycms.indexer.conf.DerefValue; 
    22 import org.lilycms.indexer.conf.IndexCase; 
    23 import org.lilycms.indexer.conf.IndexField; 
     21import org.lilycms.indexer.model.indexerconf.DerefValue; 
     22import org.lilycms.indexer.model.indexerconf.IndexCase; 
     23import org.lilycms.indexer.model.indexerconf.IndexField; 
    2424import org.lilycms.linkindex.LinkIndex; 
    2525import org.lilycms.repository.api.*; 
  • trunk/indexer/engine/src/main/java/org/lilycms/indexer/engine/Indexer.java

    r4263 r4264  
    1414 * limitations under the License. 
    1515 */ 
    16 package org.lilycms.indexer; 
     16package org.lilycms.indexer.engine; 
    1717 
    1818import org.apache.commons.logging.Log; 
     
    2525import org.apache.solr.client.solrj.util.ClientUtils; 
    2626import org.apache.solr.common.SolrInputDocument; 
    27 import org.lilycms.indexer.conf.IndexCase; 
    28 import org.lilycms.indexer.conf.IndexField; 
    29 import org.lilycms.indexer.conf.IndexerConf; 
     27import org.lilycms.indexer.model.indexerconf.IndexCase; 
     28import org.lilycms.indexer.model.indexerconf.IndexField; 
     29import org.lilycms.indexer.model.indexerconf.IndexerConf; 
    3030import org.lilycms.indexer.engine.SolrServers; 
    3131import org.lilycms.indexer.engine.ValueEvaluator; 
  • trunk/indexer/engine/src/main/java/org/lilycms/indexer/engine/ValueEvaluator.java

    r4263 r4264  
    88import org.apache.tika.parser.Parser; 
    99import org.apache.tika.sax.BodyContentHandler; 
    10 import org.lilycms.indexer.conf.DerefValue; 
    11 import org.lilycms.indexer.conf.DerefValue.Follow; 
    12 import org.lilycms.indexer.conf.DerefValue.FieldFollow; 
    13 import org.lilycms.indexer.conf.DerefValue.VariantFollow; 
    14 import org.lilycms.indexer.conf.DerefValue.MasterFollow; 
    15 import org.lilycms.indexer.conf.FieldValue; 
    16 import org.lilycms.indexer.conf.IndexerConf; 
    17 import org.lilycms.indexer.conf.Value; 
    18 import org.lilycms.indexer.formatter.Formatter; 
     10import org.lilycms.indexer.model.indexerconf.DerefValue; 
     11import org.lilycms.indexer.model.indexerconf.DerefValue.Follow; 
     12import org.lilycms.indexer.model.indexerconf.DerefValue.FieldFollow; 
     13import org.lilycms.indexer.model.indexerconf.DerefValue.VariantFollow; 
     14import org.lilycms.indexer.model.indexerconf.DerefValue.MasterFollow; 
     15import org.lilycms.indexer.model.indexerconf.FieldValue; 
     16import org.lilycms.indexer.model.indexerconf.IndexerConf; 
     17import org.lilycms.indexer.model.indexerconf.Value; 
     18import org.lilycms.indexer.model.indexerconf.Formatter; 
    1919import org.lilycms.repository.api.*; 
    2020import org.lilycms.util.io.Closer; 
  • trunk/indexer/engine/src/test/java/org/lilycms/indexer/test/DateYearFormatter.java

    r4168 r4264  
    1818import org.joda.time.DateTime; 
    1919import org.joda.time.LocalDate; 
    20 import org.lilycms.indexer.formatter.DefaultFormatter; 
     20import org.lilycms.indexer.model.indexerconf.DefaultFormatter; 
    2121import org.lilycms.repository.api.ValueType; 
    2222 
  • trunk/indexer/engine/src/test/java/org/lilycms/indexer/test/IndexerTest.java

    r4260 r4264  
    1818import static org.junit.Assert.assertEquals; 
    1919 
    20 import org.lilycms.indexer.IndexUpdater; 
     20import org.lilycms.indexer.engine.IndexUpdater; 
     21import org.lilycms.indexer.engine.Indexer; 
    2122import org.lilycms.indexer.engine.SolrServers; 
     23import org.lilycms.indexer.model.indexerconf.IndexerConfBuilder; 
    2224import org.lilycms.linkindex.LinkIndexUpdater; 
    2325import org.lilycms.util.repo.RecordEvent; 
     
    4042import org.junit.Test; 
    4143import org.lilycms.hbaseindex.IndexManager; 
    42 import org.lilycms.indexer.Indexer; 
    43 import org.lilycms.indexer.conf.IndexerConf; 
    44 import org.lilycms.indexer.conf.IndexerConfBuilder; 
     44import org.lilycms.indexer.model.indexerconf.IndexerConf; 
    4545import org.lilycms.linkindex.LinkIndex; 
    4646import org.lilycms.repository.api.*; 
  • trunk/indexer/engine/src/test/java/org/lilycms/indexer/test/IntegerHierarchyUnderscoreFormatter.java

    r4168 r4264  
    1616package org.lilycms.indexer.test; 
    1717 
    18 import org.lilycms.indexer.formatter.Formatter; 
     18import org.lilycms.indexer.model.indexerconf.Formatter; 
    1919import org.lilycms.repository.api.HierarchyPath; 
    2020import org.lilycms.repository.api.ValueType; 
  • trunk/indexer/engine/src/test/resources/org/lilycms/indexer/test/indexerconf1.xml

    r4257 r4264  
    1111 
    1212    <!-- Default formatter: handles any kind of value. --> 
    13     <formatter class="org.lilycms.indexer.formatter.DefaultFormatter"/> 
     13    <formatter class="org.lilycms.indexer.model.indexerconf.DefaultFormatter"/> 
    1414 
    1515    <!-- The formatters below will only be used when referred to explictly by name, because the 
  • trunk/indexer/fullbuild/src/main/java/org/lilycms/indexer/fullbuild/IndexingMapper.java

    r4260 r4264  
    99import org.apache.hadoop.hbase.io.ImmutableBytesWritable; 
    1010import org.apache.hadoop.hbase.mapreduce.TableMapper; 
    11 import org.lilycms.indexer.Indexer; 
    12 import org.lilycms.indexer.conf.IndexerConf; 
    13 import org.lilycms.indexer.conf.IndexerConfBuilder; 
     11import org.lilycms.indexer.engine.Indexer; 
     12import org.lilycms.indexer.model.indexerconf.IndexerConf; 
     13import org.lilycms.indexer.model.indexerconf.IndexerConfBuilder; 
    1414import org.lilycms.indexer.engine.SolrServers; 
    1515import org.lilycms.indexer.model.sharding.DefaultShardSelectorBuilder; 
  • trunk/indexer/model/pom.xml

    r4260 r4264  
    4343    <dependency> 
    4444      <groupId>org.lilycms</groupId> 
     45      <artifactId>lily-repo-util</artifactId> 
     46    </dependency> 
     47 
     48    <dependency> 
     49      <groupId>org.lilycms</groupId> 
    4550      <artifactId>lily-repository-api</artifactId> 
    4651    </dependency> 
  • trunk/indexer/model/src/main/java/org/lilycms/indexer/model/impl/IndexerModelImpl.java

    r4260 r4264  
    77import static org.apache.zookeeper.Watcher.Event.EventType.*; 
    88import org.lilycms.indexer.model.api.*; 
     9import org.lilycms.indexer.model.indexerconf.IndexerConfBuilder; 
     10import org.lilycms.indexer.model.indexerconf.IndexerConfException; 
    911import org.lilycms.indexer.model.sharding.JsonShardSelectorBuilder; 
    1012import org.lilycms.indexer.model.sharding.ShardSelector; 
     
    1416import static org.lilycms.indexer.model.api.IndexerModelEventType.*; 
    1517 
     18import java.io.ByteArrayInputStream; 
    1619import java.net.URI; 
    1720import java.net.URISyntaxException; 
     
    161164            } 
    162165        } 
     166 
     167        try { 
     168            IndexerConfBuilder.validate(new ByteArrayInputStream(index.getConfiguration())); 
     169        } catch (IndexerConfException e) { 
     170            throw new IndexValidityException("The indexer configuration is not XML well-formed or valid.", e); 
     171        } 
    163172    } 
    164173 
  • trunk/indexer/worker/src/main/java/org/lilycms/indexer/worker/IndexerWorker.java

    r4260 r4264  
    55import org.apache.commons.logging.Log; 
    66import org.apache.commons.logging.LogFactory; 
    7 import org.lilycms.indexer.IndexUpdater; 
    8 import org.lilycms.indexer.Indexer; 
    9 import org.lilycms.indexer.conf.IndexerConf; 
    10 import org.lilycms.indexer.conf.IndexerConfBuilder; 
     7import org.lilycms.indexer.engine.IndexUpdater; 
     8import org.lilycms.indexer.engine.Indexer; 
     9import org.lilycms.indexer.model.indexerconf.IndexerConf; 
     10import org.lilycms.indexer.model.indexerconf.IndexerConfBuilder; 
    1111import org.lilycms.indexer.engine.SolrServers; 
    1212import org.lilycms.indexer.model.sharding.DefaultShardSelectorBuilder; 
Note: See TracChangeset for help on using the changeset viewer.