Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id A9515200B43 for ; Tue, 19 Jul 2016 15:44:18 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id A7E92160A8B; Tue, 19 Jul 2016 13:44:18 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id A7405160A5C for ; Tue, 19 Jul 2016 15:44:17 +0200 (CEST) Received: (qmail 16646 invoked by uid 500); 19 Jul 2016 13:44:16 -0000 Mailing-List: contact commits-help@accumulo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@accumulo.apache.org Delivered-To: mailing list commits@accumulo.apache.org Received: (qmail 16634 invoked by uid 99); 19 Jul 2016 13:44:16 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 Jul 2016 13:44:16 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8B061E03A6; Tue, 19 Jul 2016 13:44:16 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dlmarion@apache.org To: commits@accumulo.apache.org Date: Tue, 19 Jul 2016 13:44:16 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [1/2] accumulo git commit: ACCUMULO-4128: Use setiter instead of setscaniter as it does not exist in 2.0. Added more output validation in the test to catch this in the future. archived-at: Tue, 19 Jul 2016 13:44:18 -0000 Repository: accumulo Updated Branches: refs/heads/master 621e0f26e -> 930592f5e ACCUMULO-4128: Use setiter instead of setscaniter as it does not exist in 2.0. Added more output validation in the test to catch this in the future. Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/2c883889 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/2c883889 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/2c883889 Branch: refs/heads/master Commit: 2c8838899531080adfdb33ba75f25f4cdd643963 Parents: 7ad5dd6 Author: Dave Marion Authored: Tue Jul 19 09:43:12 2016 -0400 Committer: Dave Marion Committed: Tue Jul 19 09:43:12 2016 -0400 ---------------------------------------------------------------------- .../core/client/impl/ThriftScanner.java | 2 +- .../accumulo/core/iterators/IteratorUtil.java | 9 +++++-- .../impl/MiniAccumuloClusterImpl.java | 2 ++ .../accumulo/tserver/tablet/ScanDataSource.java | 11 +++++++++ .../accumulo/tserver/tablet/ScanOptions.java | 16 +++++++++++++ .../start/classloader/vfs/ContextManager.java | 9 +++++-- .../org/apache/accumulo/test/ShellServerIT.java | 25 +++++++++++++------- 7 files changed, 60 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/core/src/main/java/org/apache/accumulo/core/client/impl/ThriftScanner.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/client/impl/ThriftScanner.java b/core/src/main/java/org/apache/accumulo/core/client/impl/ThriftScanner.java index 5f3b0f9..6e07b30 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/impl/ThriftScanner.java +++ b/core/src/main/java/org/apache/accumulo/core/client/impl/ThriftScanner.java @@ -415,7 +415,7 @@ public class ThriftScanner { if (scanState.scanID == null) { String msg = "Starting scan tserver=" + loc.tablet_location + " tablet=" + loc.tablet_extent + " range=" + scanState.range + " ssil=" - + scanState.serverSideIteratorList + " ssio=" + scanState.serverSideIteratorOptions; + + scanState.serverSideIteratorList + " ssio=" + scanState.serverSideIteratorOptions + " context=" + scanState.classLoaderContext; Thread.currentThread().setName(msg); if (log.isTraceEnabled()) { http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java b/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java index 91823c6..1d5728b 100644 --- a/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java @@ -255,6 +255,7 @@ public class IteratorUtil { for (IterInfo iterInfo : iters) { Class> clazz = null; + log.trace("Attempting to load iterator class {}", iterInfo.className); if (classCache != null) { clazz = classCache.get(iterInfo.className); @@ -294,13 +295,17 @@ public class IteratorUtil { String context, IterInfo iterInfo) throws ClassNotFoundException, IOException { Class> clazz; if (useAccumuloClassLoader) { - if (context != null && !context.equals("")) + if (context != null && !context.equals("")) { clazz = (Class>) AccumuloVFSClassLoader.getContextManager().loadClass(context, iterInfo.className, SortedKeyValueIterator.class); - else + log.trace("Iterator class {} loaded from context {}, classloader: {}", iterInfo.className, context, clazz.getClassLoader()); + } else { clazz = (Class>) AccumuloVFSClassLoader.loadClass(iterInfo.className, SortedKeyValueIterator.class); + log.trace("Iterator class {} loaded from AccumuloVFSClassLoader: {}", iterInfo.className, clazz.getClassLoader()); + } } else { clazz = (Class>) Class.forName(iterInfo.className).asSubclass(SortedKeyValueIterator.class); + log.trace("Iterator class {} loaded from classpath", iterInfo.className); } return clazz; } http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java ---------------------------------------------------------------------- diff --git a/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java b/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java index 7a63910..fef66a8 100644 --- a/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java +++ b/minicluster/src/main/java/org/apache/accumulo/minicluster/impl/MiniAccumuloClusterImpl.java @@ -328,6 +328,8 @@ public class MiniAccumuloClusterImpl implements AccumuloCluster { if (config.getHadoopConfDir() != null) builder.environment().put("HADOOP_CONF_DIR", config.getHadoopConfDir().getAbsolutePath()); + log.info("Starting MiniAccumuloCluster process with class: " + clazz.getSimpleName() + "\n, jvmOpts: " + extraJvmOpts + "\n, classpath: " + classpath + + "\n, args: " + argList + "\n, environment: " + builder.environment().toString()); Process process = builder.start(); LogWriter lw; http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java ---------------------------------------------------------------------- diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java index e48d91e..dd8c020 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java @@ -49,11 +49,14 @@ import org.apache.accumulo.tserver.FileManager.ScanFileManager; import org.apache.accumulo.tserver.InMemoryMap.MemoryIterator; import org.apache.accumulo.tserver.TabletIteratorEnvironment; import org.apache.accumulo.tserver.TabletServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.collect.Iterables; class ScanDataSource implements DataSource { + private static final Logger log = LoggerFactory.getLogger(ScanDataSource.class); // data source state private final Tablet tablet; private ScanFileManager fileManager; @@ -76,6 +79,8 @@ class ScanDataSource implements DataSource { this.options = new ScanOptions(-1, authorizations, defaultLabels, columnSet, ssiList, ssio, interruptFlag, false, samplerConfig, batchTimeOut, context); this.interruptFlag = interruptFlag; this.loadIters = true; + log.debug("new scan data source, tablet: {}, options: {}, interruptFlag: {}, loadIterators: {}", this.tablet, this.options, this.interruptFlag, + this.loadIters); } ScanDataSource(Tablet tablet, ScanOptions options) { @@ -84,6 +89,8 @@ class ScanDataSource implements DataSource { this.options = options; this.interruptFlag = options.getInterruptFlag(); this.loadIters = true; + log.debug("new scan data source, tablet: {}, options: {}, interruptFlag: {}, loadIterators: {}", this.tablet, this.options, this.interruptFlag, + this.loadIters); } ScanDataSource(Tablet tablet, Authorizations authorizations, byte[] defaultLabels, AtomicBoolean iFlag) { @@ -92,6 +99,8 @@ class ScanDataSource implements DataSource { this.options = new ScanOptions(-1, authorizations, defaultLabels, EMPTY_COLS, null, null, iFlag, false, null, -1, null); this.interruptFlag = iFlag; this.loadIters = false; + log.debug("new scan data source, tablet: {}, options: {}, interruptFlag: {}, loadIterators: {}", this.tablet, this.options, this.interruptFlag, + this.loadIters); } @Override @@ -187,9 +196,11 @@ class ScanDataSource implements DataSource { if (!loadIters) { return visFilter; } else if (null == options.getClassLoaderContext()) { + log.trace("Loading iterators for scan"); return iterEnv.getTopLevelIterator(IteratorUtil.loadIterators(IteratorScope.scan, visFilter, tablet.getExtent(), tablet.getTableConfiguration(), options.getSsiList(), options.getSsio(), iterEnv)); } else { + log.trace("Loading iterators for scan with scan context: {}", options.getClassLoaderContext()); return iterEnv.getTopLevelIterator(IteratorUtil.loadIterators(IteratorScope.scan, visFilter, tablet.getExtent(), tablet.getTableConfiguration(), options.getSsiList(), options.getSsio(), iterEnv, true, options.getClassLoaderContext())); } http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanOptions.java ---------------------------------------------------------------------- diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanOptions.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanOptions.java index dceac08..a898653 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanOptions.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanOptions.java @@ -109,4 +109,20 @@ final class ScanOptions { public void setClassLoaderContext(String context) { this.classLoaderContext = context; } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("["); + buf.append("auths=").append(this.authorizations); + buf.append(", batchTimeOut=").append(this.batchTimeOut); + buf.append(", context=").append(this.classLoaderContext); + buf.append(", columns=").append(this.columnSet); + buf.append(", interruptFlag=").append(this.interruptFlag); + buf.append(", isolated=").append(this.isolated); + buf.append(", num=").append(this.num); + buf.append(", samplerConfig=").append(this.samplerConfig); + buf.append("]"); + return buf.toString(); + } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/start/src/main/java/org/apache/accumulo/start/classloader/vfs/ContextManager.java ---------------------------------------------------------------------- diff --git a/start/src/main/java/org/apache/accumulo/start/classloader/vfs/ContextManager.java b/start/src/main/java/org/apache/accumulo/start/classloader/vfs/ContextManager.java index 7145b4a..ffb7dc1 100644 --- a/start/src/main/java/org/apache/accumulo/start/classloader/vfs/ContextManager.java +++ b/start/src/main/java/org/apache/accumulo/start/classloader/vfs/ContextManager.java @@ -25,9 +25,13 @@ import java.util.Set; import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileSystemManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ContextManager { + private static final Logger log = LoggerFactory.getLogger(ContextManager.class); + // there is a lock per context so that one context can initialize w/o blocking another context private class Context { AccumuloReloadingVFSClassLoader loader; @@ -202,9 +206,10 @@ public class ContextManager { contexts.keySet().removeAll(unused.keySet()); } - for (Context context : unused.values()) { + for (Entry e : unused.entrySet()) { // close outside of lock - context.close(); + log.info("Closing unused context: {}", e.getKey()); + e.getValue().close(); } } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/2c883889/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java ---------------------------------------------------------------------- diff --git a/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java b/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java index 8254570..d67dc0a 100644 --- a/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java +++ b/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java @@ -1747,16 +1747,21 @@ public class ShellServerIT extends SharedMiniClusterBase { assertTrue(true); } ts.exec("createtable t"); + // Assert that the TabletServer does not know anything about our class + String result = ts.exec("setiter -scan -n reverse -t t -p 21 -class org.apache.accumulo.test.functional.ValueReversingIterator"); + assertTrue(result.contains("class not found")); make10(); setupFakeContextPath(); - // Add the context to the table so that setscaniter works. After setscaniter succeeds, then - // remove the property from the table. - ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + FAKE_CONTEXT + "=" + FAKE_CONTEXT_CLASSPATH); - ts.exec("config -t t -s table.classpath.context=" + FAKE_CONTEXT); - ts.exec("setscaniter -n reverse -t t -p 21 -class org.apache.accumulo.test.functional.ValueReversingIterator"); - String result = ts.exec("scan -np -b row1 -e row1"); + // Add the context to the table so that setiter works. + result = ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + FAKE_CONTEXT + "=" + FAKE_CONTEXT_CLASSPATH); + assertEquals("root@miniInstance t> config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + FAKE_CONTEXT + "=" + FAKE_CONTEXT_CLASSPATH + "\n", result); + result = ts.exec("config -t t -s table.classpath.context=" + FAKE_CONTEXT); + assertEquals("root@miniInstance t> config -t t -s table.classpath.context=" + FAKE_CONTEXT + "\n", result); + result = ts.exec("setiter -scan -n reverse -t t -p 21 -class org.apache.accumulo.test.functional.ValueReversingIterator"); + assertTrue(result.contains("The iterator class does not implement OptionDescriber")); + // The implementation of ValueReversingIterator in the FAKE context does nothing, the value is not reversed. + result = ts.exec("scan -np -b row1 -e row1"); assertEquals(2, result.split("\n").length); - log.error(result); assertTrue(result.contains("value")); result = ts.exec("scan -np -b row3 -e row5"); assertEquals(4, result.split("\n").length); @@ -1774,9 +1779,11 @@ public class ShellServerIT extends SharedMiniClusterBase { assertTrue(result.contains("value")); setupRealContextPath(); - ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + REAL_CONTEXT + "=" + REAL_CONTEXT_CLASSPATH); + // Define a new classloader context, but don't set it on the table + result = ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + REAL_CONTEXT + "=" + REAL_CONTEXT_CLASSPATH); + assertEquals("root@miniInstance t> config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + REAL_CONTEXT + "=" + REAL_CONTEXT_CLASSPATH + "\n", result); + // Override the table classloader context with the REAL implementation of ValueReversingIterator, which does reverse the value. result = ts.exec("scan -np -b row1 -e row1 -cc " + REAL_CONTEXT); - log.error(result); assertEquals(2, result.split("\n").length); assertTrue(result.contains("eulav")); assertFalse(result.contains("value"));