[LTP] [PATCH v1] Rewrite msgstress testing suite
Andrea Cervesato
andrea.cervesato@suse.com
Thu Mar 7 15:46:50 CET 2024
Hi!
On 3/7/24 12:33, Cyril Hrubis wrote:
> Hi!
> First of all this patch removes all users of the libltpipc library but
> keeps the library orphaned in libs/ leaving a dead code.
This was done by purpose. I have track of dependences inside LTP and the
idea is to remove it on a second moment. But I can send a following
patch removing it already.
> Secondly if you look at the libmsgctl.c you can actually see that the
> reader and writer pair sends messages in a loop. This is imporatant
> because without that the test can be hardly called a stress test. The
> point is to start as much processes as possible that keep sending
> messages around so that eventually we saturate the system. The new test
> just sends a single message, which means that the children finish too
> quickly and we never run more than a single digit of read/write pairs.
> Given that we now have a runtime support in the test library we should
> change this so that the reader/write paris continue to send messages
> around until we are out of runtime. And the runtime should be at least a
> minute.
Actually this is a good idea, but test might send not enough messages if
system is not responsive.
I would keep the loop like we do now in this case, so we ensure a
certain amount of stress, no matter the runtime.
>
>> +static void reader(const int id)
>> +{
>> + int size;
>> + struct sysv_msg msg_recv;
>> + struct sysv_data *buff = NULL;
>>
>> - /* Fork a number of processes, each of which will
>> - * create a message queue with one reader/writer
>> - * pair which will read and write a number (iterations)
>> - * of random length messages with specific values.
>> - */
>> + memset(&msg_recv, 0, sizeof(struct sysv_msg));
>>
>> - for (i = 0; i < nprocs; i++) {
>> - fflush(stdout);
>> - if ((pid = FORK_OR_VFORK()) < 0) {
>> - tst_brkm(TFAIL,
>> - NULL,
>> - "\tFork failed (may be OK if under stress)");
>> - }
>> - /* Child does this */
>> - if (pid == 0) {
>> - procstat = 1;
>> - exit(dotest(keyarray[i], i));
>> + size = SAFE_MSGRCV(id, &msg_recv, 100, MSGTYPE, 0);
>> +
>> + for (int i = 0; i < ipc_data_len; i++) {
>> + if (ipc_data[i].id == id) {
>> + buff = ipc_data + i;
>> + break;
>> }
>> - pidarray[i] = pid;
>> }
>>
>> - count = 0;
>> - while (1) {
>> - if ((wait(&status)) > 0) {
>> - if (status >> 8 != 0) {
>> - tst_brkm(TFAIL, NULL,
>> - "Child exit status = %d",
>> - status >> 8);
>> - }
>> - count++;
>> - } else {
>> - if (errno != EINTR) {
>> - break;
>> - }
>> -#ifdef DEBUG
>> - tst_resm(TINFO, "Signal detected during wait");
>> -#endif
>> - }
>> + if (!buff) {
>> + tst_brk(TBROK, "Can't find original message. This is a test issue!");
>> + return;
>> }
>> - /* Make sure proper number of children exited */
>> - if (count != nprocs) {
>> - tst_brkm(TFAIL,
>> - NULL,
>> - "Wrong number of children exited, Saw %d, Expected %d",
>> - count, nprocs);
>> +
>> + TST_EXP_EQ_LI(msg_recv.type, buff->msg.type);
>> + TST_EXP_EQ_LI(msg_recv.data.len, buff->msg.data.len);
>> +
>> + for (int i = 0; i < size; i++) {
>> + if (msg_recv.data.pbytes[i] != buff->msg.data.pbytes[i]) {
>> + tst_res(TFAIL, "Received wrong data at index %d: %x != %x", i,
>> + msg_recv.data.pbytes[i],
>> + buff->msg.data.pbytes[i]);
>> +
>> + goto exit;
>> + }
>> }
>>
>> - tst_resm(TPASS, "Test ran successfully!");
>> + tst_res(TPASS, "Received correct data");
> This spams the test output with a few hundreds of lines of output, which
> is known to choke test runners. For this case we should probably output
> one single TPASS at the end of the test.
>
> Also this seems to be a common pattern, so we may as well add a function
> into the test library that would produce TPASS unless we have seen a
> FAIL/BROK/WARN. Or maybe just a function that would return sum of the
> result counters so that we can do:
>
> if (tst_get_res(TFAIL|TBROK|TWARN))
> tst_res(TPASS, "All data were received correctly");
>
>
Isn't it like this already?
Regards,
Andrea
More information about the ltp
mailing list