Re: PATCH: pgbench - option to build using ppoll() for largerconnection counts

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: PATCH: pgbench - option to build using ppoll() for largerconnection counts
Дата
Msg-id 20180406211528.ox4gjlwvkaekyv4w@alap3.anarazel.de
обсуждение исходный текст
Ответ на Re: PATCH: pgbench - option to build using ppoll() for largerconnection counts  ("Rady, Doug" <radydoug@amazon.com>)
Ответы Re: PATCH: pgbench - option to build using ppoll() for larger connection counts  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Hi,

I'm still not particularly happy with this.  Checking whether I can
polish it up.

a) the new function names are partially non-descriptive and their
   meaning is undocumented.  As an extreme example:

-                if (!FD_ISSET(sock, &input_mask))
+                if (ignore_socket(sockets, i, st->con))
                    continue;

   reading the new code it's entirely unclear what that could mean. Are
   you marking the socket as ignored? What does ignored even mean?

   There's not a single comment on what the new functions mean. It's not
   that bad if there's no docs on what FD_ISSET implies, because that's a
   well known and documented interface. But introducing an abstraction
   without any comments on it?

b) Does this actually improve the situation all that much? We still loop
   over every socket:

        /* ok, advance the state machine of each connection */
        for (i = 0; i < nstate; i++)
        {
            CState       *st = &state[i];

            if (st->state == CSTATE_WAIT_RESULT)
            {
                /* don't call doCustom unless data is available */

                if (error_on_socket(sockets, i, st->con))
                    goto done;

                if (ignore_socket(sockets, i, st->con))
                    continue;
            }
            else if (st->state == CSTATE_FINISHED ||
                     st->state == CSTATE_ABORTED)
            {
                /* this client is done, no need to consider it anymore */
                continue;
            }

            doCustom(thread, st, &aggs);

            /* If doCustom changed client to finished state, reduce remains */
            if (st->state == CSTATE_FINISHED || st->state == CSTATE_ABORTED)
                remains--;
        }

   if the goal is to make this more scalable, wouldn't this require
   using a proper polling mechanism that supports signalling the
   sockets with relevant changes, rather than busy-looping through every
   socket if there's just a single change?

   I kinda wonder if the proper fix wouldn't be to have one patch making
   WaitEventSets usable from frontend code, and then make this code use
   them.  Not a small project though.

Greetings,

Andres Freund


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Magnus Hagander
Дата:
Сообщение: Re: The buildfarm is in a pretty bad way, folks
Следующее
От: Andrew Dunstan
Дата:
Сообщение: Re: [HACKERS] logical decoding of two-phase transactions