Re: Problems with MemoryContextSwitchTo () - Mailing list pgsql-general

From Pavel Stehule
Subject Re: Problems with MemoryContextSwitchTo ()
Date
Msg-id CAFj8pRAK5Y3VQkMGP5PTnX7oWiirogMPTJ7MjFSt0E0nQKpibA@mail.gmail.com
Whole thread Raw
In response to Re: Problems with MemoryContextSwitchTo ()  (Yessica Brinkmann <brinkmann.yessica@gmail.com>)
List pgsql-general


pá 18. 9. 2020 v 6:35 odesílatel Yessica Brinkmann <brinkmann.yessica@gmail.com> napsal:
I already discovered the problem, it was only a counter initialization issue, it had nothing to do with memory contexts, that part was fine. Thank God I could already understand the problem and solve it.
Anyway thank you very much.
Best regards,
Yessica Brinkmann

Great! These problems forward us :). It is very common so the problem is somewhere else than we are finding.

Pavel


El jue., 17 sept. 2020 a las 22:26, Yessica Brinkmann (<brinkmann.yessica@gmail.com>) escribió:
Thank you very much for the answers, and for the advice given. I will try to put them into practice.
Best regards,
Yessica Brinkmann


El jue., 17 sept. 2020 a las 6:46, Yessica Brinkmann (<brinkmann.yessica@gmail.com>) escribió:


Good Morning. Thank you so much for the answers. Now I have to go to work, but when I come back I will be looking at the answers in detail, and I will answer. Unfortunately I have to work and study as well, so right now I can't see the answers in detail.
Best regards,
Yessica Brinkmann.


-------- Mensaje original --------
Asunto: Re: Problems with MemoryContextSwitchTo ()
De: Pavel Stehule
Para: Yessica Brinkmann
CC: pgsql-general




čt 17. 9. 2020 v 6:09 odesílatel Pavel Stehule <pavel.stehule@gmail.com> napsal:


čt 17. 9. 2020 v 3:16 odesílatel Yessica Brinkmann <brinkmann.yessica@gmail.com> napsal:
Good night,
Thank you very much for the answer.
Excuse me please just answered, I was at my job.
And yes, I get the results of the list with SPI_exec.
And I am also using SPI_finish (). But I save the results of the previous query in the array idxcd-> varattnnames.
And in the second foreach it should print me the values that I got in the query, since I print the values of idxcd-> varattnnames, but it is printing null.
And I think the memory context switch is fine too, so I really don't know why it prints null to me.
I will greatly appreciate a help please. I can't really understand why it prints null in the second foreach, even though I already tried various changes.

do you use Postgres with active assertions ?

postgres=# show debug_assertions ;
┌──────────────────┐
│ debug_assertions │
╞══════════════════╡
│ on               │
└──────────────────┘
(1 row)

maybe you somewhere allocate less memory then it is necessary and some memset rewrites memory with your data. When you have a problem with memory, then you should to very carefully check a) if memory is allocated in good context, b) if memory was allocated enough (sometimes I just allocated x + 100000 for testing).

Can you write a reproducer ? code that I can check at my home. Postgres is pretty complex system, and it is hard to fix some issue without access to code


This is some messy in your code

MemoryContext oldContext = MemoryContextSwitchTo( outerContext );
MemoryContextSwitchTo( oldContext );

Unfortunately, your code is not well structured - it is hard to read it. One hint - if you find an issue - try to reduce lines of your code which is possible until you reproduce this issue or until you understand this issue.

The sequence of statements is a little bit obscure :)

initStringInfo( &query );

*/
if( cols.len > 0 )
{
initStringInfo(&cols);
} /*IF col.len>0*/

Instead

foreach( cell, candidates ) /* foreach cell in candidates */
{

int i;



   /*elog (INFO, "Ingresando a foreach");*/
idxcd = (IndexCandidate*)lfirst( cell );

if (idxcd == NULL) {
            elog( INFO, "idxcd IS NULL" );
            continue; /* Or is that fatal enough to break instead? */
        }


you can write

idxcd = (IndexCandidate *) linitial(candidates);

The problem in your example is fact so it is a mix of copy/paste fragments. I wrote similar code, and almost everyone I know (when I started). But it is not possible to fix this code - start from scratch. The code must be readable (every time). And when I write code inside some complex environment (like Postgres is), I write code in very small fragments, in very small steps, and every time I try to compile, restart and check the result. Then I know what line, or what statement is the problem.

Regards

Pavel












Best regards,
Yessica Brinkmann

El mié., 16 sept. 2020 a las 9:16, Pavel Stehule (<pavel.stehule@gmail.com>) escribió:


st 16. 9. 2020 v 15:09 odesílatel Yessica Brinkmann <brinkmann.yessica@gmail.com> napsal:
Well, the fact is that I have a function called get_columnnames, which in the second foreach, is printing the values of idxcd-> varattnnames [i] the null value. This is the error.

How you get this list? It is result of SPI_exec*** ?

There is SPI_finish(), that cleaning a memory used by SPI interface, and theoretically it can clean result of previous query.

Regards

Pavel



-------- Mensaje original --------
Asunto: Re: Problems with MemoryContextSwitchTo ()
De: Pavel Stehule
Para: Yessica Brinkmann
CC: pgsql-general




st 16. 9. 2020 v 13:32 odesílatel Yessica Brinkmann <brinkmann.yessica@gmail.com> napsal:
Good Morning.
I will greatly appreciate a help please on this subject. I actually did several tests already and tried a lot to fix it myself. But I am not able to. And I really need to know this in order to finish my university thesis. If someone can help me please.
Best regards,
Yessica Brinkmann

please, can you attach your code, and can you show the error message?

It is hard to say what is the problem from your mail?

Regards

Pavel




El mié., 16 sept. 2020 a las 0:42, Yessica Brinkmann (<brinkmann.yessica@gmail.com>) escribió:


Hello.
I think several of you will already remember me. I'm the one with the IndexAdviser topic. Only that I changed my email address.
As you may recall, I am doing my thesis on the subject of IndexAdviser modifications.
I really appreciate the help they have given me in various Postgresql groups.
Well, I was really nearing the end of the programming part of the thesis, when I had a problem to be able to compile my program in a moment, and by accident some lines of source code were moved.
And for this reason, I think I have problems again with the context switch issue, since at some point my context switch stopped working for me, I think because of the issue that some lines of source code were moved.
Well, the fact is that I have a function called get_columnnames, which in the second foreach, is printing the values of idxcd-> varattnnames [i] the null value.
This second foreach, I only do it to test if the data is really saved well and if I can recover it properly.
And since the data is not retrieved properly, or is not saved properly, in the following functions of my program, the value of idxcd-> varattnnames [i] continues to appear as null.
I will appreciate a lot please help, if you can tell me please why the function prints null in the values of idxcd-> varattnnames [i], in the second foreach, if it is due to an error in the context switch, or why it could be .
I send my function as an attachment.

Best regards,
Yessica Brinkmann.

pgsql-general by date:

Previous
From: Yessica Brinkmann
Date:
Subject: Re: Problems with MemoryContextSwitchTo ()
Next
From: Øystein Kolsrud
Date:
Subject: Re: PostgreSQL processes use large amount of private memory on Windows