You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2017/07/06 13:07:10 UTC
[13/14] lucenenet git commit: SWEEP: Modified all command-line
utilities to throw exceptions instead of display to console so our wrapper
console app can show the correct usage info.
SWEEP: Modified all command-line utilities to throw exceptions instead of display to console so our wrapper console app can show the correct usage info.
Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/f0b56fd2
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/f0b56fd2
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/f0b56fd2
Branch: refs/heads/master
Commit: f0b56fd24bb70d3b5b0a32d3fc99de7c30c09cdf
Parents: 933d835
Author: Shad Storhaug <sh...@shadstorhaug.com>
Authored: Thu Jul 6 18:56:44 2017 +0700
Committer: Shad Storhaug <sh...@shadstorhaug.com>
Committed: Thu Jul 6 18:56:44 2017 +0700
----------------------------------------------------------------------
.../Taxonomy/PrintTaxonomyStats.cs | 18 +-
.../Index/CompoundFileExtractor.cs | 10 +-
src/Lucene.Net.Misc/Index/IndexSplitter.cs | 12 +-
.../Index/MultiPassIndexSplitter.cs | 14 +-
src/Lucene.Net.Misc/Misc/GetTermInfo.cs | 17 +-
src/Lucene.Net.Misc/Misc/HighFreqTerms.cs | 16 +-
src/Lucene.Net/Index/CheckIndex.cs | 330 ++++++++++---------
src/Lucene.Net/Index/IndexUpgrader.cs | 27 +-
src/Lucene.Net/Store/LockStressTest.cs | 46 ++-
src/Lucene.Net/Store/LockVerifyServer.cs | 19 +-
10 files changed, 283 insertions(+), 226 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Facet/Taxonomy/PrintTaxonomyStats.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Facet/Taxonomy/PrintTaxonomyStats.cs b/src/Lucene.Net.Facet/Taxonomy/PrintTaxonomyStats.cs
index 6ba2d7f..b8ce155 100644
--- a/src/Lucene.Net.Facet/Taxonomy/PrintTaxonomyStats.cs
+++ b/src/Lucene.Net.Facet/Taxonomy/PrintTaxonomyStats.cs
@@ -59,14 +59,18 @@ namespace Lucene.Net.Facet.Taxonomy
}
if (args.Length != (printTree ? 2 : 1))
{
- // LUCENENET TODO: Usage depends on wrapping this into a console application assembly.
- Console.WriteLine("\nUsage: java -classpath ... org.apache.lucene.facet.util.PrintTaxonomyStats [-printTree] /path/to/taxononmy/index\n");
- return 1;
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.WriteLine("\nUsage: java -classpath ... org.apache.lucene.facet.util.PrintTaxonomyStats [-printTree] /path/to/taxononmy/index\n");
+ //return 1;
+ }
+ using (Store.Directory dir = FSDirectory.Open(new DirectoryInfo(path)))
+ {
+ using (var r = new DirectoryTaxonomyReader(dir))
+ {
+ PrintStats(r, System.Console.Out, printTree);
+ }
}
- Store.Directory dir = FSDirectory.Open(new DirectoryInfo(path));
- var r = new DirectoryTaxonomyReader(dir);
- PrintStats(r, System.Console.Out, printTree);
- r.Dispose();
return 0;
}
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Misc/Index/CompoundFileExtractor.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Misc/Index/CompoundFileExtractor.cs b/src/Lucene.Net.Misc/Index/CompoundFileExtractor.cs
index 80ced50..db9c5be 100644
--- a/src/Lucene.Net.Misc/Index/CompoundFileExtractor.cs
+++ b/src/Lucene.Net.Misc/Index/CompoundFileExtractor.cs
@@ -66,8 +66,10 @@ namespace Lucene.Net.Index
if (filename == null)
{
- Console.WriteLine("Usage: org.apache.lucene.index.CompoundFileExtractor [-extract] [-dir-impl X] <cfsfile>");
- return;
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException("ERROR: CFS-FILE is required");
+ //Console.WriteLine("Usage: org.apache.lucene.index.CompoundFileExtractor [-extract] [-dir-impl X] <cfsfile>");
+ //return;
}
Store.Directory dir = null;
@@ -129,7 +131,7 @@ namespace Lucene.Net.Index
catch (IOException ioe)
{
Console.WriteLine(ioe.ToString());
- Console.Write(ioe.StackTrace);
+ //Console.Write(ioe.StackTrace);
}
finally
{
@@ -147,7 +149,7 @@ namespace Lucene.Net.Index
catch (IOException ioe)
{
Console.WriteLine(ioe.ToString());
- Console.Write(ioe.StackTrace);
+ //Console.Write(ioe.StackTrace);
}
}
}
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Misc/Index/IndexSplitter.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Misc/Index/IndexSplitter.cs b/src/Lucene.Net.Misc/Index/IndexSplitter.cs
index 9710943..1bb3dee 100644
--- a/src/Lucene.Net.Misc/Index/IndexSplitter.cs
+++ b/src/Lucene.Net.Misc/Index/IndexSplitter.cs
@@ -34,7 +34,7 @@ namespace Lucene.Net.Index
/// into multiple segments. For example if your index is a
/// single segment, this tool won't help. Also, it does basic
/// file-level copying (using simple
- /// FileInfo) so it will not work with non
+ /// Stream) so it will not work with non
/// FSDirectory Directory impls.</para>
///
/// @lucene.experimental You can easily
@@ -53,10 +53,12 @@ namespace Lucene.Net.Index
{
if (args.Length < 2)
{
- Console.Error.WriteLine("Usage: IndexSplitter <srcDir> -l (list the segments and their sizes)");
- Console.Error.WriteLine("IndexSplitter <srcDir> <destDir> <segments>+");
- Console.Error.WriteLine("IndexSplitter <srcDir> -d (delete the following segments)");
- return;
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.Error.WriteLine("Usage: IndexSplitter <srcDir> -l (list the segments and their sizes)");
+ //Console.Error.WriteLine("IndexSplitter <srcDir> <destDir> <segments>+");
+ //Console.Error.WriteLine("IndexSplitter <srcDir> -d (delete the following segments)");
+ //return;
}
DirectoryInfo srcDir = new DirectoryInfo(args[0]);
IndexSplitter @is = new IndexSplitter(srcDir);
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Misc/Index/MultiPassIndexSplitter.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Misc/Index/MultiPassIndexSplitter.cs b/src/Lucene.Net.Misc/Index/MultiPassIndexSplitter.cs
index bca1284..4f40250 100644
--- a/src/Lucene.Net.Misc/Index/MultiPassIndexSplitter.cs
+++ b/src/Lucene.Net.Misc/Index/MultiPassIndexSplitter.cs
@@ -123,12 +123,14 @@ namespace Lucene.Net.Index
{
if (args.Length < 5)
{
- Console.Error.WriteLine("Usage: MultiPassIndexSplitter -out <outputDir> -num <numParts> [-seq] <inputIndex1> [<inputIndex2 ...]");
- Console.Error.WriteLine("\tinputIndex\tpath to input index, multiple values are ok");
- Console.Error.WriteLine("\t-out ouputDir\tpath to output directory to contain partial indexes");
- Console.Error.WriteLine("\t-num numParts\tnumber of parts to produce");
- Console.Error.WriteLine("\t-seq\tsequential docid-range split (default is round-robin)");
- Environment.Exit(-1);
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.Error.WriteLine("Usage: MultiPassIndexSplitter -out <outputDir> -num <numParts> [-seq] <inputIndex1> [<inputIndex2 ...]");
+ //Console.Error.WriteLine("\tinputIndex\tpath to input index, multiple values are ok");
+ //Console.Error.WriteLine("\t-out ouputDir\tpath to output directory to contain partial indexes");
+ //Console.Error.WriteLine("\t-num numParts\tnumber of parts to produce");
+ //Console.Error.WriteLine("\t-seq\tsequential docid-range split (default is round-robin)");
+ //Environment.Exit(-1);
}
List<IndexReader> indexes = new List<IndexReader>();
string outDir = null;
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Misc/Misc/GetTermInfo.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Misc/Misc/GetTermInfo.cs b/src/Lucene.Net.Misc/Misc/GetTermInfo.cs
index f99d96a..3ab9792 100644
--- a/src/Lucene.Net.Misc/Misc/GetTermInfo.cs
+++ b/src/Lucene.Net.Misc/Misc/GetTermInfo.cs
@@ -42,8 +42,10 @@ namespace Lucene.Net.Misc
}
else
{
- Usage();
- Environment.Exit(1);
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Usage();
+ //Environment.Exit(1);
}
TermInfo(dir, new Term(field, inputStr));
@@ -55,10 +57,11 @@ namespace Lucene.Net.Misc
Console.WriteLine("{0}:{1} \t totalTF = {2:#,##0} \t doc freq = {3:#,##0} \n", term.Field, term.Text(), reader.TotalTermFreq(term), reader.DocFreq(term));
}
- private static void Usage()
- {
- // LUCENENET TODO: Usage info is dependant on packaging this into a standalone console application
- Console.WriteLine("\n\nusage:\n\t" + "java " + typeof(GetTermInfo).FullName + " <index dir> field term \n\n");
- }
+ // LUCENENET specific - our wrapper console shows the correct usage
+ //private static void Usage()
+ //{
+ // // LUCENENET TODO: Usage info is dependant on packaging this into a standalone console application
+ // Console.WriteLine("\n\nusage:\n\t" + "java " + typeof(GetTermInfo).FullName + " <index dir> field term \n\n");
+ //}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net.Misc/Misc/HighFreqTerms.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Misc/Misc/HighFreqTerms.cs b/src/Lucene.Net.Misc/Misc/HighFreqTerms.cs
index 2cb9ec0..3c74fc0 100644
--- a/src/Lucene.Net.Misc/Misc/HighFreqTerms.cs
+++ b/src/Lucene.Net.Misc/Misc/HighFreqTerms.cs
@@ -48,8 +48,10 @@ namespace Lucene.Net.Misc
if (args.Length == 0 || args.Length > 4)
{
- Usage();
- Environment.Exit(1);
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Usage();
+ //Environment.Exit(1);
}
Store.Directory dir = FSDirectory.Open(new DirectoryInfo(args[0]));
@@ -86,11 +88,11 @@ namespace Lucene.Net.Misc
}
}
- private static void Usage()
- {
- // LUCENENET TODO: Usage depends on packaging this into an assembly executable.
- Console.WriteLine("\n\n" + "java org.apache.lucene.misc.HighFreqTerms <index dir> [-t] [number_terms] [field]\n\t -t: order by totalTermFreq\n\n");
- }
+ // LUCENENET specific - our wrapper console shows the correct usage
+ //private static void Usage()
+ //{
+ // Console.WriteLine("\n\n" + "java org.apache.lucene.misc.HighFreqTerms <index dir> [-t] [number_terms] [field]\n\t -t: order by totalTermFreq\n\n");
+ //}
/// <summary>
/// Returns <see cref="T:TermStats[]"/> ordered by the specified comparer
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net/Index/CheckIndex.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Index/CheckIndex.cs b/src/Lucene.Net/Index/CheckIndex.cs
index 6a43b1b..565b312 100644
--- a/src/Lucene.Net/Index/CheckIndex.cs
+++ b/src/Lucene.Net/Index/CheckIndex.cs
@@ -1,10 +1,13 @@
+using Lucene.Net.Store;
using Lucene.Net.Support;
using Lucene.Net.Support.IO;
+using Lucene.Net.Util;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
+using System.Threading;
namespace Lucene.Net.Index
{
@@ -480,8 +483,8 @@ namespace Lucene.Net.Index
}
set
{
- infoStream = value == null
- ? null
+ infoStream = value == null
+ ? null
: (value is SafeTextWriterWrapper ? value : new SafeTextWriterWrapper(value));
}
}
@@ -2399,183 +2402,194 @@ namespace Lucene.Net.Index
return assertsOn;
}
- // LUCENENET TODO: This seems too useful not to port over...but I suppose there is a Java version that could be used on the command line.
-
- /*
- /// Command-line interface to check and fix an index.
- ///
- /// <p>
- /// Run it like this:
- /// <pre>
- /// java -ea:org.apache.lucene... Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-verbose] [-segment X] [-segment Y]
- /// </pre>
- /// <ul>
- /// <li><code>-fix</code>: actually write a new segments_N file, removing any problematic segments
- ///
- /// <li><code>-segment X</code>: only check the specified
- /// segment(s). this can be specified multiple times,
- /// to check more than one segment, eg <code>-segment _2
- /// -segment _a</code>. You can't use this with the -fix
- /// option.
- /// </ul>
- ///
- /// <p><b>WARNING</b>: <code>-fix</code> should only be used on an emergency basis as it will cause
- /// documents (perhaps many) to be permanently removed from the index. Always make
- /// a backup copy of your index before running this! Do not run this tool on an index
- /// that is actively being written to. You have been warned!
- ///
- /// <p> Run without -fix, this tool will open the index, report version information
- /// and report any exceptions it hits and what action it would take if -fix were
- /// specified. With -fix, this tool will remove any segments that have issues and
- /// write a new segments_N file. this means all documents contained in the affected
- /// segments will be removed.
- ///
- /// <p>
- /// this tool exits with exit code 1 if the index cannot be opened or has any
- /// corruption, else 0.
- */
- /*[STAThread]
+ ///// Command-line interface to check and fix an index.
+ /////
+ ///// <p>
+ ///// Run it like this:
+ ///// <pre>
+ ///// java -ea:org.apache.lucene... Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-verbose] [-segment X] [-segment Y]
+ ///// </pre>
+ ///// <ul>
+ ///// <li><code>-fix</code>: actually write a new segments_N file, removing any problematic segments
+ /////
+ ///// <li><code>-segment X</code>: only check the specified
+ ///// segment(s). this can be specified multiple times,
+ ///// to check more than one segment, eg <code>-segment _2
+ ///// -segment _a</code>. You can't use this with the -fix
+ ///// option.
+ ///// </ul>
+ /////
+ ///// <p><b>WARNING</b>: <code>-fix</code> should only be used on an emergency basis as it will cause
+ ///// documents (perhaps many) to be permanently removed from the index. Always make
+ ///// a backup copy of your index before running this! Do not run this tool on an index
+ ///// that is actively being written to. You have been warned!
+ /////
+ ///// <p> Run without -fix, this tool will open the index, report version information
+ ///// and report any exceptions it hits and what action it would take if -fix were
+ ///// specified. With -fix, this tool will remove any segments that have issues and
+ ///// write a new segments_N file. this means all documents contained in the affected
+ ///// segments will be removed.
+ /////
+ ///// <p>
+ ///// this tool exits with exit code 1 if the index cannot be opened or has any
+ ///// corruption, else 0.
+ [STAThread]
public static void Main(string[] args)
{
- bool doFix = false;
- bool doCrossCheckTermVectors = false;
- bool verbose = false;
- IList<string> onlySegments = new List<string>();
- string indexPath = null;
- string dirImpl = null;
- int i = 0;
- while (i < args.Length)
- {
- string arg = args[i];
- if ("-fix".Equals(arg, StringComparison.Ordinal))
+ bool doFix = false;
+ bool doCrossCheckTermVectors = false;
+ bool verbose = false;
+ IList<string> onlySegments = new List<string>();
+ string indexPath = null;
+ string dirImpl = null;
+ int i = 0;
+ while (i < args.Length)
+ {
+ string arg = args[i];
+ if ("-fix".Equals(arg, StringComparison.Ordinal))
+ {
+ doFix = true;
+ }
+ else if ("-crossCheckTermVectors".Equals(arg, StringComparison.Ordinal))
+ {
+ doCrossCheckTermVectors = true;
+ }
+ else if (arg.Equals("-verbose", StringComparison.Ordinal))
+ {
+ verbose = true;
+ }
+ else if (arg.Equals("-segment", StringComparison.Ordinal))
+ {
+ if (i == args.Length - 1)
+ {
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("ERROR: missing name for -segment option");
+ //Console.WriteLine("ERROR: missing name for -segment option");
+ //Environment.Exit(1);
+ }
+ i++;
+ onlySegments.Add(args[i]);
+ }
+ else if ("-dir-impl".Equals(arg, StringComparison.Ordinal))
+ {
+ if (i == args.Length - 1)
+ {
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("ERROR: missing value for -dir-impl option");
+ //Console.WriteLine("ERROR: missing value for -dir-impl option");
+ //Environment.Exit(1);
+ }
+ i++;
+ dirImpl = args[i];
+ }
+ else
+ {
+ if (indexPath != null)
+ {
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("ERROR: unexpected extra argument '" + args[i] + "'");
+ //Console.WriteLine("ERROR: unexpected extra argument '" + args[i] + "'");
+ //Environment.Exit(1);
+ }
+ indexPath = args[i];
+ }
+ i++;
+ }
+
+ if (indexPath == null)
{
- doFix = true;
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("\nERROR: index path not specified");
+ //Console.WriteLine("\nERROR: index path not specified");
+ //Console.WriteLine("\nUsage: java Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-crossCheckTermVectors] [-segment X] [-segment Y] [-dir-impl X]\n" + "\n" + " -fix: actually write a new segments_N file, removing any problematic segments\n" + " -crossCheckTermVectors: verifies that term vectors match postings; this IS VERY SLOW!\n" + " -codec X: when fixing, codec to write the new segments_N file with\n" + " -verbose: print additional details\n" + " -segment X: only check the specified segments. this can be specified multiple\n" + " times, to check more than one segment, eg '-segment _2 -segment _a'.\n" + " You can't use this with the -fix option\n" + " -dir-impl X: use a specific " + typeof(FSDirectory).Name + " implementation. " + "If no package is specified the " + typeof(FSDirectory).Namespace + " package will be used.\n" + "\n" + "**WARNING**: -fix should only be used on an emergency basis as it will cause\n" + "documents (perha
ps many) to be permanently removed from the index. Always make\n" + "a backup copy of your index before running this! Do not run this tool on an index\n" + "that is actively being written to. You have been warned!\n" + "\n" + "Run without -fix, this tool will open the index, report version information\n" + "and report any exceptions it hits and what action it would take if -fix were\n" + "specified. With -fix, this tool will remove any segments that have issues and\n" + "write a new segments_N file. this means all documents contained in the affected\n" + "segments will be removed.\n" + "\n" + "this tool exits with exit code 1 if the index cannot be opened or has any\n" + "corruption, else 0.\n");
+ //Environment.Exit(1);
}
- else if ("-crossCheckTermVectors".Equals(arg, StringComparison.Ordinal))
+
+ // LUCENENET specific - doesn't apply
+ //if (!AssertsOn())
+ //{
+ // Console.WriteLine("\nNOTE: testing will be more thorough if you run java with '-ea:org.apache.lucene...', so assertions are enabled");
+ //}
+
+ if (onlySegments.Count == 0)
{
- doCrossCheckTermVectors = true;
+ onlySegments = null;
}
- else if (arg.Equals("-verbose", StringComparison.Ordinal))
+ else if (doFix)
{
- verbose = true;
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("ERROR: cannot specify both -fix and -segment");
+ //Console.WriteLine("ERROR: cannot specify both -fix and -segment");
+ //Environment.Exit(1);
}
- else if (arg.Equals("-segment", StringComparison.Ordinal))
+
+ Console.WriteLine("\nOpening index @ " + indexPath + "\n");
+ Directory dir = null;
+ try
{
- if (i == args.Length - 1)
- {
- Console.WriteLine("ERROR: missing name for -segment option");
- Environment.Exit(1);
- }
- i++;
- onlySegments.Add(args[i]);
+ if (dirImpl == null)
+ {
+ dir = FSDirectory.Open(new DirectoryInfo(indexPath));
+ }
+ else
+ {
+ dir = CommandLineUtil.NewFSDirectory(dirImpl, new DirectoryInfo(indexPath));
+ }
}
- else if ("-dir-impl".Equals(arg, StringComparison.Ordinal))
+ catch (Exception t)
{
- if (i == args.Length - 1)
- {
- Console.WriteLine("ERROR: missing value for -dir-impl option");
- Environment.Exit(1);
- }
- i++;
- dirImpl = args[i];
+ // LUCENENET specific - we only output from our CLI wrapper
+ throw new ArgumentException("ERROR: could not open directory \"" + indexPath + "\"; exiting\n" + t.ToString());
+ //Console.WriteLine("ERROR: could not open directory \"" + indexPath + "\"; exiting");
+ //Console.Out.WriteLine(t.StackTrace);
+ //Environment.Exit(1);
}
- else
+
+ CheckIndex checker = new CheckIndex(dir);
+ checker.CrossCheckTermVectors = doCrossCheckTermVectors;
+ checker.InfoStream = Console.Out;
+ checker.InfoStreamIsVerbose = verbose;
+
+ Status result = checker.DoCheckIndex(onlySegments);
+ if (result.MissingSegments)
{
- if (indexPath != null)
- {
- Console.WriteLine("ERROR: unexpected extra argument '" + args[i] + "'");
Environment.Exit(1);
- }
- indexPath = args[i];
- }
- i++;
- }
-
- if (indexPath == null)
- {
- Console.WriteLine("\nERROR: index path not specified");
- Console.WriteLine("\nUsage: java Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-crossCheckTermVectors] [-segment X] [-segment Y] [-dir-impl X]\n" + "\n" + " -fix: actually write a new segments_N file, removing any problematic segments\n" + " -crossCheckTermVectors: verifies that term vectors match postings; this IS VERY SLOW!\n" + " -codec X: when fixing, codec to write the new segments_N file with\n" + " -verbose: print additional details\n" + " -segment X: only check the specified segments. this can be specified multiple\n" + " times, to check more than one segment, eg '-segment _2 -segment _a'.\n" + " You can't use this with the -fix option\n" + " -dir-impl X: use a specific " + typeof(FSDirectory).Name + " implementation. " + "If no package is specified the " + typeof(FSDirectory).Namespace + " package will be used.\n" + "\n" + "**WARNING**: -fix should only be used on an emergency basis as it will cause\n" + "documents (perhaps man
y) to be permanently removed from the index. Always make\n" + "a backup copy of your index before running this! Do not run this tool on an index\n" + "that is actively being written to. You have been warned!\n" + "\n" + "Run without -fix, this tool will open the index, report version information\n" + "and report any exceptions it hits and what action it would take if -fix were\n" + "specified. With -fix, this tool will remove any segments that have issues and\n" + "write a new segments_N file. this means all documents contained in the affected\n" + "segments will be removed.\n" + "\n" + "this tool exits with exit code 1 if the index cannot be opened or has any\n" + "corruption, else 0.\n");
- Environment.Exit(1);
- }
-
- if (!AssertsOn())
- {
- Console.WriteLine("\nNOTE: testing will be more thorough if you run java with '-ea:org.apache.lucene...', so assertions are enabled");
- }
-
- if (onlySegments.Count == 0)
- {
- onlySegments = null;
- }
- else if (doFix)
- {
- Console.WriteLine("ERROR: cannot specify both -fix and -segment");
- Environment.Exit(1);
- }
-
- Console.WriteLine("\nOpening index @ " + indexPath + "\n");
- Directory dir = null;
- try
- {
- if (dirImpl == null)
- {
- dir = FSDirectory.Open(new DirectoryInfo(indexPath));
}
- else
+
+ if (!result.Clean)
{
- dir = CommandLineUtil.NewFSDirectory(dirImpl, new DirectoryInfo(indexPath));
+ if (!doFix)
+ {
+ Console.WriteLine("WARNING: would write new segments file, and " + result.TotLoseDocCount + " documents would be lost, if index fix were specified\n");
+ //Console.WriteLine("WARNING: would write new segments file, and " + result.TotLoseDocCount + " documents would be lost, if -fix were specified\n");
+ }
+ else
+ {
+ Console.WriteLine("WARNING: " + result.TotLoseDocCount + " documents will be lost\n");
+ Console.WriteLine("NOTE: will write new segments file in 5 seconds; this will remove " + result.TotLoseDocCount + " docs from the index. this IS YOUR LAST CHANCE TO CTRL+C!");
+ for (int s = 0; s < 5; s++)
+ {
+ Thread.Sleep(1000);
+ Console.WriteLine(" " + (5 - s) + "...");
+ }
+ Console.WriteLine("Writing...");
+ checker.FixIndex(result);
+ Console.WriteLine("OK");
+ Console.WriteLine("Wrote new segments file \"" + result.NewSegments.GetSegmentsFileName() + "\"");
+ }
}
- }
- catch (Exception t)
- {
- Console.WriteLine("ERROR: could not open directory \"" + indexPath + "\"; exiting");
- Console.Out.WriteLine(t.StackTrace);
- Environment.Exit(1);
- }
-
- CheckIndex checker = new CheckIndex(dir);
- checker.CrossCheckTermVectors = doCrossCheckTermVectors;
- checker.SetInfoStream(new StreamWriter(Console.OpenStandardOutput()), verbose);
+ Console.WriteLine();
- Status result = checker.DoCheckIndex(onlySegments);
- if (result.MissingSegments)
- {
- Environment.Exit(1);
- }
-
- if (!result.Clean)
- {
- if (!doFix)
+ int exitCode;
+ if (result.Clean == true)
{
- Console.WriteLine("WARNING: would write new segments file, and " + result.TotLoseDocCount + " documents would be lost, if -fix were specified\n");
+ exitCode = 0;
}
else
{
- Console.WriteLine("WARNING: " + result.TotLoseDocCount + " documents will be lost\n");
- Console.WriteLine("NOTE: will write new segments file in 5 seconds; this will remove " + result.TotLoseDocCount + " docs from the index. this IS YOUR LAST CHANCE TO CTRL+C!");
- for (int s = 0;s < 5;s++)
- {
- Thread.Sleep(1000);
- Console.WriteLine(" " + (5 - s) + "...");
- }
- Console.WriteLine("Writing...");
- checker.FixIndex(result);
- Console.WriteLine("OK");
- Console.WriteLine("Wrote new segments file \"" + result.NewSegments.SegmentsFileName + "\"");
- }
- }
- Console.WriteLine("");
-
- int exitCode;
- if (result.Clean == true)
- {
- exitCode = 0;
- }
- else
- {
- exitCode = 1;
- }
- Environment.Exit(exitCode);
- }*/
+ exitCode = 1;
+ }
+ Environment.Exit(exitCode);
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net/Index/IndexUpgrader.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Index/IndexUpgrader.cs b/src/Lucene.Net/Index/IndexUpgrader.cs
index c99323a..9898fea 100644
--- a/src/Lucene.Net/Index/IndexUpgrader.cs
+++ b/src/Lucene.Net/Index/IndexUpgrader.cs
@@ -55,16 +55,18 @@ namespace Lucene.Net.Index
{
private static void PrintUsage()
{
- Console.Error.WriteLine("Upgrades an index so all segments created with a previous Lucene version are rewritten.");
- Console.Error.WriteLine("Usage:");
- Console.Error.WriteLine(" java " + typeof(IndexUpgrader).Name + " [-delete-prior-commits] [-verbose] [-dir-impl X] indexDir");
- Console.Error.WriteLine("this tool keeps only the last commit in an index; for this");
- Console.Error.WriteLine("reason, if the incoming index has more than one commit, the tool");
- Console.Error.WriteLine("refuses to run by default. Specify -delete-prior-commits to override");
- Console.Error.WriteLine("this, allowing the tool to delete all but the last commit.");
- Console.Error.WriteLine("Specify a " + typeof(FSDirectory).Name + " implementation through the -dir-impl option to force its use. If no package is specified the " + typeof(FSDirectory).Namespace + " package will be used.");
- Console.Error.WriteLine("WARNING: this tool may reorder document IDs!");
- Environment.FailFast("1");
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.Error.WriteLine("Upgrades an index so all segments created with a previous Lucene version are rewritten.");
+ //Console.Error.WriteLine("Usage:");
+ //Console.Error.WriteLine(" java " + typeof(IndexUpgrader).Name + " [-delete-prior-commits] [-verbose] [-dir-impl X] indexDir");
+ //Console.Error.WriteLine("this tool keeps only the last commit in an index; for this");
+ //Console.Error.WriteLine("reason, if the incoming index has more than one commit, the tool");
+ //Console.Error.WriteLine("refuses to run by default. Specify -delete-prior-commits to override");
+ //Console.Error.WriteLine("this, allowing the tool to delete all but the last commit.");
+ //Console.Error.WriteLine("Specify a " + typeof(FSDirectory).Name + " implementation through the -dir-impl option to force its use. If no package is specified the " + typeof(FSDirectory).Namespace + " package will be used.");
+ //Console.Error.WriteLine("WARNING: this tool may reorder document IDs!");
+ //Environment.FailFast("1");
}
/// <summary>
@@ -98,8 +100,9 @@ namespace Lucene.Net.Index
{
if (i == args.Length - 1)
{
- Console.WriteLine("ERROR: missing value for -dir-impl option");
- Environment.FailFast("1");
+ throw new ArgumentException("ERROR: missing value for -dir option");
+ //Console.WriteLine("ERROR: missing value for -dir-impl option");
+ //Environment.FailFast("1");
}
i++;
dirImpl = args[i];
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net/Store/LockStressTest.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Store/LockStressTest.cs b/src/Lucene.Net/Store/LockStressTest.cs
index ea5c35c..341bb69 100644
--- a/src/Lucene.Net/Store/LockStressTest.cs
+++ b/src/Lucene.Net/Store/LockStressTest.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
@@ -37,9 +38,24 @@ namespace Lucene.Net.Store
{
if (args.Length != 7)
{
- // LUCENENET TODO: Usage depends on making this into a console application executable.
- Console.WriteLine("Usage: java Lucene.Net.Store.LockStressTest myID verifierHost verifierPort lockFactoryClassName lockDirName sleepTimeMS count\n" + "\n" + " myID = int from 0 .. 255 (should be unique for test process)\n" + " verifierHost = hostname that LockVerifyServer is listening on\n" + " verifierPort = port that LockVerifyServer is listening on\n" + " lockFactoryClassName = primary LockFactory class that we will use\n" + " lockDirName = path to the lock directory (only set for Simple/NativeFSLockFactory\n" + " sleepTimeMS = milliseconds to pause betweeen each lock obtain/release\n" + " count = number of locking tries\n" + "\n" + "You should run multiple instances of this process, each with its own\n" + "unique ID, and each pointing to the same lock directory, to verify\n" + "that locking is working correctly.\n" + "\n" + "Make sure you are first running LockVerifyServer.");
- Environment.FailFast("1");
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.WriteLine("Usage: java Lucene.Net.Store.LockStressTest myID verifierHost verifierPort lockFactoryClassName lockDirName sleepTimeMS count\n" +
+ // "\n" +
+ // " myID = int from 0 .. 255 (should be unique for test process)\n" +
+ // " verifierHost = hostname that LockVerifyServer is listening on\n" +
+ // " verifierPort = port that LockVerifyServer is listening on\n" +
+ // " lockFactoryClassName = primary LockFactory class that we will use\n" +
+ // " lockDirName = path to the lock directory (only set for Simple/NativeFSLockFactory\n" +
+ // " sleepTimeMS = milliseconds to pause betweeen each lock obtain/release\n" +
+ // " count = number of locking tries\n" +
+ // "\n" +
+ // "You should run multiple instances of this process, each with its own\n" +
+ // "unique ID, and each pointing to the same lock directory, to verify\n" +
+ // "that locking is working correctly.\n" +
+ // "\n" +
+ // "Make sure you are first running LockVerifyServer.");
+ //Environment.FailFast("1");
}
int arg = 0;
@@ -47,24 +63,30 @@ namespace Lucene.Net.Store
if (myID < 0 || myID > 255)
{
- Console.WriteLine("myID must be a unique int 0..255");
- Environment.Exit(1);
+ throw new ArgumentException("ID must be a unique int 0..255");
+ //Console.WriteLine("myID must be a unique int 0..255");
+ //Environment.Exit(1);
}
- IPHostEntry verifierHost = Dns.GetHostEntryAsync(args[arg++]).Result;
+ string verifierHost = args[arg++];
int verifierPort = Convert.ToInt32(args[arg++]);
- IPAddress verifierIp = verifierHost.AddressList[0];
- IPEndPoint addr = new IPEndPoint(verifierIp, verifierPort);
-
string lockFactoryClassName = args[arg++];
string lockDirName = args[arg++];
int sleepTimeMS = Convert.ToInt32(args[arg++]);
int count = Convert.ToInt32(args[arg++]);
+ IPAddress[] addresses = Dns.GetHostAddressesAsync(verifierHost).Result;
+ IPAddress addr = addresses.FirstOrDefault();
+
Type c;
try
{
c = Type.GetType(lockFactoryClassName);
+ if (c == null)
+ {
+ // LUCENENET: try again, this time with the Store namespace
+ c = Type.GetType("Lucene.Net.Store." + lockFactoryClassName);
+ }
}
catch (Exception)
{
@@ -99,11 +121,11 @@ namespace Lucene.Net.Store
Console.WriteLine("Connecting to server " + addr + " and registering as client " + myID + "...");
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
+ socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
+ socket.Connect(verifierHost, verifierPort);
+
using (Stream @out = new NetworkStream(socket), @in = new NetworkStream(socket))
{
- socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
- socket.Connect(verifierIp, 500);
-
BinaryReader intReader = new BinaryReader(@in);
BinaryWriter intWriter = new BinaryWriter(@out);
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/f0b56fd2/src/Lucene.Net/Store/LockVerifyServer.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net/Store/LockVerifyServer.cs b/src/Lucene.Net/Store/LockVerifyServer.cs
index 6a22f8f..93a1a52 100644
--- a/src/Lucene.Net/Store/LockVerifyServer.cs
+++ b/src/Lucene.Net/Store/LockVerifyServer.cs
@@ -1,5 +1,6 @@
using Lucene.Net.Support.Threading;
using System;
+using System.Globalization;
using System.IO;
using System.Net;
using System.Net.Sockets;
@@ -41,23 +42,25 @@ namespace Lucene.Net.Store
{
if (args.Length != 2)
{
- // LUCENENET TODO: Usage depends on making this into a console application executable.
- Console.WriteLine("Usage: java Lucene.Net.Store.LockVerifyServer bindToIp clients\n");
- Environment.FailFast("1");
+ // LUCENENET specific - our wrapper console shows the correct usage
+ throw new ArgumentException();
+ //Console.WriteLine("Usage: java Lucene.Net.Store.LockVerifyServer bindToIp clients\n");
+ //Environment.FailFast("1");
}
int arg = 0;
- IPHostEntry ipHostInfo = Dns.GetHostEntryAsync(args[arg++]).Result;
- IPAddress ipAddress = ipHostInfo.AddressList[0];
- IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0);
- int maxClients = Convert.ToInt32(args[arg++]);
+ string hostname = args[arg++];
+ int maxClients = Convert.ToInt32(args[arg++], CultureInfo.InvariantCulture);
+
+ IPAddress ipAddress = IPAddress.Parse(hostname);
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 30000);// SoTimeout = 30000; // initially 30 secs to give clients enough time to startup
- s.Bind(localEndPoint);
+ s.Bind(new IPEndPoint(ipAddress, 0));
+ s.Listen(maxClients);
Console.WriteLine("Listening on " + ((IPEndPoint)s.LocalEndPoint).Port.ToString() + "...");
// we set the port as a sysprop, so the ANT task can read it. For that to work, this server must run in-process: