1 /**
2 * Copyright (C) Mellanox Technologies Ltd. 2001-2019. ALL RIGHTS RESERVED.
3 * Copyright (C) UT-Battelle, LLC. 2015. ALL RIGHTS RESERVED.
4 *
5 * See file LICENSE for terms.
6 */
7
8 #include "test_ucp_tag.h"
9
10 #include <common/test_helpers.h>
11
12 extern "C" {
13 #include <ucp/tag/tag_match.h>
14 }
15
16 class test_ucp_tag_cancel : public test_ucp_tag {
17 };
18
UCS_TEST_P(test_ucp_tag_cancel,cancel_exp)19 UCS_TEST_P(test_ucp_tag_cancel, cancel_exp) {
20 uint64_t recv_data = 0;
21 request *req;
22
23 req = recv_nb(&recv_data, sizeof(recv_data), DATATYPE, 1, 1);
24 if (UCS_PTR_IS_ERR(req)) {
25 ASSERT_UCS_OK(UCS_PTR_STATUS(req));
26 } else if (req == NULL) {
27 UCS_TEST_ABORT("ucp_tag_recv_nb returned NULL");
28 }
29
30 ucp_request_cancel(receiver().worker(), req);
31 wait(req);
32
33 EXPECT_EQ(UCS_ERR_CANCELED, req->status);
34 EXPECT_EQ(0ul, recv_data);
35 request_release(req);
36 }
37
38 // Test that cancelling already matched (but not yet completed) request does
39 // not produce any error. GH bug #4490.
40 UCS_TEST_P(test_ucp_tag_cancel, cancel_matched, "RNDV_THRESH=32K") {
41 uint64_t small_data = 0;
42 ucp_tag_t tag = 0xfafa;
43 size_t size = 50000;
44
45 std::vector<char> sbuf(size, 0);
46 std::vector<char> rbuf(size, 0);
47
48 request *rreq1 = recv_nb(&rbuf[0], rbuf.size(), DATATYPE, tag,
49 UCP_TAG_MASK_FULL);
50 request *rreq2 = recv_nb(&small_data, sizeof(small_data), DATATYPE, tag,
51 UCP_TAG_MASK_FULL);
52
53 request *sreq1 = send_nb(&sbuf[0], sbuf.size(), DATATYPE, tag);
54 request *sreq2 = send_nb(&small_data, sizeof(small_data), DATATYPE, tag);
55
56 wait_and_validate(rreq2);
57
58 if (!rreq1->completed) {
59 ucp_request_cancel(receiver().worker(), rreq1);
60 } else {
61 UCS_TEST_MESSAGE << "nothing to cancel";
62 }
63
64 wait_and_validate(rreq1);
65 wait_and_validate(sreq1);
66 wait_and_validate(sreq2);
67 }
68
69
70 UCP_INSTANTIATE_TEST_CASE(test_ucp_tag_cancel)
71