@@ -56,16 +56,43 @@ TEST_F(TestClient, LlreadvLlwritev) {
5656 {in1, sizeof (in1)},
5757 };
5858
59+ char out_a_0[] = " hello " ;
60+ char out_a_1[] = " world a is longer\n " ;
61+ struct iovec iov_out_a[2 ] = {
62+ {out_a_0, sizeof (out_a_0)},
63+ {out_a_1, sizeof (out_a_1)},
64+ };
65+ char in_a_0[sizeof (out_a_0)];
66+ char in_a_1[sizeof (out_a_1)];
67+ struct iovec iov_in_a[2 ] = {
68+ {in_a_0, sizeof (in_a_0)},
69+ {in_a_1, sizeof (in_a_1)},
70+ };
71+
72+ char out_b_0[] = " hello " ;
73+ char out_b_1[] = " world b is much longer\n " ;
74+ struct iovec iov_out_b[2 ] = {
75+ {out_b_0, sizeof (out_b_0)},
76+ {out_b_1, sizeof (out_b_1)},
77+ };
78+ char in_b_0[sizeof (out_b_0)];
79+ char in_b_1[sizeof (out_b_1)];
80+ struct iovec iov_in_b[2 ] = {
81+ {in_b_0, sizeof (in_b_0)},
82+ {in_b_1, sizeof (in_b_1)},
83+ };
84+
5985 ssize_t nwritten = iov_out[0 ].iov_len + iov_out[1 ].iov_len ;
6086
6187 std::unique_ptr<C_SaferCond> writefinish = nullptr ;
6288 std::unique_ptr<C_SaferCond> readfinish = nullptr ;
6389
64- writefinish.reset (new C_SaferCond (" test-nonblocking" ));
65- readfinish.reset (new C_SaferCond (" test-nonblocking" ));
90+ writefinish.reset (new C_SaferCond (" test-nonblocking-writefinish " ));
91+ readfinish.reset (new C_SaferCond (" test-nonblocking-readfinish " ));
6692
6793 int64_t rc;
6894 bufferlist bl;
95+
6996 rc = client->ll_preadv_pwritev (fh, iov_out, 2 , 0 , true , writefinish.get (), nullptr );
7097 ASSERT_EQ (0 , rc);
7198 rc = writefinish->wait ();
@@ -80,6 +107,44 @@ TEST_F(TestClient, LlreadvLlwritev) {
80107 ASSERT_EQ (0 , strncmp ((const char *)iov_in[0 ].iov_base , (const char *)iov_out[0 ].iov_base , iov_out[0 ].iov_len ));
81108 ASSERT_EQ (0 , strncmp ((const char *)iov_in[1 ].iov_base , (const char *)iov_out[1 ].iov_base , iov_out[1 ].iov_len ));
82109
110+ // need new condition variables...
111+ writefinish.reset (new C_SaferCond (" test-nonblocking-writefinish" ));
112+ readfinish.reset (new C_SaferCond (" test-nonblocking-readfinish" ));
113+ ssize_t nwritten_a = iov_out_a[0 ].iov_len + iov_out_a[1 ].iov_len ;
114+
115+ rc = client->ll_preadv_pwritev (fh, iov_out_a, 2 , 100 , true , writefinish.get (), nullptr );
116+ ASSERT_EQ (0 , rc);
117+ rc = writefinish->wait ();
118+ ASSERT_EQ (nwritten_a, rc);
119+
120+ rc = client->ll_preadv_pwritev (fh, iov_in_a, 2 , 100 , false , readfinish.get (), &bl);
121+ ASSERT_EQ (0 , rc);
122+ rc = readfinish.get ()->wait ();
123+ ASSERT_EQ (nwritten_a, rc);
124+ copy_bufferlist_to_iovec (iov_in_a, 2 , &bl, rc);
125+
126+ ASSERT_EQ (0 , strncmp ((const char *)iov_in_a[0 ].iov_base , (const char *)iov_out_a[0 ].iov_base , iov_out_a[0 ].iov_len ));
127+ ASSERT_EQ (0 , strncmp ((const char *)iov_in_a[1 ].iov_base , (const char *)iov_out_a[1 ].iov_base , iov_out_a[1 ].iov_len ));
128+
129+ // need new condition variables...
130+ writefinish.reset (new C_SaferCond (" test-nonblocking-writefinish" ));
131+ readfinish.reset (new C_SaferCond (" test-nonblocking-readfinish" ));
132+ ssize_t nwritten_b = iov_out_b[0 ].iov_len + iov_out_b[1 ].iov_len ;
133+
134+ rc = client->ll_preadv_pwritev (fh, iov_out_b, 2 , 1000 , true , writefinish.get (), nullptr , true , false );
135+ ASSERT_EQ (0 , rc);
136+ rc = writefinish->wait ();
137+ ASSERT_EQ (nwritten_b, rc);
138+
139+ rc = client->ll_preadv_pwritev (fh, iov_in_b, 2 , 1000 , false , readfinish.get (), &bl);
140+ ASSERT_EQ (0 , rc);
141+ rc = readfinish.get ()->wait ();
142+ ASSERT_EQ (nwritten_b, rc);
143+ copy_bufferlist_to_iovec (iov_in_b, 2 , &bl, rc);
144+
145+ ASSERT_EQ (0 , strncmp ((const char *)iov_in_b[0 ].iov_base , (const char *)iov_out_b[0 ].iov_base , iov_out_b[0 ].iov_len ));
146+ ASSERT_EQ (0 , strncmp ((const char *)iov_in_b[1 ].iov_base , (const char *)iov_out_b[1 ].iov_base , iov_out_b[1 ].iov_len ));
147+
83148 client->ll_release (fh);
84149 ASSERT_EQ (0 , client->ll_unlink (root, filename, myperm));
85150}
0 commit comments