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

Yonik Seeley commented on LUCENE-6808:
--------------------------------------

I was going to reply that having to make a copy of BytesRef objects returned to 
you (because they may be reused) was standard practice across our APIs... but 
then I noticed that this case is different since FieldComparator returns a 
generic object.  So this case does seem pretty trappy and should be fixed IMO.


> Term(Ord)ValComparator.value return BytesRefs that are re-used internally
> -------------------------------------------------------------------------
>
>                 Key: LUCENE-6808
>                 URL: https://issues.apache.org/jira/browse/LUCENE-6808
>             Project: Lucene - Core
>          Issue Type: Bug
>            Reporter: Hoss Man
>         Attachments: LUCENE-6808.patch, LUCENE-6808.patch
>
>
> While working on SOLR-6168, which involves some non-trivial usage of 
> {{FieldComparator}}, I discovered some weird bugs anytime I was using 
> TermOrdValComparator.  I ultimately tracked this down to the fact that the 
> {{BytesRef}} instances returned by {{TermOrdValComparator.value(int slot)}} 
> are backed by {{BytesRefBuilder}} instances that the Comparator hangs on to 
> and re-uses -- so the values a caller gets back from 
> {{FieldComparator.value(slot)}} might be changed out from under it before it 
> has a chance to use that value in something like 
> {{FieldComparator.compareValues(first,second)}}.
> The general approach when dealing with BytesRef instances (as i understand 
> it) is that the caller is responsible for making a copy if it wants to hang 
> on to it -- but in this case that would violate the generic API of 
> FieldComparator -- callers would have to pay attention to when a 
> {{FieldComparator}} is a 
> {{FieldComparator<BytesRef>}} and do casting to copy the BytesRef.
> It seems like the right solution is for {{TermOrdValComparator.value(slot)}} 
> (and {{TermValComparator.value(slot)}} which has a similar BytesRef usage) to 
> return {{BytesRef.deepCopyOf(values\[slot\])}}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to