You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2015/09/13 03:07:12 UTC
svn commit: r1702690 - in /lucene/dev/trunk:
lucene/core/src/java/org/apache/lucene/index/
lucene/core/src/java/org/apache/lucene/store/
lucene/core/src/test/org/apache/lucene/index/
lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/ luce...
Author: uschindler
Date: Sun Sep 13 01:07:11 2015
New Revision: 1702690
URL: http://svn.apache.org/r1702690
Log:
LUCENE-6795: Forbid AccessibleObject#setAccessible and suppress legitimate uses / wrap with doPrivileged
Added:
lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java (with props)
Modified:
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java
lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java
lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java
lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java
lucene/dev/trunk/lucene/tools/forbiddenApis/base.txt
lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java
lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java Sun Sep 13 01:07:11 2015
@@ -77,8 +77,9 @@ final class DocumentsWriterDeleteQueue i
private final DeleteSlice globalSlice;
private final BufferedUpdates globalBufferedUpdates;
- /* only acquired to update the global deletes */
- private final ReentrantLock globalBufferLock = new ReentrantLock();
+
+ // only acquired to update the global deletes, pkg-private for access by tests:
+ final ReentrantLock globalBufferLock = new ReentrantLock();
final long generation;
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java Sun Sep 13 01:07:11 2015
@@ -35,6 +35,7 @@ import java.lang.reflect.Method;
import org.apache.lucene.store.ByteBufferIndexInput.BufferCleaner;
import org.apache.lucene.util.Constants;
+import org.apache.lucene.util.SuppressForbidden;
/** File-based {@link Directory} implementation that uses
* mmap for reading, and {@link
@@ -165,6 +166,7 @@ public class MMapDirectory extends FSDir
public static final boolean UNMAP_SUPPORTED =
AccessController.doPrivileged((PrivilegedAction<Boolean>) MMapDirectory::checkUnmapSupported);
+ @SuppressForbidden(reason = "Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
private static boolean checkUnmapSupported() {
try {
Class<?> clazz = Class.forName("java.nio.DirectByteBuffer");
@@ -307,16 +309,20 @@ public class MMapDirectory extends FSDir
return newIoe;
}
- private static final BufferCleaner CLEANER = (ByteBufferIndexInput parent, ByteBuffer buffer) -> {
+ private static final BufferCleaner CLEANER = (final ByteBufferIndexInput parent, final ByteBuffer buffer) -> {
try {
- AccessController.doPrivileged((PrivilegedExceptionAction<Void>) () -> {
- final Method getCleanerMethod = buffer.getClass().getMethod("cleaner");
- getCleanerMethod.setAccessible(true);
- final Object cleaner = getCleanerMethod.invoke(buffer);
- if (cleaner != null) {
- cleaner.getClass().getMethod("clean").invoke(cleaner);
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
+ @Override
+ @SuppressForbidden(reason = "Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
+ public Void run() throws Exception {
+ final Method getCleanerMethod = buffer.getClass().getMethod("cleaner");
+ getCleanerMethod.setAccessible(true);
+ final Object cleaner = getCleanerMethod.invoke(buffer);
+ if (cleaner != null) {
+ cleaner.getClass().getMethod("clean").invoke(cleaner);
+ }
+ return null;
}
- return null;
});
} catch (PrivilegedActionException e) {
throw new IOException("Unable to unmap the mapped buffer: " + parent.toString(), e.getCause());
Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java Sun Sep 13 01:07:11 2015
@@ -17,7 +17,6 @@ package org.apache.lucene.index;
* the License.
*/
-import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -149,10 +148,7 @@ public class TestDocumentsWriterDeleteQu
NoSuchFieldException, IllegalArgumentException, IllegalAccessException,
InterruptedException {
final DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();
- Field field = DocumentsWriterDeleteQueue.class
- .getDeclaredField("globalBufferLock");
- field.setAccessible(true);
- ReentrantLock lock = (ReentrantLock) field.get(queue);
+ ReentrantLock lock = queue.globalBufferLock;
lock.lock();
Thread t = new Thread() {
@Override
Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java Sun Sep 13 01:07:11 2015
@@ -41,6 +41,7 @@ import org.apache.lucene.util.SuppressFo
import org.apache.lucene.util.TestUtil;
import com.carrotsearch.randomizedtesting.SeedUtils;
+
/**
* Runs TestNRTThreads in a separate process, crashes the JRE in the middle
* of execution, then runs checkindex to make sure it's not corrupt.
@@ -187,6 +188,7 @@ public class TestIndexWriterOnJRECrash e
/**
* currently, this only works/tested on Sun and IBM.
*/
+ @SuppressForbidden(reason = "We need Unsafe to actually crush :-)")
public void crashJRE() {
final String vendor = Constants.JAVA_VENDOR;
final boolean supportsUnsafeNpeDereference =
Modified: lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java (original)
+++ lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java Sun Sep 13 01:07:11 2015
@@ -18,9 +18,8 @@ package org.apache.lucene.sandbox.querie
*/
import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.lucene.util.UnicodeUtil;
+import org.apache.lucene.util.SuppressForbidden;
import org.apache.regexp.CharacterIterator;
import org.apache.regexp.RE;
import org.apache.regexp.REProgram;
@@ -40,6 +39,11 @@ public class JakartaRegexpCapabilities i
private static Method getPrefixMethod;
static {
+ initClass();
+ }
+
+ @SuppressForbidden(reason = "TODO: Remove this class completely and also the hack around setAccessible!")
+ private static void initClass() {
try {
getPrefixMethod = REProgram.class.getMethod("getPrefix");
} catch (Exception e) {
Modified: lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java (original)
+++ lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java Sun Sep 13 01:07:11 2015
@@ -21,9 +21,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.lucene.util.UnicodeUtil;
/**
* An implementation tying Java's built-in java.util.regex to RegexQuery.
Added: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java?rev=1702690&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java (added)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java Sun Sep 13 01:07:11 2015
@@ -0,0 +1,47 @@
+package org.apache.lucene.index;
+
+import org.apache.lucene.util.LuceneTestCase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Accessor to make some package protected methods in {@link IndexWriter} available for testing.
+ * @lucene.internal
+ */
+public final class IndexWriterMaxDocsChanger {
+
+ private IndexWriterMaxDocsChanger() {}
+
+ /**
+ * Tells {@link IndexWriter} to enforce the specified limit as the maximum number of documents in one index; call
+ * {@link #restoreMaxDocs} once your test is done.
+ * @see LuceneTestCase#setIndexWriterMaxDocs(int)
+ */
+ public static void setMaxDocs(int limit) {
+ IndexWriter.setMaxDocs(limit);
+ }
+
+ /**
+ * Returns to the default {@link IndexWriter#MAX_DOCS} limit.
+ * @see LuceneTestCase#restoreIndexWriterMaxDocs()
+ */
+ public static void restoreMaxDocs() {
+ IndexWriter.setMaxDocs(IndexWriter.MAX_DOCS);
+ }
+
+}
Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Sun Sep 13 01:07:11 2015
@@ -29,7 +29,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
@@ -684,23 +683,12 @@ public abstract class LuceneTestCase ext
/** Tells {@link IndexWriter} to enforce the specified limit as the maximum number of documents in one index; call
* {@link #restoreIndexWriterMaxDocs} once your test is done. */
public void setIndexWriterMaxDocs(int limit) {
- Method m;
- try {
- m = IndexWriter.class.getDeclaredMethod("setMaxDocs", int.class);
- } catch (NoSuchMethodException nsme) {
- throw new RuntimeException(nsme);
- }
- m.setAccessible(true);
- try {
- m.invoke(IndexWriter.class, limit);
- } catch (IllegalAccessException | InvocationTargetException iae) {
- throw new RuntimeException(iae);
- }
+ IndexWriterMaxDocsChanger.setMaxDocs(limit);
}
- /** Returns the default {@link IndexWriter#MAX_DOCS} limit. */
+ /** Returns to the default {@link IndexWriter#MAX_DOCS} limit. */
public void restoreIndexWriterMaxDocs() {
- setIndexWriterMaxDocs(IndexWriter.MAX_DOCS);
+ IndexWriterMaxDocsChanger.restoreMaxDocs();
}
// -----------------------------------------------------------------
Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java Sun Sep 13 01:07:11 2015
@@ -20,6 +20,8 @@ package org.apache.lucene.util;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
@@ -184,6 +186,7 @@ public final class RamUsageTester {
* Create a cached information about shallow size and reference fields for
* a given class.
*/
+ @SuppressForbidden(reason = "We need to access private fields of measured objects.")
private static ClassCache createCacheEntry(final Class<?> clazz) {
ClassCache cachedInfo;
long shallowInstanceSize = RamUsageEstimator.NUM_BYTES_OBJECT_HEADER;
@@ -199,8 +202,8 @@ public final class RamUsageTester {
shallowInstanceSize = RamUsageEstimator.adjustForField(shallowInstanceSize, f);
if (!f.getType().isPrimitive()) {
- f.setAccessible(true);
- referenceFields.add(f);
+ final PrivilegedAction<Field> act = () -> { f.setAccessible(true); return f; };
+ referenceFields.add(AccessController.doPrivileged(act));
}
}
}
Modified: lucene/dev/trunk/lucene/tools/forbiddenApis/base.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/tools/forbiddenApis/base.txt?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/tools/forbiddenApis/base.txt (original)
+++ lucene/dev/trunk/lucene/tools/forbiddenApis/base.txt Sun Sep 13 01:07:11 2015
@@ -27,13 +27,16 @@ java.util.Properties#load(java.io.InputS
java.util.Properties#save(java.io.OutputStream,java.lang.String)
java.util.Properties#store(java.io.OutputStream,java.lang.String)
+@defaultMessage Accessing private members of foreign classes breaks in security-sensitive environments. In addition, it no longer works with Java 9 on runtime classes.
+java.lang.reflect.AccessibleObject#setAccessible(boolean)
+java.lang.reflect.AccessibleObject#setAccessible(java.lang.reflect.AccessibleObject[],boolean)
+
java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars
java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars
java.io.File#delete() @ use Files.delete for real exception, IOUtils.deleteFilesIgnoringExceptions if you dont care
-@defaultMessage Use shuffle(List, Random) instead so that it can be reproduced
-java.util.Collections#shuffle(java.util.List)
+java.util.Collections#shuffle(java.util.List) @ Use shuffle(List, Random) instead so that it can be reproduced
# START: forbidden-apis patch
# TODO: remove this once forbidden-apis was updated to next version with following commit:
Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java Sun Sep 13 01:07:11 2015
@@ -16,17 +16,16 @@
*/
package org.apache.solr.handler.dataimport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
import java.sql.Blob;
+import java.sql.SQLException;
import java.util.Properties;
-import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -62,24 +61,13 @@ public class FieldStreamDataSource exten
Object o = wrapper.getVariableResolver().resolve(dataField);
if (o == null) {
throw new DataImportHandlerException(SEVERE, "No field available for name : " + dataField);
- }
- if (o instanceof Blob) {
+ } else if (o instanceof Blob) {
Blob blob = (Blob) o;
try {
- //Most of the JDBC drivers have getBinaryStream defined as public
- // so let us just check it
- Method m = blob.getClass().getDeclaredMethod("getBinaryStream");
- if (Modifier.isPublic(m.getModifiers())) {
- return (InputStream) m.invoke(blob);
- } else {
- // force invoke
- m.setAccessible(true);
- return (InputStream) m.invoke(blob);
- }
- } catch (Exception e) {
+ return blob.getBinaryStream();
+ } catch (SQLException sqle) {
LOG.info("Unable to get data from BLOB");
return null;
-
}
} else if (o instanceof byte[]) {
byte[] bytes = (byte[]) o;
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java Sun Sep 13 01:07:11 2015
@@ -17,8 +17,10 @@ package org.apache.solr.cloud;
*/
import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
+
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.core.NodeConfig;
@@ -30,8 +32,6 @@ import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
@@ -50,15 +50,6 @@ public class SolrXmlInZkTest extends Sol
private NodeConfig cfg;
- private SolrDispatchFilter solrDispatchFilter;
-
- @After
- public void after() {
- if (solrDispatchFilter != null) {
- solrDispatchFilter.destroy();
- }
- }
-
private void setUpZkAndDiskXml(boolean toZk, boolean leaveOnLocal) throws Exception {
File tmpDir = createTempDir().toFile();
File solrHome = new File(tmpDir, "home");
@@ -95,13 +86,7 @@ public class SolrXmlInZkTest extends Sol
props.setProperty("solr.test.sys.prop1", "propone");
props.setProperty("solr.test.sys.prop2", "proptwo");
- Method method = SolrDispatchFilter.class.getDeclaredMethod("loadNodeConfig", String.class, Properties.class);
- method.setAccessible(true);
- if (solrDispatchFilter != null) solrDispatchFilter.destroy();
- solrDispatchFilter = new SolrDispatchFilter();
- Object obj = method.invoke(solrDispatchFilter, solrHome.getAbsolutePath(), props);
- cfg = (NodeConfig) obj;
-
+ cfg = SolrDispatchFilter.loadNodeConfig(solrHome.getAbsolutePath(), props);
log.info("####SETUP_END " + getTestName());
}
@@ -155,9 +140,9 @@ public class SolrXmlInZkTest extends Sol
System.setProperty("hostPort", "8787");
setUpZkAndDiskXml(false, false); // solr.xml not on disk either
fail("Should have thrown an exception here");
- } catch (InvocationTargetException ite) {
+ } catch (SolrException solre) {
assertTrue("Should be failing to create default solr.xml in code",
- ite.getCause().getMessage().contains("solr.xml does not exist"));
+ solre.getMessage().contains("solr.xml does not exist"));
} finally {
closeZK();
}
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java Sun Sep 13 01:07:11 2015
@@ -19,8 +19,11 @@ package org.apache.solr.client.solrj.bea
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.SuppressForbidden;
import java.lang.reflect.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.*;
import java.util.regex.Pattern;
import java.util.concurrent.ConcurrentHashMap;
@@ -123,6 +126,7 @@ public class DocumentObjectBinder {
return fields;
}
+ @SuppressForbidden(reason = "Needs access to possibly private @Field annotated fields/methods")
private List<DocField> collectInfo(Class clazz) {
List<DocField> fields = new ArrayList<>();
Class superClazz = clazz;
@@ -136,7 +140,7 @@ public class DocumentObjectBinder {
boolean childFieldFound = false;
for (AccessibleObject member : members) {
if (member.isAnnotationPresent(Field.class)) {
- member.setAccessible(true);
+ AccessController.doPrivileged((PrivilegedAction<Void>) () -> { member.setAccessible(true); return null; });
DocField df = new DocField(member);
if (df.child != null) {
if (childFieldFound)
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java Sun Sep 13 01:07:11 2015
@@ -22,9 +22,12 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.SocketAddress;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
+import org.apache.solr.common.util.SuppressForbidden;
import org.apache.zookeeper.ClientCnxn;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
@@ -55,34 +58,40 @@ public class SolrZooKeeper extends ZooKe
@Override
public void run() {
try {
- final ClientCnxn cnxn = getConnection();
- synchronized (cnxn) {
- try {
- final Field sendThreadFld = cnxn.getClass().getDeclaredField("sendThread");
- sendThreadFld.setAccessible(true);
- Object sendThread = sendThreadFld.get(cnxn);
- if (sendThread != null) {
- Method method = sendThread.getClass().getDeclaredMethod("testableCloseSocket");
- method.setAccessible(true);
- try {
- method.invoke(sendThread);
- } catch (InvocationTargetException e) {
- // is fine
- }
+ AccessController.doPrivileged((PrivilegedAction<Void>) this::closeZookeeperChannel);
+ } finally {
+ spawnedThreads.remove(this);
+ }
+ }
+
+ @SuppressForbidden(reason = "Hack for Zookeper needs access to private methods.")
+ private Void closeZookeeperChannel() {
+ final ClientCnxn cnxn = getConnection();
+ synchronized (cnxn) {
+ try {
+ final Field sendThreadFld = cnxn.getClass().getDeclaredField("sendThread");
+ sendThreadFld.setAccessible(true);
+ Object sendThread = sendThreadFld.get(cnxn);
+ if (sendThread != null) {
+ Method method = sendThread.getClass().getDeclaredMethod("testableCloseSocket");
+ method.setAccessible(true);
+ try {
+ method.invoke(sendThread);
+ } catch (InvocationTargetException e) {
+ // is fine
}
- } catch (Exception e) {
- throw new RuntimeException("Closing Zookeeper send channel failed.", e);
}
+ } catch (Exception e) {
+ throw new RuntimeException("Closing Zookeeper send channel failed.", e);
}
- } finally {
- spawnedThreads.remove(this);
}
+ return null; // Void
}
};
spawnedThreads.add(t);
t.start();
}
-
+
@Override
public synchronized void close() throws InterruptedException {
for (Thread t : spawnedThreads) {
Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Sun Sep 13 01:07:11 2015
@@ -25,10 +25,9 @@ import junit.framework.Assert;
import org.apache.lucene.util.TestUtil;
import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.embedded.SolrExampleStreamingTest.ErrorTrackingConcurrentUpdateSolrClient;
import org.apache.solr.client.solrj.impl.BinaryResponseParser;
-import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient.RemoteSolrException;
import org.apache.solr.client.solrj.impl.NoOpResponseParser;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
@@ -48,7 +47,6 @@ import org.apache.solr.client.solrj.resp
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.AnalysisParams;
import org.apache.solr.common.params.CommonParams;
@@ -61,7 +59,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
-import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -458,27 +455,18 @@ abstract public class SolrExampleTests e
} catch (Throwable t) {
Assert.fail("should have thrown a SolrException! not: " + t);
}
- } else if (client instanceof ConcurrentUpdateSolrClient) {
+ } else if (client instanceof ErrorTrackingConcurrentUpdateSolrClient) {
//XXX concurrentupdatesolrserver reports errors differently
- ConcurrentUpdateSolrClient concurrentClient = (ConcurrentUpdateSolrClient) client;
- Field field = getConcurrentClientExceptionField(concurrentClient);
- field.set(concurrentClient, null);
+ ErrorTrackingConcurrentUpdateSolrClient concurrentClient = (ErrorTrackingConcurrentUpdateSolrClient) client;
+ concurrentClient.lastError = null;
concurrentClient.add(doc);
concurrentClient.blockUntilFinished();
- Throwable lastError = (Throwable)field.get(concurrentClient);
- assertNotNull("Should throw exception!", lastError); //XXX
+ assertNotNull("Should throw exception!", concurrentClient.lastError);
} else {
log.info("Ignoring update test for client:" + client.getClass().getName());
}
}
- private static Field getConcurrentClientExceptionField(Object cs)
- throws SecurityException, NoSuchFieldException, IllegalArgumentException {
- Field field = cs.getClass().getDeclaredField("lastError");
- field.setAccessible(true);
- return field;
- }
-
@Test
public void testAugmentFields() throws Exception
{
@@ -1639,7 +1627,9 @@ abstract public class SolrExampleTests e
fail("Operation should throw an exception!");
} else {
client.commit(); //just to be sure the client has sent the doc
- assertTrue("ConcurrentUpdateSolrClient did not report an error", ((Throwable) getConcurrentClientExceptionField(client).get(client)).getMessage().contains("Conflict"));
+ ErrorTrackingConcurrentUpdateSolrClient concurrentClient = (ErrorTrackingConcurrentUpdateSolrClient) client;
+ assertNotNull("ConcurrentUpdateSolrClient did not report an error", concurrentClient.lastError);
+ assertTrue("ConcurrentUpdateSolrClient did not report an error", concurrentClient.lastError.getMessage().contains("Conflict"));
}
} catch (SolrException se) {
assertTrue("No identifiable error message", se.getMessage().contains("version conflict for unique"));
Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java?rev=1702690&r1=1702689&r2=1702690&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java Sun Sep 13 01:07:11 2015
@@ -46,6 +46,19 @@ public class SolrExampleStreamingTest ex
public static void beforeTest() throws Exception {
createJetty(legacyExampleCollection1SolrHome());
}
+
+ public class ErrorTrackingConcurrentUpdateSolrClient extends ConcurrentUpdateSolrClient {
+ public Throwable lastError = null;
+
+ public ErrorTrackingConcurrentUpdateSolrClient(String solrServerUrl, int queueSize, int threadCount) {
+ super(solrServerUrl, queueSize, threadCount);
+ }
+
+ @Override
+ public void handleError(Throwable ex) {
+ handledException = lastError = ex;
+ }
+ }
@Override
public SolrClient createNewSolrClient()
@@ -54,15 +67,7 @@ public class SolrExampleStreamingTest ex
// setup the server...
String url = jetty.getBaseUrl().toString() + "/collection1";
// smaller queue size hits locks more often
- ConcurrentUpdateSolrClient concurrentClient = new ConcurrentUpdateSolrClient( url, 2, 5 ) {
-
- public Throwable lastError = null;
- @Override
- public void handleError(Throwable ex) {
- handledException = lastError = ex;
- }
- };
-
+ ConcurrentUpdateSolrClient concurrentClient = new ErrorTrackingConcurrentUpdateSolrClient( url, 2, 5 );
concurrentClient.setParser(new XMLResponseParser());
concurrentClient.setRequestWriter(new RequestWriter());
return concurrentClient;