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

Nick Wellnhofer commented on LUCY-315:
--------------------------------------

Yes, this looks like a memory leak in Lucy. But if it was something trivial, 
we'd probably have caught it in our test suite. It seems like the leak is 
related to your specific schema. Can you provide the full valgrind output? 
There should be lines like

{noformat}
  ==19182== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
  ==19182==    at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
  ==19182==    by 0x8048385: f (a.c:5)
  ==19182==    by 0x80483AB: main (a.c:11)
{noformat}

(You can create [preformatted 
blocks|https://issues.apache.org/jira/secure/WikiRendererHelpAction.jspa?section=advanced]
 in JIRA with \{noformat\}.)


> Memory leak in sortSpec
> -----------------------
>
>                 Key: LUCY-315
>                 URL: https://issues.apache.org/jira/browse/LUCY-315
>             Project: Lucy
>          Issue Type: Bug
>          Components: C bindings
>    Affects Versions: 0.6.0
>            Reporter: Serkan Mulayim
>
> A possible memory leak in the usage of SortSpec in IndexSearcher.
> You can find the simple code at the end of this description demonstrating the 
> issue. (sorry JIRA does not allow me to attach a file). Please do not 
> concentrate on the 2 functions, testing_get_query and testing_get_schema. 
> They do not cause any memory leaks, and not included in the code.
> Please see the line   "Hits *hits = IxSearcher_Hits(searcher, (Obj*)query, 0, 
> 10,  sortSpec);" in the code. 
> When we use a SortSpec in the searcher "IxSearcher_Hits(searcher, 
> (Obj*)query, 0, 10,  sortSpec)", valgrind detects a memory leak (24 bytes 
> definitely lost). 
> When we change ONLY one line to "IxSearcher_Hits(searcher, (Obj*)query, 0, 
> 10,  NULL)", valgrind does not detect the memory leaks.  The only difference 
> is changing the sortSpec variable with NULL. In the code SortSpec is still 
> being created the same way and DECREFfed the same way.  I suspect that the 
> issue is in DECREF(searcher) and it is not cleaning up some objects in 
> searcher that are related to the sortSpec.
> Valgrind command is "valgrind --leak-check=full --show-leak-kinds=all  
> vectortest".
> Output when sortSpec is passed into the IxSearcher_Hits, valgrind output is 
> as following:
> ==67956== LEAK SUMMARY:
> ==67956==    definitely lost: 24 bytes in 1 blocks
> ==67956==    indirectly lost: 0 bytes in 0 blocks
> ==67956==      possibly lost: 0 bytes in 0 blocks
> ==67956==    still reachable: 223,323 bytes in 4,919 blocks
> ==67956==         suppressed: 34,896 bytes in 427 blocks
> Output when NULL is passed into the IxSearcher_Hits, valgrind output is as 
> following:
> ==67818== LEAK SUMMARY:
> ==67818==    definitely lost: 0 bytes in 0 blocks
> ==67818==    indirectly lost: 0 bytes in 0 blocks
> ==67818==      possibly lost: 0 bytes in 0 blocks
> ==67818==    still reachable: 223,323 bytes in 4,919 blocks
> ==67818==         suppressed: 34,896 bytes in 427 blocks
> -----------------------------------------Code: 
> test.c-----------------------------------------------
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #define CFISH_USE_SHORT_NAMES
> #define LUCY_USE_SHORT_NAMES
> #include "Lucy/Plan/Schema.h"
> #include "Lucy/Plan/StringType.h"
> #include "Lucy/Plan/FullTextType.h"
> #include "Lucy/Analysis/EasyAnalyzer.h"
> #include "Lucy/Index/Indexer.h"
> #include "Lucy/Search/QueryParser.h"
> #include "Lucy/Search/RangeQuery.h"
> #include "Lucy/Search/ANDQuery.h"
> #include "Lucy/Search/SortRule.h"
> #include "Lucy/Search/SortSpec.h"
> #include "Lucy/Search/Hits.h"
> #include "Lucy/Document/HitDoc.h"
> #include "Lucy/Search/IndexSearcher.h"
> #include "Clownfish/Vector.h"
> #include "Clownfish/String.h"
> #define SEARCH_FIELD_INGESTION_DATE "ingestionDate"
> static Query* testing_get_query(Schema *schema, const char * query_str, const 
> char* startDate, const char *endDate);
> static Schema* testing_get_schema(char* lang);
> int main() \{
>       lucy_bootstrap_parcel();
>       Schema* schema = testing_get_schema("en");
>       String *folder = Str_newf("%s/%s", "searchIndex", "testIndex1");
>       Query *query = testing_get_query(schema, "hello", "0000000000000", 
> "9999999999999");
>       IndexSearcher *searcher = IxSearcher_new((Obj*) folder);
>       String *field_date_str = Str_newf(SEARCH_FIELD_INGESTION_DATE);
>       SortRule *sortRule = SortRule_new(SortRule_FIELD, field_date_str, 0);
>       Vector *sortRules = Vec_new(1);
>       Vec_Push(sortRules, (Obj*) sortRule);
>       SortSpec *sortSpec = SortSpec_new(sortRules);
>       Hits *hits = IxSearcher_Hits(searcher, (Obj*) query, 0, 10,  sortSpec);
>       DECREF(field_date_str);
>       DECREF(sortRules);
>       DECREF(sortSpec);
>       DECREF(schema);
>       DECREF(folder);
>       DECREF(query);
>       DECREF(hits);
>       DECREF(searcher);
> \}
> --------------------------------------------------------------------------------------------------------



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

Reply via email to