Remove all setAccessible in tests and forbid
This commit is contained in:
parent
3a0dd59a15
commit
b16e1569fe
|
@ -260,6 +260,10 @@ public long ramBytesUsed() {
|
||||||
return fst == null ? 0 : fst.ramBytesUsed();
|
return fst == null ? 0 : fst.ramBytesUsed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getMaxAnalyzedPathsForOneInput() {
|
||||||
|
return maxAnalyzedPathsForOneInput;
|
||||||
|
}
|
||||||
|
|
||||||
// Replaces SEP with epsilon or remaps them if
|
// Replaces SEP with epsilon or remaps them if
|
||||||
// we were asked to preserve them:
|
// we were asked to preserve them:
|
||||||
private Automaton replaceSep(Automaton a) {
|
private Automaton replaceSep(Automaton a) {
|
||||||
|
|
|
@ -200,22 +200,6 @@ public class SecurityTests extends ESTestCase {
|
||||||
} catch (IOException expected) {}
|
} catch (IOException expected) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** We only grant this to special jars */
|
|
||||||
public void testUnsafeAccess() throws Exception {
|
|
||||||
assumeTrue("test requires security manager", System.getSecurityManager() != null);
|
|
||||||
try {
|
|
||||||
// class could be legitimately loaded, so we might not fail until setAccessible
|
|
||||||
Class.forName("sun.misc.Unsafe")
|
|
||||||
.getDeclaredField("theUnsafe")
|
|
||||||
.setAccessible(true);
|
|
||||||
fail("didn't get expected exception");
|
|
||||||
} catch (SecurityException expected) {
|
|
||||||
// ok
|
|
||||||
} catch (Exception somethingElse) {
|
|
||||||
assumeNoException("perhaps JVM doesn't have Unsafe?", somethingElse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** can't execute processes */
|
/** can't execute processes */
|
||||||
public void testProcessExecution() throws Exception {
|
public void testProcessExecution() throws Exception {
|
||||||
assumeTrue("test requires security manager", System.getSecurityManager() != null);
|
assumeTrue("test requires security manager", System.getSecurityManager() != null);
|
||||||
|
|
|
@ -29,8 +29,6 @@ import org.elasticsearch.test.ESIntegTestCase.Scope;
|
||||||
import org.hamcrest.Matchers;
|
import org.hamcrest.Matchers;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import static org.elasticsearch.indices.analysis.HunspellService.*;
|
import static org.elasticsearch.indices.analysis.HunspellService.*;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
|
||||||
|
@ -114,10 +112,8 @@ public class HunspellServiceIT extends ESIntegTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: open up a getter on Dictionary
|
// TODO: on next upgrade of lucene, just use new getter
|
||||||
private void assertIgnoreCase(boolean expected, Dictionary dictionary) throws Exception {
|
private void assertIgnoreCase(boolean expected, Dictionary dictionary) throws Exception {
|
||||||
Field f = Dictionary.class.getDeclaredField("ignoreCase");
|
// assertEquals(expected, dictionary.getIgnoreCase());
|
||||||
f.setAccessible(true);
|
|
||||||
assertEquals(expected, f.getBoolean(dictionary));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,146 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.network;
|
|
||||||
|
|
||||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
|
||||||
import org.elasticsearch.common.unit.ByteSizeValue;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
|
||||||
import org.elasticsearch.node.Node;
|
|
||||||
import org.elasticsearch.test.ESIntegTestCase;
|
|
||||||
import org.hamcrest.Matchers;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public class DirectBufferNetworkIT extends ESIntegTestCase {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Settings nodeSettings(int nodeOrdinal) {
|
|
||||||
return Settings.builder()
|
|
||||||
.put(Node.HTTP_ENABLED, true)
|
|
||||||
.put(super.nodeSettings(nodeOrdinal)).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This test validates that using large data sets (large docs + large API requests) don't
|
|
||||||
* cause a large direct byte buffer to be allocated internally in the sun.nio buffer cache.
|
|
||||||
* <p/>
|
|
||||||
* See {@link org.elasticsearch.common.netty.NettyUtils#DEFAULT_GATHERING} for more info.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void verifySaneDirectBufferAllocations() throws Exception {
|
|
||||||
assumeTrue("test cannot run with security manager enabled", System.getSecurityManager() == null);
|
|
||||||
createIndex("test");
|
|
||||||
|
|
||||||
int estimatedBytesSize = scaledRandomIntBetween(ByteSizeValue.parseBytesSizeValue("1.1mb", "estimatedBytesSize").bytesAsInt(),
|
|
||||||
ByteSizeValue.parseBytesSizeValue("1.5mb", "estimatedBytesSize").bytesAsInt());
|
|
||||||
byte[] data = new byte[estimatedBytesSize];
|
|
||||||
getRandom().nextBytes(data);
|
|
||||||
|
|
||||||
ByteArrayOutputStream docOut = new ByteArrayOutputStream();
|
|
||||||
// we use smile to automatically use the binary mapping
|
|
||||||
XContentBuilder doc = XContentFactory.smileBuilder(docOut).startObject().startObject("doc").field("value", data).endObject();
|
|
||||||
doc.close();
|
|
||||||
byte[] docBytes = docOut.toByteArray();
|
|
||||||
|
|
||||||
int numDocs = randomIntBetween(2, 5);
|
|
||||||
logger.info("indexing [{}] docs, each with size [{}]", numDocs, estimatedBytesSize);
|
|
||||||
IndexRequestBuilder[] builders = new IndexRequestBuilder[numDocs];
|
|
||||||
for (int i = 0; i < numDocs; ++i) {
|
|
||||||
builders[i] = client().prepareIndex("test", "type").setSource(docBytes);
|
|
||||||
}
|
|
||||||
indexRandom(true, builders);
|
|
||||||
logger.info("done indexing");
|
|
||||||
|
|
||||||
logger.info("executing random client search for all docs");
|
|
||||||
assertHitCount(client().prepareSearch("test").setFrom(0).setSize(numDocs).get(), numDocs);
|
|
||||||
logger.info("executing transport client search for all docs");
|
|
||||||
assertHitCount(internalCluster().transportClient().prepareSearch("test").setFrom(0).setSize(numDocs).get(), numDocs);
|
|
||||||
|
|
||||||
logger.info("executing HTTP search for all docs");
|
|
||||||
// simulate large HTTP call as well
|
|
||||||
httpClient().method("GET").path("/test/_search").addParam("size", Integer.toString(numDocs)).execute();
|
|
||||||
|
|
||||||
logger.info("validating large direct buffer not allocated");
|
|
||||||
validateNoLargeDirectBufferAllocated();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates that all the thread local allocated ByteBuffer in sun.nio under the Util$BufferCache
|
|
||||||
* are not greater than 1mb.
|
|
||||||
*/
|
|
||||||
private void validateNoLargeDirectBufferAllocated() throws Exception {
|
|
||||||
// Make the fields in the Thread class that store ThreadLocals
|
|
||||||
// accessible
|
|
||||||
Field threadLocalsField = Thread.class.getDeclaredField("threadLocals");
|
|
||||||
threadLocalsField.setAccessible(true);
|
|
||||||
// Make the underlying array of ThreadLoad.ThreadLocalMap.Entry objects
|
|
||||||
// accessible
|
|
||||||
Class<?> tlmClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");
|
|
||||||
Field tableField = tlmClass.getDeclaredField("table");
|
|
||||||
tableField.setAccessible(true);
|
|
||||||
|
|
||||||
for (Thread thread : Thread.getAllStackTraces().keySet()) {
|
|
||||||
if (thread == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Object threadLocalMap = threadLocalsField.get(thread);
|
|
||||||
if (threadLocalMap == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Object[] table = (Object[]) tableField.get(threadLocalMap);
|
|
||||||
if (table == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (Object entry : table) {
|
|
||||||
if (entry == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Field valueField = entry.getClass().getDeclaredField("value");
|
|
||||||
valueField.setAccessible(true);
|
|
||||||
Object value = valueField.get(entry);
|
|
||||||
if (value == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!value.getClass().getName().equals("sun.nio.ch.Util$BufferCache")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Field buffersField = value.getClass().getDeclaredField("buffers");
|
|
||||||
buffersField.setAccessible(true);
|
|
||||||
Object[] buffers = (Object[]) buffersField.get(value);
|
|
||||||
for (Object buffer : buffers) {
|
|
||||||
if (buffer == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
assertThat(((ByteBuffer) buffer).capacity(), Matchers.lessThan(1 * 1024 * 1024));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -244,11 +244,9 @@ public class CompletionPostingsFormatTests extends ESTestCase {
|
||||||
fieldType.setProvider(currentProvider);
|
fieldType.setProvider(currentProvider);
|
||||||
final CompletionFieldMapper mapper = new CompletionFieldMapper("foo", fieldType, Integer.MAX_VALUE, indexSettings, FieldMapper.MultiFields.empty(), null);
|
final CompletionFieldMapper mapper = new CompletionFieldMapper("foo", fieldType, Integer.MAX_VALUE, indexSettings, FieldMapper.MultiFields.empty(), null);
|
||||||
Lookup buildAnalyzingLookup = buildAnalyzingLookup(mapper, titles, titles, weights);
|
Lookup buildAnalyzingLookup = buildAnalyzingLookup(mapper, titles, titles, weights);
|
||||||
Field field = buildAnalyzingLookup.getClass().getDeclaredField("maxAnalyzedPathsForOneInput");
|
if (buildAnalyzingLookup instanceof XAnalyzingSuggester) {
|
||||||
field.setAccessible(true);
|
assertEquals(reference.getMaxAnalyzedPathsForOneInput(), ((XAnalyzingSuggester) buildAnalyzingLookup).getMaxAnalyzedPathsForOneInput());
|
||||||
Field refField = reference.getClass().getDeclaredField("maxAnalyzedPathsForOneInput");
|
}
|
||||||
refField.setAccessible(true);
|
|
||||||
assertThat(refField.get(reference), equalTo(field.get(buildAnalyzingLookup)));
|
|
||||||
|
|
||||||
for (int i = 0; i < titles.length; i++) {
|
for (int i = 0; i < titles.length; i++) {
|
||||||
int res = between(1, 10);
|
int res = between(1, 10);
|
||||||
|
|
|
@ -33,6 +33,7 @@ import com.carrotsearch.randomizedtesting.rules.TestRuleAdapter;
|
||||||
import org.apache.lucene.uninverting.UninvertingReader;
|
import org.apache.lucene.uninverting.UninvertingReader;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
||||||
|
import org.apache.lucene.util.TestRuleMarkFailure;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
import org.apache.lucene.util.TimeUnits;
|
import org.apache.lucene.util.TimeUnits;
|
||||||
import org.elasticsearch.Version;
|
import org.elasticsearch.Version;
|
||||||
|
@ -643,4 +644,9 @@ public abstract class ESTestCase extends LuceneTestCase {
|
||||||
sb.append("]");
|
sb.append("]");
|
||||||
assertThat(count + " files exist that should have been cleaned:\n" + sb.toString(), count, equalTo(0));
|
assertThat(count + " files exist that should have been cleaned:\n" + sb.toString(), count, equalTo(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns the suite failure marker: internal use only! */
|
||||||
|
public static TestRuleMarkFailure getSuiteFailureMarker() {
|
||||||
|
return suiteFailureMarker;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,6 @@ import org.junit.Assert;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@ -237,13 +236,7 @@ public class MockFSDirectoryService extends FsDirectoryService {
|
||||||
|
|
||||||
public CloseableDirectory(BaseDirectoryWrapper dir) {
|
public CloseableDirectory(BaseDirectoryWrapper dir) {
|
||||||
this.dir = dir;
|
this.dir = dir;
|
||||||
try {
|
this.failureMarker = ESTestCase.getSuiteFailureMarker();
|
||||||
final Field suiteFailureMarker = LuceneTestCase.class.getDeclaredField("suiteFailureMarker");
|
|
||||||
suiteFailureMarker.setAccessible(true);
|
|
||||||
this.failureMarker = (TestRuleMarkFailure) suiteFailureMarker.get(LuceneTestCase.class);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
throw new ElasticsearchException("foo", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -107,3 +107,7 @@ com.google.common.util.concurrent.SettableFuture
|
||||||
com.google.common.util.concurrent.Futures
|
com.google.common.util.concurrent.Futures
|
||||||
com.google.common.util.concurrent.MoreExecutors
|
com.google.common.util.concurrent.MoreExecutors
|
||||||
com.google.common.collect.ImmutableSortedMap
|
com.google.common.collect.ImmutableSortedMap
|
||||||
|
|
||||||
|
@defaultMessage Do not violate java's access system
|
||||||
|
java.lang.reflect.AccessibleObject#setAccessible(boolean)
|
||||||
|
java.lang.reflect.AccessibleObject#setAccessible(java.lang.reflect.AccessibleObject[], boolean)
|
||||||
|
|
|
@ -83,7 +83,3 @@ java.util.concurrent.Future#cancel(boolean)
|
||||||
@defaultMessage Don't try reading from paths that are not configured in Environment, resolve from Environment instead
|
@defaultMessage Don't try reading from paths that are not configured in Environment, resolve from Environment instead
|
||||||
org.elasticsearch.common.io.PathUtils#get(java.lang.String, java.lang.String[])
|
org.elasticsearch.common.io.PathUtils#get(java.lang.String, java.lang.String[])
|
||||||
org.elasticsearch.common.io.PathUtils#get(java.net.URI)
|
org.elasticsearch.common.io.PathUtils#get(java.net.URI)
|
||||||
|
|
||||||
@defaultMessage Do not violate java's access system
|
|
||||||
java.lang.reflect.AccessibleObject#setAccessible(boolean)
|
|
||||||
java.lang.reflect.AccessibleObject#setAccessible(java.lang.reflect.AccessibleObject[], boolean)
|
|
||||||
|
|
Loading…
Reference in New Issue