@Test public void testDeadlock() throws Exception { LuceneTestCase.assumeFalse( "This test fails on UNIX with Turkish default locale (https://issues.apache.org/jira/browse/LUCENE-6036)", new Locale("tr").getLanguage().equals(Locale.getDefault().getLanguage())); // pick random codec names for stress test in separate process: final Random rnd = RandomizedContext.current().getRandom(); Set<String> avail; final String codecName = new ArrayList<>(avail = Codec.availableCodecs()).get(rnd.nextInt(avail.size())); final String pfName = new ArrayList<>(avail = PostingsFormat.availablePostingsFormats()) .get(rnd.nextInt(avail.size())); final String dvfName = new ArrayList<>(avail = DocValuesFormat.availableDocValuesFormats()) .get(rnd.nextInt(avail.size())); // spawn separate JVM: final Process p = new ProcessBuilder( Paths.get(System.getProperty("java.home"), "bin", "java").toString(), "-cp", System.getProperty("java.class.path"), getClass().getName(), codecName, pfName, dvfName) .inheritIO() .start(); final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("processKiller")); final ScheduledFuture<?> f = scheduler.schedule( new Runnable() { @Override public void run() { p.destroy(); } }, 30, TimeUnit.SECONDS); try { final int exitCode = p.waitFor(); if (f.cancel(false)) { assertEquals("Process died abnormally", 0, exitCode); } else { fail("Process did not exit after 30 secs -> classloader deadlock?"); } } finally { scheduler.shutdown(); while (!scheduler.awaitTermination(1, TimeUnit.MINUTES)) ; } }
/** * Check codec restrictions. * * @throws AssumptionViolatedException if the class does not work with a given codec. */ private void checkCodecRestrictions(Codec codec) { assumeFalse( "Class not allowed to use codec: " + codec.getName() + ".", shouldAvoidCodec(codec.getName())); if (codec instanceof RandomCodec && !avoidCodecs.isEmpty()) { for (String name : ((RandomCodec) codec).formatNames) { assumeFalse( "Class not allowed to use postings format: " + name + ".", shouldAvoidCodec(name)); } } PostingsFormat pf = codec.postingsFormat(); assumeFalse( "Class not allowed to use postings format: " + pf.getName() + ".", shouldAvoidCodec(pf.getName())); assumeFalse( "Class not allowed to use postings format: " + LuceneTestCase.TEST_POSTINGSFORMAT + ".", shouldAvoidCodec(LuceneTestCase.TEST_POSTINGSFORMAT)); }