Hi guys had some time today to play again
 
Seems we have one of three choices
 
SvREFCNT_dec(tuples_utf8_av);

as pathced
 
or 
 
av_clear(tuples_utf8_av);
 
at the send of the 'i' loop or
 
sv_2mortal((SV*)tuples_utf8_av);
 
at the begining
 
 
I have tried them all and they all get rid of the leak.
 
I also noticed that we are useing 
 
safemalloc
 
which is sort of ugly  Newz is better
 
My choice is to use the 
 
sv_2mortal((SV*)tuples_utf8_av);
 
at the beginning and let perl worry about it.
 
 
I will do another pathc I think to get rid of the malloc code as I see it in 
other places as well
 
Any more thoughts before I stick it in trunk???
 
cheers
John

 

> Date: Tue, 9 Oct 2012 21:21:13 +0200
> From: blan...@worldcom.ch
> To: martin.ev...@easysoft.com
> CC: dbi-dev@perl.org
> Subject: Re: Patch proposal for leak in DBD::Oracle when calling 
> 'execute_array' with UTF-8 NLS...
> 
> 
> 
> Hello Martin,
> 
> Sorry for the late reply.
> Basically what my script tries to do is to copy lots of records from one 
> database to another. To do this, I've come to the idea of using "execute 
> array" to speed up the process. I generally use NLS_LANG set to UTF-8 
> for Oracle, because it's the default encoding on my Linux distribution, 
> so it was not a choice I've made for that specific application.
> 
> It's when reviewing the code (after a little help from valgrind 
> memory-checker), that I got the idea to turn UTF-8 off. Specifically the 
> lines around ~ 3825 : ...
> /* update the utf8_flgs for this value */
> if (SvUTF8(sv)) {
> utf8_flgs[i] |= ARRAY_BIND_UTF8;
> if (SvTRUE(tuples_status)){
> av_push(tuples_utf8_av,newSViv(j));
> }
> 
> ... made me think it was probably worth a try.
> 
> As so far I understand, the 'tuples_utf8_av' is not given back to perl 
> interpreter, I assumed that it was safe to decrement it's reference 
> count to allow it to be garbage-collected. But as I said in my previous 
> mail, I've no experience in Perl internals and that may be a false 
> assumption.
> 
> Thanks very much for your feedback.
> Best regards,
> Pierre-Alain Blanc
> 
> On 09/10/12 09:53, Martin J. Evans wrote:
> > On 08/10/12 13:46, Pierre-Alain Blanc wrote:
> >>
> >>
> >> Hello,
> >>
> >> I've had a problem when using 'execute_array' to insert (lots of)
> >> records with DBD::Oracle (version 1.50): the script consumed too much
> >> memory and finally crashed (killed by kernel). I tried to trigger the
> >> garbage-collection with some code rewrite but it didn't help. But if
> >> I told Oracle *not* to use an UTF-8 charset (changing NLS_LANG from
> >> (for example) "german_germany.utf8" to "german_germany.we8dec"), the
> >> problem disappeared.
> >>
> >> After some investigations, I think the leak is in
> >> 'ora_st_execute_array' method of dbdimp.c. Please find the patch as
> >> attachment. As I'm completly new to writing C for Perl, it may be
> >> something I did not understand or did not correctly fixed. Sorry if
> >> it would be the case.
> >>
> >> Thanks & best regards, Pierre-Alain Blanc
> >>
> >>
> >
> > Thanks for looking into this. The patch:
> >
> > Index: dbdimp.c
> > ===================================================================
> > --- dbdimp.c (revision 15435)
> > +++ dbdimp.c (working copy)
> > @@ -3839,6 +3839,7 @@
> > }
> > Safefree(phs);
> > Safefree(utf8_flgs);
> > + SvREFCNT_dec(tuples_utf8_av);
> > /* Store array of bind typles, for use in OCIBindDynamic() 
> > callback. */
> > imp_sth->bind_tuples = tuples_av;
> > imp_sth->rowwise = (columns_av == NULL);
> >
> > looks good but it does not explain how changing chrset made the 
> > problem go away. Perhaps you could give me a better idea of what you 
> > were doing then I can replicate and test it.
> >
> > Martin
> 
                                          

Reply via email to