Re: [HACKERS] pgbench tap tests & minor fixes - Mailing list pgsql-hackers

From Fabien COELHO
Subject Re: [HACKERS] pgbench tap tests & minor fixes
Date
Msg-id alpine.DEB.2.20.1705082107310.3983@lancre
Whole thread Raw
In response to Re: [HACKERS] pgbench tap tests & minor fixes  (Nikolay Shaplov <dhyan@nataraj.su>)
Responses Re: [HACKERS] pgbench tap tests & minor fixes
List pgsql-hackers
Hello Nikolay,

>> Here is a v3, with less files. I cannot say I find it better, but it
>> still works.
>
> Actually I like it. It is what I expect it to be ;-) [...]

Well, if someone is happy about the code, that's good:-)

>> The "command_likes" function has been renamed "command_checks".
>
> This is one thing have my doubts about. [...]
> perl experience tells me that this new function should be called 
> command_likes_more. It is a kind of tradition in test naming things 
> "simple, more, most, etc".

Hmmm. I've done such things in the past, but it felt more like a lack of 
imagination than good naming practices:-)

What about "command_checks_all"?

> 1. I quite agree with Robert, that this options patch is a separate issue and
> it would be better do deal with them separately. But I wild not insist. It
> will just made our work on this commit longer, instead of two shorter works.

Yep. I'm fine with the patch being committed in two parts, one for the C 
file and the perl test separately. However the perl test would not pass 
without the C changes, so it would be commit C changes and then the tests.

                      ...
>                    while (thread->throttle_trigger < now_us - latency_limit &&
>                           /* with -t, do not overshoot */
>                           (nxacts <= 0 || st->cnt < nxacts))
                         ...
>                    if (nxacts > 0 && st->cnt >= nxacts)
>                    {
>                        st->state = CSTATE_FINISHED;
>                        break;
>                    }
>
> First of all I do not completely understand this while and your changes 
> in it.

When under throttling (-R) with latency limit (-L), if the stochastic 
process schedules transactions which are already too late, they are 
skipped by this while loop. However, if a number of transaction is 
specified (-t), this resulted in more transaction being considered in the 
report than the number that was asked for, and the displayed statistics 
were wrong. The added condition allows to not overshoot the target number 
of transactions in that case.

> This while() is inside... Originally It detects that the transaction is late,
> "counts" how many throttle_delay will fit in this total delay, and for each
> throttle_delay do some logging in processXactStats and counts thread->
> latency_late total number there too.

Yep.

> Please note that in original code thread->stats.cnt++; is one only when not
> (progress || throttle_delay || latency_limit)

The same incrementation is done in accumStats function, among other 
things, in the other branch.

> And you've added st->cnt ++; with no conditions. So if transaction is delayed
> for N*throttle_delay miliseconds, your st->cnt will be incremented N times.

Yep. This is the number of transactions "considered" by the client, both 
those executed and those skipped.

> Are you sure it is what you want to do?

Yes.

> If so, I need more explanations because I do not understand why do you 
> want to count it that way, and what exactly do you count here.

There are two counts: one in the threads, and one in the clients. They 
were not cleanly accounted for, so I've updated the code so that what is 
counted is clearer, and so that thread & client accounting is done in the 
same place/functions, and that formula which use these counts are 
consistent.

The stats are updated through the processXactsStats/accumStats which 
collect many statistics about execution time and so, but this precise 
collection is skipped when the stats are not needed in order to avoid some 
cycles, and just simple counting is done.

> Why do you check nxacts > 0? It _must_ be grater then 0.

Only under -t (number of transaction). It is 0 under -T (time to run), 
which is the usual approach to run tests, but for creating small 
deterministic tests I used -t a lot, hence I noticed that some things were 
not right.

I could do "nacts == 0" instead of "nacts <= 0", because probably "nacts 
>= 0", but it seemed safer with <= which complements > in the while 
condition.

> I think it one want to be sure that some value is valid, he uses Assert.

Nope, the test is really needed.

> More notes about code styling: [...]

I've tried to improve comments placement.

> The second style issue: [...]

I like the comma operator from time to time, but I can use {} as well.


Please find attached a v4. To sum it up:

About pgbench.c changes:
  - make -t work properly with -R and -L and display sensible stats
  - check that --progress-timestamp => --progress

About TAP test changes:
  - add an infrastructure to run a command and check for its
    exit status, stdout and stderr.
  - add many tests to pgbench, achieving nearly full coverage.
    360 tests running time under 7 seconds on my laptop
    (versus 3 tests which ran in about 4 seconds previously).

One open question is whether some test may fail on Windows, if someone 
would test that it would be great!

-- 
Fabien.
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Attachment

pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: [HACKERS] Adding support for Default partition in partitioning
Next
From: Nikolay Shaplov
Date:
Subject: Re: [HACKERS] pgbench tap tests & minor fixes