Hi,

I've fiddled a little with your testcase and the suggested fix. My  
results are as follows using the mysql driver (my loop ran only one  
tenth of the suggested cycles, so your values may be even higher):

before fix:

==3410== LEAK SUMMARY:
==3410==    definitely lost: 240,384 bytes in 10,004 blocks
==3410==    indirectly lost: 170,032 bytes in 30,004 blocks
==3410==      possibly lost: 0 bytes in 0 blocks
==3410==    still reachable: 8,594 bytes in 7 blocks
==3410==         suppressed: 0 bytes in 0 blocks


after fix:

==3541== LEAK SUMMARY:
==3541==    definitely lost: 384 bytes in 4 blocks
==3541==    indirectly lost: 32 bytes in 4 blocks
==3541==      possibly lost: 0 bytes in 0 blocks
==3541==    still reachable: 8,594 bytes in 7 blocks
==3541==         suppressed: 0 bytes in 0 blocks

So there is a clear improvement although some memory is still lost.  
Even worse, I've discovered another leak in the sqlite3 driver (or in  
sqlite?) with this testcase, so there is some more work to do.

I've checked in the suggested fix. Thanks for bringing this to my attention.

regards,
Markus

Quoting Tom Lane <t...@sss.pgh.pa.us>:

> A loop such as the following leaks memory in libdbi 0.8.3:
>
>
>       for (n = 0; n < 100000; n++) {
>
>       res = dbi_conn_query(conn, "SELECT * FROM foo;");
>
>       if (!dbi_result_first_row(res)) {
>               fprintf(stderr, "dbi_result_first_row() failed.\n");
>               exit(1);
>       }
>
>       for (i = 0; i < 2; i++) {
>               do {
>                       val = dbi_result_get_int(res, "val");
>                       if (n == 0)
>                         printf("val: %d\n", val);
>
>               } while (dbi_result_next_row(res));
>
>               /* Rewind for the next iteration of the for() loop */
>               if (!dbi_result_first_row(res)) {
>                       fprintf(stderr, "dbi_result_first_row() failed.\n");
>                       exit(1);
>               }
>       }
>
>       dbi_result_free(res);
>
>       }
>
>
> This patch appears to fix it:
>
>
> diff -Naur libdbi-0.8.3.orig/src/dbi_result.c libdbi-0.8.3/src/dbi_result.c
> --- libdbi-0.8.3.orig/src/dbi_result.c        2008-01-23 11:37:36.000000000 
> -0500
> +++ libdbi-0.8.3/src/dbi_result.c     2011-09-06 20:51:34.610449576 -0400
> @@ -1533,7 +1533,7 @@
>  }
>
>  static int _is_row_fetched(dbi_result_t *result, unsigned long long row) {
> -  if (!result->rows || (row >= result->numrows_matched)) return -1;
> +  if (!result->rows || (row > result->numrows_matched)) return -1;
>    return !(result->rows[row] == NULL);
>  }
>
>
>
> This was discovered by some folks at Bull, who also deserve credit for
> the patch, but I don't have a full name.
>
>                       regards, tom lane
>
> ------------------------------------------------------------------------------
> Using storage to extend the benefits of virtualization and iSCSI
> Virtualization increases hardware utilization and delivers a new level of
> agility. Learn what those decisions are and how to modernize your storage
> and backup environments for virtualization.
> http://www.accelacomm.com/jaw/sfnl/114/51434361/
> _______________________________________________
> libdbi-devel mailing list
> libdbi-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/libdbi-devel


-- 
Markus Hoenicka
http://www.mhoenicka.de
AQ score 38



------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
libdbi-devel mailing list
libdbi-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libdbi-devel

Reply via email to