You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@curator.apache.org by Foolish Ewe <fo...@hotmail.com> on 2017/03/04 01:33:20 UTC
Can I get a clarification on how to use the NodeCache
Hello All:
I'm trying to figure out why, when using the CuratorFramework and NodeCache, I can read from a path in zookeeper/curator at the framework level, but NodeCache was somehow not able to read from the same path using the same CuratorFamework. Is the code below incorrect, I assumed that the path returned when creating a node would be suitable for NodeCache, and that the namespace of the CuratorFramework would be inherited by the derived NodeCache instance.
Please consider the following scala test:
package com.myCompany.myProject.test
import org.apache.curator.framework.CuratorFrameworkFactory
import org.apache.curator.framework.recipes.cache.NodeCache
import org.apache.curator.retry.ExponentialBackoffRetry
import org.apache.curator.test.{TestingCluster, TestingServer}
import org.apache.zookeeper.CreateMode
import org.scalatest.{BeforeAndAfterAll, FunSuite}
import org.slf4j.LoggerFactory
import collection.JavaConverters._
/**
* Created by FoolishEwe on 2/16/17.
*/
class CuratorSuite extends FunSuite with BeforeAndAfterAll {
@transient
val logger = LoggerFactory.getLogger(this.getClass);
val nameSpace="testingNameSpace";
val testServerPort = 31314;
val testServer : TestingServer = new TestingServer(testServerPort);
val connectionString= testServer.getConnectString;
val retryTimeOutMsec = 1000;
val connectionTimeOutMsec = 1000;
val closeWaitTimeOutMsec = 1000;
val sessionTimeOutMsec = 1000;
val maxRetries = 3;
val retryPolicy = new ExponentialBackoffRetry(retryTimeOutMsec, maxRetries);
override def beforeAll() {
val port = testServer.getPort;
val tmpDir = testServer.getTempDirectory;
logger.info(s"""Test Server is running on Port ${port}, testServerPort=${testServerPort}, using tmpDir="${tmpDir}", connectionString="${connectionString}".""");
}
override def afterAll() {
logger.info(s"""after: Shutting down testServer""")
testServer.close(); // shut it down and clean up
}
test("See if NodeCache actually finds the given node after creation by CuratorFramework") {
val clientFactory = CuratorFrameworkFactory.builder().connectString(connectionString).namespace(nameSpace);
// TODO: Should we be monitoring the ensemble? For now let's pull the connection string from the ensemble, I think we may be able to see if we have a stale connection string.
val ensembleProvider = clientFactory.getEnsembleProvider; // Allows us to determine current set of active nodes participating in this cluster
logger.debug( s"""getCuratorFramework has ensembleProvider.getConnectionString=${ensembleProvider.getConnectionString}""");
val client = clientFactory.
retryPolicy(retryPolicy).
connectionTimeoutMs(connectionTimeOutMsec).
maxCloseWaitMs(closeWaitTimeOutMsec).
sessionTimeoutMs(sessionTimeOutMsec).
namespace(nameSpace).
build(); // create the client
logger.info( s"""After building client before client.start""");
client.start();
logger.info( s"""client.start finished""");
val path = "/APath";
val testData = "This is some test data.";
val nodeName = client.create.creatingParentContainersIfNeeded.withProtection.withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(path, testData.getBytes());
val nodeStat = client.checkExists().forPath(nodeName);
val nodeData = client.getData.forPath(nodeName);
val nodeDataStr = new String(nodeData);
logger.info(s"""nodeData=${nodeDataStr}, nodeStat has czxid=${nodeStat.getCzxid}, mzxid=${nodeStat.getMzxid}, pzxid=${nodeStat.getPzxid} ctime=${nodeStat.getCtime}, mtime=${nodeStat.getMtime}, version=${nodeStat.getVersion}, aVersion=${nodeStat.getAversion}, cVersion=${nodeStat.getCversion}, dataLength=${nodeStat.getDataLength}, numChildren=${nodeStat.getNumChildren}, ephemeralOwner=${nodeStat.getEphemeralOwner}""");
val nodeCache = new NodeCache(client, nodeName);
assert(nodeCache != null, s"""Got null nodeCache(client, nodeName=${nodeName})""");
val currentData = nodeCache.getCurrentData;
assert(currentData != null , s"""getCurrentData was null from nodeName=${nodeName}""");
val childStat = currentData.getStat;
assert(childStat != null);
logger.info(s"""got childStat = ${childStat}""");
val childData = currentData.getData;
val childDataStr = new String(childData);
assert(childDataStr == testData);
val childPath = currentData.getPath;
assert(path == nodeName);
nodeCache.close;
}
}
When I run it, I see that the get data succeeds but the getCurrentData on the node cache failed.
*** Start sanitized output****
[Classpath dump suppressed]
Testing started at 5:03 PM ...
17:03:43,852 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
17:03:43,852 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
17:03:43,968 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
17:03:43,971 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
17:03:44,033 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.myCompany.myProject] to DEBUG
17:03:44,033 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
17:03:44,033 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
17:03:44,034 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
17:03:44,035 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@54d9d12d - Registering current configuration as safe fallback point2017:03:03:17:03:45.350 [ScalaTest-run-running-CuratorSuite] DEBUG c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:45 - getCuratorFramework has ensembleProvider.getConnectionString=127.0.0.1:31314
2017:03:03:17:03:45.387 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:53 - After building client before client.start
2017:03:03:17:03:45.403 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:55 - client.start finished
2017:03:03:17:03:45.436 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:62 - nodeData=This is some test data., nodeStat has czxid=4, mzxid=4, pzxid=4 ctime=1488589425430, mtime=1488589425430, version=0, aVersion=0, cVersion=0, dataLength=23, numChildren=0, ephemeralOwner=0
null equaled null getCurrentData was null from nodeName=/_c_ad40bede-7898-4dac-a002-7005e3d501b1-APath0000000000
ScalaTestFailureLocation: com.myCompany.myProject.test.CuratorSuite$$anonfun$1 at (CuratorSuite.scala:66)
org.scalatest.exceptions.TestFailedException: null equaled null getCurrentData was null from nodeName=/_c_ad40bede-7898-4dac-a002-7005e3d501b1-APath0000000000
at org.scalatest.Assertions$class.newAssertionFailedException(Assertions.scala:528)
at org.scalatest.FunSuite.newAssertionFailedException(FunSuite.scala:1560)
at org.scalatest.Assertions$AssertionsHelper.macroAssert(Assertions.scala:501)
at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply$mcV$sp(CuratorSuite.scala:66)
at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply(CuratorSuite.scala:41)
at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply(CuratorSuite.scala:41)
at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
at org.scalatest.Transformer.apply(Transformer.scala:22)
at org.scalatest.Transformer.apply(Transformer.scala:20)
at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:186)
at org.scalatest.TestSuite$class.withFixture(TestSuite.scala:196)
at org.scalatest.FunSuite.withFixture(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:183)
at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
at org.scalatest.SuperEngine.runTestImpl(Engine.scala:289)
at org.scalatest.FunSuiteLike$class.runTest(FunSuiteLike.scala:196)
at org.scalatest.FunSuite.runTest(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:396)
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:384)
at scala.collection.immutable.List.foreach(List.scala:318)
at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:384)
at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:379)
at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:461)
at org.scalatest.FunSuiteLike$class.runTests(FunSuiteLike.scala:229)
at org.scalatest.FunSuite.runTests(FunSuite.scala:1560)
at org.scalatest.Suite$class.run(Suite.scala:1147)
at org.scalatest.FunSuite.org$scalatest$FunSuiteLike$$super$run(FunSuite.scala:1560)
at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
at org.scalatest.SuperEngine.runImpl(Engine.scala:521)
at org.scalatest.FunSuiteLike$class.run(FunSuiteLike.scala:233)
at com.myCompany.myProject.test.CuratorSuite.org$scalatest$BeforeAndAfterAll$$super$run(CuratorSuite.scala:15)
at org.scalatest.BeforeAndAfterAll$class.liftedTree1$1(BeforeAndAfterAll.scala:213)
at org.scalatest.BeforeAndAfterAll$class.run(BeforeAndAfterAll.scala:210)
at com.myCompany.myProject.CuratorSuite.run(CuratorSuite.scala:15)
at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1340)
at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1334)
at scala.collection.immutable.List.foreach(List.scala:318)
at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1334)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010)
at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)
at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)
at org.scalatest.tools.Runner$.run(Runner.scala:850)
at org.scalatest.tools.Runner.run(Runner.scala)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
c.m.m.t.CuratorSuite.beforeAll:33 - Test Server is running on Port 31314, testServerPort=31314, using tmpDir="/var/folders/wr/hnqlgq7s3gl_x6fx0684fx3m0000gn/T/1488589424181-0", connectionString="127.0.0.1:31314".
2017:03:03:17:03:45.460 [ScalaTest-run] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.afterAll:37 - after: Shutting down testServer
Process finished with exit code 0
******End of sanitized output**********
I'm able to work around this by dropping down to the CuaratorFramework level, but it would be nice to learn what went wrong here.
With best regards:
Bill
Re: Can I get a clarification on how to use the NodeCache
Posted by Jordan Zimmerman <jo...@jordanzimmerman.com>.
Your NodeCache is never started. You must call start(). Also, given that you want results immediately, you should use start(true).
-Jordan
> On Mar 3, 2017, at 5:33 PM, Foolish Ewe <fo...@hotmail.com> wrote:
>
> Hello All:
>
> I'm trying to figure out why, when using the CuratorFramework and NodeCache, I can read from a path in zookeeper/curator at the framework level, but NodeCache was somehow not able to read from the same path using the same CuratorFamework. Is the code below incorrect, I assumed that the path returned when creating a node would be suitable for NodeCache, and that the namespace of the CuratorFramework would be inherited by the derived NodeCache instance.
>
> Please consider the following scala test:
>
> package com.myCompany.myProject.test
>
> import org.apache.curator.framework.CuratorFrameworkFactory
> import org.apache.curator.framework.recipes.cache.NodeCache
> import org.apache.curator.retry.ExponentialBackoffRetry
> import org.apache.curator.test.{TestingCluster, TestingServer}
> import org.apache.zookeeper.CreateMode
> import org.scalatest.{BeforeAndAfterAll, FunSuite}
> import org.slf4j.LoggerFactory
> import collection.JavaConverters._
>
> /**
> * Created by FoolishEwe on 2/16/17.
> */
> class CuratorSuite extends FunSuite with BeforeAndAfterAll {
>
> @transient
> val logger = LoggerFactory.getLogger(this.getClass);
> val nameSpace="testingNameSpace";
> val testServerPort = 31314;
> val testServer : TestingServer = new TestingServer(testServerPort);
> val connectionString= testServer.getConnectString;
> val retryTimeOutMsec = 1000;
> val connectionTimeOutMsec = 1000;
> val closeWaitTimeOutMsec = 1000;
> val sessionTimeOutMsec = 1000;
> val maxRetries = 3;
> val retryPolicy = new ExponentialBackoffRetry(retryTimeOutMsec, maxRetries);
>
> override def beforeAll() {
> val port = testServer.getPort;
> val tmpDir = testServer.getTempDirectory;
> logger <http://logger.info/>.info <http://logger.info/>(s"""Test Server is running on Port ${port}, testServerPort=${testServerPort}, using tmpDir="${tmpDir}", connectionString="${connectionString}".""");
> }
>
> override def afterAll() {
> logger <http://logger.info/>.info <http://logger.info/>(s"""after: Shutting down testServer""")
> testServer.close(); // shut it down and clean up
> }
>
> test("See if NodeCache actually finds the given node after creation by CuratorFramework") {
> val clientFactory = CuratorFrameworkFactory.builder().connectString(connectionString).namespace(nameSpace);
> // TODO: Should we be monitoring the ensemble? For now let's pull the connection string from the ensemble, I think we may be able to see if we have a stale connection string.
> val ensembleProvider = clientFactory.getEnsembleProvider; // Allows us to determine current set of active nodes participating in this cluster
> logger.debug( s"""getCuratorFramework has ensembleProvider.getConnectionString=${ensembleProvider.getConnectionString}""");
> val client = clientFactory.
> retryPolicy(retryPolicy).
> connectionTimeoutMs(connectionTimeOutMsec).
> maxCloseWaitMs(closeWaitTimeOutMsec).
> sessionTimeoutMs(sessionTimeOutMsec).
> namespace(nameSpace).
> build(); // create the client
> logger <http://logger.info/>.info <http://logger.info/>( s"""After building client before client.start""");
> client.start();
> logger <http://logger.info/>.info <http://logger.info/>( s"""client.start finished""");
> val path = "/APath";
> val testData = "This is some test data.";
> val nodeName = client.create.creatingParentContainersIfNeeded.withProtection.withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(path, testData.getBytes());
> val nodeStat = client.checkExists().forPath(nodeName);
> val nodeData = client.getData.forPath(nodeName);
> val nodeDataStr = new String(nodeData);
> logger <http://logger.info/>.info <http://logger.info/>(s"""nodeData=${nodeDataStr}, nodeStat has czxid=${nodeStat.getCzxid}, mzxid=${nodeStat.getMzxid}, pzxid=${nodeStat.getPzxid} ctime=${nodeStat.getCtime}, mtime=${nodeStat.getMtime}, version=${nodeStat.getVersion}, aVersion=${nodeStat.getAversion}, cVersion=${nodeStat.getCversion}, dataLength=${nodeStat.getDataLength}, numChildren=${nodeStat.getNumChildren}, ephemeralOwner=${nodeStat.getEphemeralOwner}""");
> val nodeCache = new NodeCache(client, nodeName);
> assert(nodeCache != null, s"""Got null nodeCache(client, nodeName=${nodeName})""");
> val currentData = nodeCache.getCurrentData;
> assert(currentData != null , s"""getCurrentData was null from nodeName=${nodeName}""");
> val childStat = currentData.getStat;
> assert(childStat != null);
> logger <http://logger.info/>.info <http://logger.info/>(s"""got childStat = ${childStat}""");
> val childData = currentData.getData;
> val childDataStr = new String(childData);
> assert(childDataStr == testData);
> val childPath = currentData.getPath;
> assert(path == nodeName);
> nodeCache.close;
> }
> }
>
> When I run it, I see that the get data succeeds but the getCurrentData on the node cache failed.
> *** Start sanitized output****
> [Classpath dump suppressed]
> Testing started at 5:03 PM ...
> 17:03:43,852 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
> 17:03:43,852 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
> 17:03:43,968 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
> 17:03:43,971 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
> 17:03:44,033 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.myCompany.myProject] to DEBUG
> 17:03:44,033 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
> 17:03:44,033 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
> 17:03:44,034 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
> 17:03:44,035 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@54d9d12d - Registering current configuration as safe fallback point2017:03:03:17:03:45.350 [ScalaTest-run-running-CuratorSuite] DEBUG c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:45 - getCuratorFramework has ensembleProvider.getConnectionString=127.0.0.1:31314
> 2017:03:03:17:03:45.387 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:53 - After building client before client.start
> 2017:03:03:17:03:45.403 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:55 - client.start finished
> 2017:03:03:17:03:45.436 [ScalaTest-run-running-CuratorSuite] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.apply$mcV$sp:62 - nodeData=This is some test data., nodeStat has czxid=4, mzxid=4, pzxid=4 ctime=1488589425430, mtime=1488589425430, version=0, aVersion=0, cVersion=0, dataLength=23, numChildren=0, ephemeralOwner=0
>
> null equaled null getCurrentData was null from nodeName=/_c_ad40bede-7898-4dac-a002-7005e3d501b1-APath0000000000
> ScalaTestFailureLocation: com.myCompany.myProject.test.CuratorSuite$$anonfun$1 at (CuratorSuite.scala:66)
> org.scalatest.exceptions.TestFailedException: null equaled null getCurrentData was null from nodeName=/_c_ad40bede-7898-4dac-a002-7005e3d501b1-APath0000000000
> at org.scalatest.Assertions$class.newAssertionFailedException(Assertions.scala:528)
> at org.scalatest.FunSuite.newAssertionFailedException(FunSuite.scala:1560)
> at org.scalatest.Assertions$AssertionsHelper.macroAssert(Assertions.scala:501)
> at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply$mcV$sp(CuratorSuite.scala:66)
> at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply(CuratorSuite.scala:41)
> at com.myCompany.myProject.test.CuratorSuite$$anonfun$1.apply(CuratorSuite.scala:41)
> at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
> at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
> at org.scalatest.Transformer.apply(Transformer.scala:22)
> at org.scalatest.Transformer.apply(Transformer.scala:20)
> at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:186)
> at org.scalatest.TestSuite$class.withFixture(TestSuite.scala:196)
> at org.scalatest.FunSuite.withFixture(FunSuite.scala:1560)
> at org.scalatest.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:183)
> at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
> at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:196)
> at org.scalatest.SuperEngine.runTestImpl(Engine.scala:289)
> at org.scalatest.FunSuiteLike$class.runTest(FunSuiteLike.scala:196)
> at org.scalatest.FunSuite.runTest(FunSuite.scala:1560)
> at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
> at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:229)
> at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:396)
> at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:384)
> at scala.collection.immutable.List.foreach(List.scala:318)
> at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:384)
> at org.scalatest.SuperEngine.org <http://org.scalatest.superengine.org/>$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:379)
> at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:461)
> at org.scalatest.FunSuiteLike$class.runTests(FunSuiteLike.scala:229)
> at org.scalatest.FunSuite.runTests(FunSuite.scala:1560)
> at org.scalatest.Suite$class.run(Suite.scala:1147)
> at org.scalatest.FunSuite.org <http://org.scalatest.funsuite.org/>$scalatest$FunSuiteLike$$super$run(FunSuite.scala:1560)
> at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
> at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:233)
> at org.scalatest.SuperEngine.runImpl(Engine.scala:521)
> at org.scalatest.FunSuiteLike$class.run(FunSuiteLike.scala:233)
> at com.myCompany.myProject.test.CuratorSuite.org$scalatest$BeforeAndAfterAll$$super$run(CuratorSuite.scala:15)
> at org.scalatest.BeforeAndAfterAll$class.liftedTree1$1(BeforeAndAfterAll.scala:213)
> at org.scalatest.BeforeAndAfterAll$class.run(BeforeAndAfterAll.scala:210)
> at com.myCompany.myProject.CuratorSuite.run(CuratorSuite.scala:15)
> at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
> at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1340)
> at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$1.apply(Runner.scala:1334)
> at scala.collection.immutable.List.foreach(List.scala:318)
> at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1334)
> at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)
> at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010)
> at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)
> at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)
> at org.scalatest.tools.Runner$.run(Runner.scala:850)
> at org.scalatest.tools.Runner.run(Runner.scala)
> at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
> at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:497)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
>
>
> c.m.m.t.CuratorSuite.beforeAll:33 - Test Server is running on Port 31314, testServerPort=31314, using tmpDir="/var/folders/wr/hnqlgq7s3gl_x6fx0684fx3m0000gn/T/1488589424181-0", connectionString="127.0.0.1:31314".
> 2017:03:03:17:03:45.460 [ScalaTest-run] INFO c.a.g.r.l.c.c.a.g.r.l.c.t.CuratorSuite.afterAll:37 - after: Shutting down testServer
>
> Process finished with exit code 0
>
> ******End of sanitized output**********
>
> I'm able to work around this by dropping down to the CuaratorFramework level, but it would be nice to learn what went wrong here.
>
> With best regards:
>
> Bill