[ 
https://issues.apache.org/jira/browse/SOLR-14975?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17223975#comment-17223975
 ] 

Erick Erickson commented on SOLR-14975:
---------------------------------------

Yeah, these look like they're over-used.  I'm not certain though that checking 
getCoreDescriptor is sufficient in all cases. 

SolrCores.getAllCoreNames for instance gets names from SolrCores, the 
TransientCacheHandler _and_ residentDescriptors. Can we guarantee  that the 
names in residentDescriptors is a superset of cores.keySet and similarly for 
getTransientCacheHandler().getCoreDescriptor .vs. 
getTransientCacheHandler().getAllCorenames()?

BTW, SolrCores.getCoreDescriptors() (note the 's') also has the issue, although 
it may not be called very often.

I certainly do remember that getting that all to work when I made 
transientCacheHandler pluggable was a bear. That said, the code has evolved 
from that long-ago date. I'm not defending the current implementation, just 
sayin' that it may be...less pleasant to change than it appears at first glance.

I'm not sure queries block on these. CoreContainer.getCore(some_core) doesn't 
look like it calls these on a quick glance. Is there someplace else they're 
called for queries? NOTE: it's Friday night so I'm not too sharp and it may be 
obvious.

All that said, assembling these lists is expensive and anything we can do to 
cut down on calling them is a fine idea. They may well be being used because 
they were a pre-existing call without understanding the costs. I do wonder if 
that's the case there's some mechanism to keep them from being used 
inappropriately in the future.

Of course if whoever picks this up is really ambitious, much of this could be 
re-thought...

> Optimize CoreContainer.getAllCoreNames and getLoadedCoreNames 
> --------------------------------------------------------------
>
>                 Key: SOLR-14975
>                 URL: https://issues.apache.org/jira/browse/SOLR-14975
>             Project: Solr
>          Issue Type: Improvement
>      Security Level: Public(Default Security Level. Issues are Public) 
>            Reporter: David Smiley
>            Priority: Major
>
> The methods CoreContainer.getAllCoreNames and getLoadedCoreNames hold a lock 
> while they grab core names to put into a TreeSet.  When there are *many* 
> cores, this delay is noticeable.  Holding this lock effectively blocks 
> queries since queries lookup a core; so it's critically important that these 
> methods are *fast*.  The tragedy here is that some callers merely want to 
> know if a particular name is in the set, or what the aggregated size is.  
> Some callers want to iterate the names but don't really care what the 
> iteration order is.
> I propose that some callers of these two methods find suitable alternatives, 
> like getCoreDescriptor to check for null.  And I propose that these methods 
> return a HashSet -- no order.  If the caller wants it sorted, it can do so 
> itself.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to