Hi, I'm developing an application that requires a large number of cores, and since lazy loading / LRU caching won't be available until 1.5, I decided to modify CoreContainer to hold me over.
Another requirement is that multiple Solr instances can access the same cores (on NAS, for instance), so the approach I'm using is to maintain a local registry / load balancer that assigns "active" cores to different machines and, when a machine has exceeded its limit, unload cores in LRU order. The modifications to CoreContainer are as follows: to avoid having to issue "create" requests every time we need to load an inactive core, getCore will attempt to create/open any core that it doesn't find in the cores map, unless name is "" or "admin", in which case it returns null as per the original implementation. The create function is overloaded to take a core name and creates a CoreDescriptor using some defaults added to solr.xml. Everything works fine until I try to make a core unload request, at which point I see the following: org.apache.solr.common.SolrException: Not Found Not Found request: /solr/NewUser0/admin/cores?action=UNLOAD&core=NewUser0&wt=javabin&version=2.2 at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:343) So, my guess is that my modifications are keeping admin cores from being created properly. Or maybe I don't know what I'm talking about. I stepped through execution with a debugger and watched it bounce around SolrDispatchHandler.doFilter() before giving up and forwarding the request to the RequestDispatcher, but all I could tell from that was that it wanted something it couldn't find. Can anyone shed some light on what my mods might be keeping Solr from doing that would cause this problem? Code pasted below. And don't mind the weird locking, this happens even with a single thread. Thanks, Dan public SolrCore getCore(String name) { ReentrantReadWriteLock lock = getCoreLock(name); try { lock.readLock().lock(); SolrCore core = cores.get(name); if (core != null) { core.open(); // increment the ref count while still synchronized return core; } else if ("".equals(name) || "admin".equals(name)) { return null; } else { try { lock.readLock().unlock(); lock.writeLock().lock(); SolrCore core1 = cores.get(name); if (core1 != null) { return core1; } log.info("Autocreating core: '" + name + "'"); core = create(name); cores.put(name, core); core.open(); return core; } catch (IOException e) { log.error("Autocreating core '" + name + "'", e); return null; } catch (ParserConfigurationException e) { log.error("Autocreating core '" + name + "'", e); return null; } catch (SAXException e) { log.error("Autocreating core '" + name + "'", e); return null; } finally { lock.readLock().lock(); lock.writeLock().unlock(); } } } finally { lock.readLock().unlock(); } } public SolrCore create(String coreName) throws IOException, ParserConfigurationException, SAXException { if (defaultConfigFile == null || defaultSchemaFile == null) { throw new RuntimeException("Cannot use autocreate unless both a default configuration file and a default schema file are specified"); } CoreDescriptor dcore = new CoreDescriptor(this, coreName, getInstanceDir(coreName)); dcore.setConfigName(defaultConfigFile); dcore.setSchemaName(defaultSchemaFile); return create(dcore); } // Eventually this will be overridden to do some intelligent management of a directory hierarchy so we //don't have hundreds of thousands of cores in the same directory public String getInstanceDir(String coreName) { return coreName; } -- View this message in context: http://www.nabble.com/Problem-After-Modifying-CoreContainer-tp24762199p24762199.html Sent from the Solr - User mailing list archive at Nabble.com.