You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by Fuxiang Chen <fc...@cse.ust.hk> on 2014/08/06 06:34:04 UTC

[Lucene Bug] Did not decrement max count

Dear Lucene Developers,

In the source file "SolrXMLSerializer.java", there is a flaw in the code
fragment that is using transferTo.

Original Code
--------------------
      long size = fcin.size();
      long position = 0;
      while (position < size) {
        position += fcin.transferTo(position, MB32, fcout);
      }

The MB32 (which is the max count needs to be decrement.

See reference: http://stackoverflow.com/questions/7379469

Changed Code
----------------------
while (position < size) {
    long count = inChannel.transferTo(position, MB32, fcout);
    if (count > 0)
    {
        position += count;
        MB32 -= count;
    }
}


Please consider fixing this bug.

Thanks!


-- 
Warmest Regards,
    Fuxiang

Re: [Lucene Bug] Did not decrement max count

Posted by Chris Hostetter <ho...@fucit.org>.
: In the source file "SolrXMLSerializer.java", there is a flaw in the code
: fragment that is using transferTo.

Nothing in your email, or in the link you cited, explains why you think 
this is a bug...

: The MB32 (which is the max count needs to be decrement.
: 
: See reference: http://stackoverflow.com/questions/7379469

The discussion on that URL is specifically about people attempting to copy 
entire files via a *single* call to transferTo/transferFrom.  2 main 
things are discussed:

1) the importance of making transfertTo/transferFrom calls in a loop  
that inspects the return value to see how much data was actaully copied so 
you know the position to use for hte next transfer.

2) the possibility of bugs on some platforms if you attempt to copy more 
then 64MB at a time 

...neither of which are a problem in SolrXMLSerializer.java (the code 
already checks the return value nad loops & the max size to copy is fixed 
at 32 MB)

One user on the URL you cited suggested decrementing the the number of 
bytes copied in a loop each time, w/o citing any justification for why 
that should be done -- a subsequent user followed up with a comment 
suggesting that it only makes sense if the initial number of bytes is very 
large ("AFAIK, maxCount should be decremented only if it is given the 
value of the file size in the very beginning: maxCount = filesize, and 
then decrement it in each loop") but again: no explanation or 
justification for why this might be is provided.


The code you suggest we use looks very dangerous to me -- anytime 
a file larger then 32 MB gets copied if transferTo does in fact copy a 
full 32 MB on the first method call, then the decrement will result in the 
next call asking for 0 bytes to be copied. 

Your email does have me wondering however: why does this method exist in 
SolrXMLSerializer? ... it seems like common-io FileUtils.copyFile should 
be used instead, so i've opened a jira for that...

https://issues.apache.org/jira/browse/SOLR-6339



: 
: Changed Code
: ----------------------
: while (position < size) {
:     long count = inChannel.transferTo(position, MB32, fcout);
:     if (count > 0)
:     {
:         position += count;
:         MB32 -= count;
:     }
: }
: 
: 
: Please consider fixing this bug.
: 
: Thanks!
: 
: 
: -- 
: Warmest Regards,
:     Fuxiang
: 

-Hoss
http://www.lucidworks.com/

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