After some additional debugging, I think that this issue is caused by a
possible race condition introduced to ZkController in Solr-5.0.0.

My concerns are around unregister(...) function in ZkController.
In the current code, all cores are traversed and if one of the cores is
using configLocation, configLocationis variable is cleared so that its not
removed from confDirectoryListeners. A possible issue can occur if, after
the list of cores is fetched, a new core is added. If this new core will
use the same config, then traversing "all cores" will not find that the
configuration is used by another core, and it will be removed from
confDirectoryListeners even though its still needed.

In addition, when adding a watch to configuration in watchZKConfDir(..)
function, no lock is used on confDirectoryListeners like in any other place
where this map is accessed.

A possible solution for this issue:
- Add "synchronized (confDirectoryListeners)" to watchZKConfDir(..).
- In unregister(...) function, traverse the list of cores twice. Before the
first loop, obtain a lock on confDirectoryListeners, then look if any core
is using configLocation, then remove configLocation from
confDirectoryListeners if needed. Then the lock should be released. The
second loop will be used for the rest of the code.

I will be glad for any input, is this a real issue or did i miss something?
Is the suggested solution valid?

Thanks,
Bar



2015-04-01 18:16 GMT+03:00 Bar Weiner <weiner....@gmail.com>:

> Hi,
>
> I'm working on upgrading a project from solr-4.10.3 to solr-5.0.0.
> As part of our JUnit tests we have a few tests for deleting/creating
> collections. Each test create&delete a collection with a different name,
> but they all share the same config in ZK.
> When running these tests in Eclipse everything works fine, but when
> running the same tests through Maven we get the following error so I
> suspect this is a timing related issue :
>
> INFO  org.apache.solr.rest.ManagedResourceStorage  – Setting up
> ZooKeeper-based storage for the RestManager with znodeBase:
> /configs/SIMPLE_CONFIG
> INFO  org.apache.solr.rest.ManagedResourceStorage  – Configured
> ZooKeeperStorageIO with znodeBase: /configs/SIMPLE_CONFIG
> INFO  org.apache.solr.rest.RestManager  – Initializing RestManager with
> initArgs: {}
> INFO  org.apache.solr.rest.ManagedResourceStorage  – Reading
> _rest_managed.json using ZooKeeperStorageIO:path=/configs/SIMPLE_CONFIG
> INFO  org.apache.solr.rest.ManagedResourceStorage  – No data found for
> znode /configs/SIMPLE_CONFIG/_rest_managed.json
> INFO  org.apache.solr.rest.ManagedResourceStorage  – Loaded null at path
> _rest_managed.json using ZooKeeperStorageIO:path=/configs/SIMPLE_CONFIG
> INFO  org.apache.solr.rest.RestManager  – Initializing 0 registered
> ManagedResources
> INFO  org.apache.solr.handler.ReplicationHandler  – Commits will be
> reserved for  10000
> INFO  org.apache.solr.core.SolrCore  – [mycollection1] Registered new
> searcher Searcher@3208a6c4[mycollection1]
> main{ExitableDirectoryReader(UninvertingDirectoryReader())}
> ERROR org.apache.solr.core.CoreContainer  – Error creating core
> [mycollection1]: This conf directory is not valid
> org.apache.solr.common.SolrException: This conf directory is not valid
>         at
> org.apache.solr.cloud.ZkController.registerConfListenerForCore(ZkController.java:2229)
>         at
> org.apache.solr.core.SolrCore.registerConfListener(SolrCore.java:2633)
>         at org.apache.solr.core.SolrCore.<init>(SolrCore.java:936)
>         at org.apache.solr.core.SolrCore.<init>(SolrCore.java:662)
>         at
> org.apache.solr.core.CoreContainer.create(CoreContainer.java:513)
>         at
> org.apache.solr.core.CoreContainer.create(CoreContainer.java:488)
>         at
> org.apache.solr.handler.admin.CoreAdminHandler.handleCreateAction(CoreAdminHandler.java:573)
>         at
> org.apache.solr.handler.admin.CoreAdminHandler.handleRequestInternal(CoreAdminHandler.java:197)
>         at
> org.apache.solr.handler.admin.CoreAdminHandler.handleRequestBody(CoreAdminHandler.java:186)
>         at
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:144)
>         at
> org.apache.solr.servlet.SolrDispatchFilter.handleAdminRequest(SolrDispatchFilter.java:736)
>         at
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:261)
>         at
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:204)
>         at
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
>         at
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
>         at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
>         at
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
>         at
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
>         at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
>         at
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
>         at
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
>         at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
>         at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
>         at
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
>         at
> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
>         at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
>         at org.eclipse.jetty.server.Server.handle(Server.java:368)
>         at
> org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
>         at
> org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)
>         at
> org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953)
>         at
> org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1014)
>         at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
>         at
> org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
>         at
> org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)
>         at
> org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)
>         at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
>         at
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
>         at java.lang.Thread.run(Thread.java:722)
>
> In summary, my question is what is the meaning of this exception and what
> are the possible causes of it. I am sure the config directory I'm using is
> still in ZK and its not deleted during the test.
>
> Thanks,
> Bar
>
>

Reply via email to