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