You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2012/01/25 20:49:30 UTC
svn commit: r1235888 [12/12] - in /lucene/dev/trunk: dev-tools/eclipse/
dev-tools/maven/ solr/ solr/cloud-dev/
solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/
solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/d...
Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1235888&r1=1235887&r2=1235888&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Wed Jan 25 19:49:26 2012
@@ -27,6 +27,7 @@ import org.apache.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.SolrInputField;
+import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
@@ -64,6 +65,7 @@ public abstract class SolrTestCaseJ4 ext
@BeforeClass
public static void beforeClassSolrTestCase() throws Exception {
startTrackingSearchers();
+ startTrackingZkClients();
ignoreException("ignore_exception");
}
@@ -72,6 +74,7 @@ public abstract class SolrTestCaseJ4 ext
deleteCore();
resetExceptionIgnores();
endTrackingSearchers();
+ endTrackingZkClients();
}
@Override
@@ -110,6 +113,12 @@ public abstract class SolrTestCaseJ4 ext
numOpens = SolrIndexSearcher.numOpens.get();
numCloses = SolrIndexSearcher.numCloses.get();
}
+ static long zkClientNumOpens;
+ static long zkClientNumCloses;
+ public static void startTrackingZkClients() {
+ zkClientNumOpens = SolrZkClient.numOpens.get();
+ zkClientNumCloses = SolrZkClient.numCloses.get();
+ }
public static void endTrackingSearchers() {
long endNumOpens = SolrIndexSearcher.numOpens.get();
@@ -118,6 +127,18 @@ public abstract class SolrTestCaseJ4 ext
SolrIndexSearcher.numOpens.getAndSet(0);
SolrIndexSearcher.numCloses.getAndSet(0);
+ // wait a bit in case any ending threads have anything to release
+ int retries = 0;
+ while (endNumOpens - numOpens != endNumCloses - numCloses) {
+ if (retries++ > 15) {
+ break;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {}
+ endNumOpens = SolrIndexSearcher.numOpens.get();
+ endNumCloses = SolrIndexSearcher.numCloses.get();
+ }
if (endNumOpens-numOpens != endNumCloses-numCloses) {
String msg = "ERROR: SolrIndexSearcher opens=" + (endNumOpens-numOpens) + " closes=" + (endNumCloses-numCloses);
@@ -127,6 +148,22 @@ public abstract class SolrTestCaseJ4 ext
}
}
+ public static void endTrackingZkClients() {
+ long endNumOpens = SolrZkClient.numOpens.get();
+ long endNumCloses = SolrZkClient.numCloses.get();
+
+ SolrZkClient.numOpens.getAndSet(0);
+ SolrZkClient.numCloses.getAndSet(0);
+
+
+ if (endNumOpens-zkClientNumOpens != endNumCloses-zkClientNumCloses) {
+ String msg = "ERROR: SolrZkClient opens=" + (endNumOpens-zkClientNumOpens) + " closes=" + (endNumCloses-zkClientNumCloses);
+ log.error(msg);
+ testsFailed = true;
+ fail(msg);
+ }
+ }
+
/** Causes an exception matching the regex pattern to not be logged. */
public static void ignoreException(String pattern) {
if (SolrException.ignorePatterns == null)
@@ -240,17 +277,20 @@ public abstract class SolrTestCaseJ4 ext
String configFile = getSolrConfigFile();
if (configFile != null) {
-
- solrConfig = h.createConfig(getSolrConfigFile());
- h = new TestHarness( dataDir.getAbsolutePath(),
- solrConfig,
- getSchemaFile());
- lrf = h.getRequestFactory
- ("standard",0,20,CommonParams.VERSION,"2.2");
+ createCore();
}
log.info("####initCore end");
}
+ public static void createCore() throws Exception {
+ solrConfig = h.createConfig(getSolrConfigFile());
+ h = new TestHarness( dataDir.getAbsolutePath(),
+ solrConfig,
+ getSchemaFile());
+ lrf = h.getRequestFactory
+ ("standard",0,20,CommonParams.VERSION,"2.2");
+ }
+
/** Subclasses that override setUp can optionally call this method
* to log the fact that their setUp process has ended.
*/
@@ -379,6 +419,30 @@ public abstract class SolrTestCaseJ4 ext
}
}
+ /** Makes a query request and returns the JSON string response */
+ public static String JQ(SolrQueryRequest req) throws Exception {
+ SolrParams params = req.getParams();
+ if (!"json".equals(params.get("wt","xml")) || params.get("indent")==null) {
+ ModifiableSolrParams newParams = new ModifiableSolrParams(params);
+ newParams.set("wt","json");
+ if (params.get("indent")==null) newParams.set("indent","true");
+ req.setParams(newParams);
+ }
+
+ String response;
+ boolean failed=true;
+ try {
+ response = h.query(req);
+ failed = false;
+ } finally {
+ if (failed) {
+ log.error("REQUEST FAILED: " + req.getParamString());
+ }
+ }
+
+ return response;
+ }
+
/**
* Validates a query matches some JSON test expressions using the default double delta tollerance.
* @see JSONTestUtil#DEFAULT_DELTA
@@ -398,7 +462,7 @@ public abstract class SolrTestCaseJ4 ext
* matching more than what you want to test.
* </p>
* @param req Solr request to execute
- * @param delta tollerance allowed in comparing float/double values
+ * @param delta tolerance allowed in comparing float/double values
* @param tests JSON path expression + '==' + expected value
*/
public static void assertJQ(SolrQueryRequest req, double delta, String... tests) throws Exception {
@@ -647,6 +711,14 @@ public abstract class SolrTestCaseJ4 ext
/** Send JSON update commands */
public static String updateJ(String json, SolrParams args) throws Exception {
SolrCore core = h.getCore();
+ if (args == null) {
+ args = params("wt","json","indent","true");
+ } else {
+ ModifiableSolrParams newArgs = new ModifiableSolrParams(args);
+ if (newArgs.get("wt") == null) newArgs.set("wt","json");
+ if (newArgs.get("indent") == null) newArgs.set("indent","true");
+ args = newArgs;
+ }
DirectSolrConnection connection = new DirectSolrConnection(core);
SolrRequestHandler handler = core.getRequestHandler("/update/json");
if (handler == null) {
@@ -656,6 +728,128 @@ public abstract class SolrTestCaseJ4 ext
return connection.request(handler, args, json);
}
+ public static SolrInputDocument sdoc(Object... fieldsAndValues) {
+ SolrInputDocument sd = new SolrInputDocument();
+ for (int i=0; i<fieldsAndValues.length; i+=2) {
+ sd.addField((String)fieldsAndValues[i], fieldsAndValues[i+1]);
+ }
+ return sd;
+ }
+
+ /** Creates JSON from a SolrInputDocument. Doesn't currently handle boosts. */
+ public static String json(SolrInputDocument doc) {
+ CharArr out = new CharArr();
+ try {
+ out.append('{');
+ boolean firstField = true;
+ for (SolrInputField sfield : doc) {
+ if (firstField) firstField=false;
+ else out.append(',');
+ JSONUtil.writeString(sfield.getName(), 0, sfield.getName().length(), out);
+ out.append(':');
+ if (sfield.getValueCount() > 1) {
+ out.append('[');
+ }
+ boolean firstVal = true;
+ for (Object val : sfield) {
+ if (firstVal) firstVal=false;
+ else out.append(',');
+ out.append(JSONUtil.toJSON(val));
+ }
+ if (sfield.getValueCount() > 1) {
+ out.append(']');
+ }
+ }
+ out.append('}');
+ } catch (IOException e) {
+ // should never happen
+ }
+ return out.toString();
+ }
+
+ /** Creates a JSON add command from a SolrInputDocument list. Doesn't currently handle boosts. */
+ public static String jsonAdd(SolrInputDocument... docs) {
+ CharArr out = new CharArr();
+ try {
+ out.append('[');
+ boolean firstField = true;
+ for (SolrInputDocument doc : docs) {
+ if (firstField) firstField=false;
+ else out.append(',');
+ out.append(json(doc));
+ }
+ out.append(']');
+ } catch (IOException e) {
+ // should never happen
+ }
+ return out.toString();
+ }
+
+ /** Creates a JSON delete command from an id list */
+ public static String jsonDelId(Object... ids) {
+ CharArr out = new CharArr();
+ try {
+ out.append('{');
+ boolean first = true;
+ for (Object id : ids) {
+ if (first) first=false;
+ else out.append(',');
+ out.append("\"delete\":{\"id\":");
+ out.append(JSONUtil.toJSON(id));
+ out.append('}');
+ }
+ out.append('}');
+ } catch (IOException e) {
+ // should never happen
+ }
+ return out.toString();
+ }
+
+
+ /** Creates a JSON deleteByQuery command */
+ public static String jsonDelQ(String... queries) {
+ CharArr out = new CharArr();
+ try {
+ out.append('{');
+ boolean first = true;
+ for (Object q : queries) {
+ if (first) first=false;
+ else out.append(',');
+ out.append("\"delete\":{\"query\":");
+ out.append(JSONUtil.toJSON(q));
+ out.append('}');
+ }
+ out.append('}');
+ } catch (IOException e) {
+ // should never happen
+ }
+ return out.toString();
+ }
+
+
+ public static Long addAndGetVersion(SolrInputDocument sdoc, SolrParams params) throws Exception {
+ String response = updateJ(jsonAdd(sdoc), params);
+ Map rsp = (Map)ObjectBuilder.fromJSON(response);
+ List lst = (List)rsp.get("adds");
+ if (lst == null || lst.size() == 0) return null;
+ return (Long) lst.get(1);
+ }
+
+ public static Long deleteAndGetVersion(String id, SolrParams params) throws Exception {
+ String response = updateJ(jsonDelId(id), params);
+ Map rsp = (Map)ObjectBuilder.fromJSON(response);
+ List lst = (List)rsp.get("deletes");
+ if (lst == null || lst.size() == 0) return null;
+ return (Long) lst.get(1);
+ }
+
+ public static Long deleteByQueryAndGetVersion(String q, SolrParams params) throws Exception {
+ String response = updateJ(jsonDelQ(q), params);
+ Map rsp = (Map)ObjectBuilder.fromJSON(response);
+ List lst = (List)rsp.get("deleteByQuery");
+ if (lst == null || lst.size() == 0) return null;
+ return (Long) lst.get(1);
+ }
/////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// random document / index creation ///////////////////////
Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java?rev=1235888&r1=1235887&r2=1235888&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java Wed Jan 25 19:49:26 2012
@@ -216,6 +216,12 @@ public class TestHarness {
SolrCore core = new SolrCore(coreName, dataDirectory, solrConfig, indexSchema, dcore);
container.register(coreName, core, false);
+ // TODO: we should be exercising the *same* core container initialization code, not equivalent code!
+ if (container.getZkController() == null && core.getUpdateHandler().getUpdateLog() != null) {
+ // always kick off recovery if we are in standalone mode.
+ core.getUpdateHandler().getUpdateLog().recoverFromLog();
+ }
+
return container;
}
}
Modified: lucene/dev/trunk/solr/webapp/web/admin/zookeeper.jsp
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/admin/zookeeper.jsp?rev=1235888&r1=1235887&r2=1235888&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/admin/zookeeper.jsp (original)
+++ lucene/dev/trunk/solr/webapp/web/admin/zookeeper.jsp Wed Jan 25 19:49:26 2012
@@ -310,7 +310,7 @@
Stat stat = new Stat();
try {
- byte[] data = zkClient.getData(path, null, stat);
+ byte[] data = zkClient.getData(path, null, stat, true);
if (stat.getEphemeralOwner() != 0)
out.print("ephemeral ");
@@ -362,7 +362,7 @@
List<String> children = null;
try {
- children = zkClient.getChildren(path, null);
+ children = zkClient.getChildren(path, null, true);
} catch (KeeperException e) {
exception(e);
return;
@@ -389,7 +389,7 @@
try {
Stat stat = new Stat();
- byte[] data = zkClient.getData(path, null, stat);
+ byte[] data = zkClient.getData(path, null, stat, true);
out.print("<h2>");
xmlescape(path);
Modified: lucene/dev/trunk/solr/webapp/web/zookeeper.jsp
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/zookeeper.jsp?rev=1235888&r1=1235887&r2=1235888&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/zookeeper.jsp (original)
+++ lucene/dev/trunk/solr/webapp/web/zookeeper.jsp Wed Jan 25 19:49:26 2012
@@ -286,7 +286,7 @@ static class ZKPrinter
Stat stat = new Stat();
try
{
- byte[] data = zkClient.getData(path, null, stat);
+ byte[] data = zkClient.getData(path, null, stat, true);
if( stat.getEphemeralOwner() != 0 )
{
@@ -361,7 +361,7 @@ static class ZKPrinter
List<String> children = null;
try
{
- children = zkClient.getChildren(path, null);
+ children = zkClient.getChildren(path, null, true);
}
catch (KeeperException e)
{
@@ -407,7 +407,7 @@ static class ZKPrinter
try
{
Stat stat = new Stat();
- byte[] data = zkClient.getData(path, null, stat);
+ byte[] data = zkClient.getData(path, null, stat, true);
out.println("\"znode\" : {");