multithreading in Batch/pipelining mode for libpq

From: Ilya Roublev <iroublev(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: multithreading in Batch/pipelining mode for libpq
Date: 2017-04-21 20:31:46
Message-ID: 285554A3-05A8-4D11-8EEB-00D5BC366144@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hello,

I'm investigating Batch/pipelining mode for libpq connected to this thread: https://www.postgresql.org/message-id/flat/CADT4RqA6XoDCVY-G13ME1oRVshE2oNk4fRHKZC0K-jJymQJV0Q%40mail(dot)gmail(dot)com#CADT4RqA6XoDCVY-G13ME1oRVshE2oNk4fRHKZC0K-jJymQJV0Q(at)mail(dot)gmail(dot)com
And I'm wondering, what are the possibilities to speed up execution of asynchronous queries yet more. What I need is to make a huge amount of inserts (or other sorts of queries either returning no results or those which results I'd like somehow to ignore completely) very quickly, so the idea to use batch mode sounds rather good for me taking into account https://blog.2ndquadrant.com/postgresql-latency-pipelining-batching/

So I'd like to create the corresponding prepared statement and to perform asynchronously all these queries through this prepared statement. What I'm trying to do now is to understand (at least in general):
1) is it possible technically (possibly by changing some part of libpq code) to ignore results (especially for this sort of queries like insert), processing somehow separately the situation when some error occurs?
2) if the answer to the previous question is negative, is it possible to send asynchronous queries in one thread while reading results in another thread? I understand that this immediately contradicts the requirement not to use the same PGconn object in different threads. But may be some locks of this PGconn object are possible, so that the state of PGconn cannot be made in one thread while the other locks PGconn and vice versa?

Naturally I failed to implement this without locking, info in PGconn very quickly becomes inconsistent, the number of queries sent does not correspond to the number of results to be read, etc. So I'd like to know at first is it possible at all (possibly by some changes to be made in libpq)? Sorry if my idea sounds rather naive. And thanks for your answer and advice.

Only in the case all this sounds not so stupid and something is possible to make, I'd like to ask for some details, if you do not mind.

Thank you very much again in advance.

With my best regards,
Ilya

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2017-04-21 21:04:08 Re: [COMMITTERS] pgsql: Replication lag tracking for walsenders
Previous Message Tom Lane 2017-04-21 20:21:39 Re: Old versions of Test::More