babelouest / ulfius

Web Framework to build REST APIs, Webservices or any HTTP endpoint in C language. Can stream large amount of data, integrate JSON data with Jansson, and create websocket services
https://babelouest.github.io/ulfius
GNU Lesser General Public License v2.1
1.08k stars 182 forks source link

What is the best way to let libulfius interact with libpq? #264

Open dancesWithCycles opened 1 year ago

dancesWithCycles commented 1 year ago

Dear folks, Thank you so much for providing and maintaining this repository! I am using it together with the libqp API to access a PostgreSQL database. According to libpq documentation I cannot issue concurrent commands from different threads through the same PGconn connection object. So, either I protect the PGconn connection object from concurrent calls from different threads like @babelouest mentioned in issue https://github.com/babelouest/ulfius/issues/263 or I use a dedicated PGconn connection object for each and every client thread. In https://github.com/babelouest/ulfius/issues/263 @babelouest also mentioned that every client receives a dedicated thread as long as the default configuration of libmicrohttpd is not altered.

My question: Securing the single PGconn connection object with something like a Mutex does introduce latency to the system for waiting until the protected resource is available again. I could avoid latency if I provide a dedicated PGconn connection object to every client thread. Is that possible?

My second question: I could provide a dedicated PGconn connection object to the callback function of an API endpoint using the user_data parameter of the ulfius_add_endpoint_by_value function. However, this is not solving this issue. Two different client thread calling the same endpoint would use the same PGconn connection object. I could create the PGconn connection object inside the callback_function parameter. However, this introdues latency as a PGconn connection object is created for each and every client request. Is this reasoning correct?

Appreciate!

Cheers!

dancesWithCycles commented 1 year ago

If someone is interested to protect a critical resource like the PGconn connection object, this post can serve as an example.

Cheers!

babelouest commented 1 year ago

Hello,

In my experience, a mutex is the best way to ensure the stability, but I don't program with the intention to provide a highly performant solution, so this may not be the best way for your needs.

The way I see it, you can try different approaches:

My best guess is to ask postgresql people, they have several mailing lists that may help you: https://www.postgresql.org/list/

I also suggest to open a discussion rather than an issue for these kind of questions. The discussions are a better format for interaction and feedbacks.