Skip to content

Calling waitAny after workload can break Tntcxx #124

Open
@drewdzzz

Description

@drewdzzz

Consider the following test case for client:

template <class BUFFER, class NetProvider>
void
test_case(Connector<BUFFER, NetProvider> &client)
{
	TEST_INIT(0);
	Connection<Buf_t, NetProvider> conn1(client);
	Connection<Buf_t, NetProvider> conn2(client);
	Connection<Buf_t, NetProvider> conn3(client);
	int rc = test_connect(client, conn1, localhost, port);
	fail_unless(rc == 0);
	/* Try to connect to the same port */
	rc = test_connect(client, conn2, localhost, port);
	fail_unless(rc == 0);
	rc = test_connect(client, conn3, localhost, port);
	fail_unless(rc == 0);
	rid_t f1 = conn1.ping();
	rid_t f2 = conn2.ping();
	rid_t f3 = conn3.ping();

	/* Wait for all connections. */
	fail_unless(client.wait(conn1, f1, WAIT_TIMEOUT) == 0);
	fail_unless(conn1.futureIsReady(f1));
	fail_unless(conn1.getResponse(f1).header.code == 0);

	fail_unless(client.wait(conn2, f2, WAIT_TIMEOUT) == 0);
	fail_unless(conn2.futureIsReady(f2));
	fail_unless(conn2.getResponse(f2).header.code == 0);

	fail_unless(client.wait(conn3, f3, WAIT_TIMEOUT) == 0);
	fail_unless(conn3.futureIsReady(f3));
	fail_unless(conn3.getResponse(f3).header.code == 0);

	/* Wait any. */
	std::optional<Connection<Buf_t, NetProvider>> conn_opt = client.waitAny(WAIT_TIMEOUT);

	/* Close all connections. */
	client.close(conn1);
	client.close(conn2);
	client.close(conn3);
}

The test fails with the following assertion (LibevNetProvider is used):

Assertion failed: (hasDataToDecode(conn)), function waitAny, file Connector.hpp, line 274.

Note that if you leave only one connection, the test will pass successfully.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcrash

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions