1010
1111static size_t INITIAL_ELEMENTS = 256 ;
1212
13- template <typename WriteF, typename ReadF>
14- static void
15- parallel_write_read (WriteF writer, std::vector<ReadF> &readers,
16- size_t n_readers)
17- {
18- parallel_exec (n_readers + 1 , [&](size_t thread_id) {
19- if (thread_id == 0 ) {
20- writer ();
21- } else {
22- readers[(thread_id - 1 ) % readers.size ()]();
23- }
24- });
25- }
26-
27- template <typename Container>
28- static void
29- init_container (nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
30- {
31- nvobj::transaction::run (
32- pop, [&] { ptr = nvobj::make_persistent<Container>(); });
33-
34- for (size_t i = 0 ; i < INITIAL_ELEMENTS; ++i) {
35- ptr->emplace (key<Container>(i), value<Container>(i));
36- }
37- }
38-
3913template <typename Container>
4014static void
4115test_write_find (nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
4216{
43- const size_t threads = 16 ;
17+ size_t threads = 8 ;
18+ if (On_drd)
19+ threads = 2 ;
20+
4421 const size_t batch_size = INITIAL_ELEMENTS / threads;
4522
46- init_container (pop, ptr);
23+ init_container (pop, ptr, INITIAL_ELEMENTS );
4724
4825 auto writer = [&]() {
4926 for (size_t i = INITIAL_ELEMENTS; i < INITIAL_ELEMENTS * 2 ;
@@ -70,91 +47,20 @@ test_write_find(nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
7047
7148 nvobj::transaction::run (
7249 pop, [&] { nvobj::delete_persistent<Container>(ptr); });
73- }
74-
75- // XXX: For now, we cannot concurrently read and overwrite values
76- #if FALSE
77- template <typename Container>
78- static void
79- test_overwrite_find (nvobj::pool<root> &pop,
80- nvobj::persistent_ptr<Container> &ptr)
81- {
82- const size_t threads = 16 ;
83-
84- init_container (pop, ptr);
85-
86- auto writer = [&]() {
87- for (size_t i = 0 ; i < INITIAL_ELEMENTS; ++i) {
88- ptr->insert_or_assign (key<Container>(i),
89- value<Container>(i + 1 ));
90- }
91- };
92-
93- auto readers = std::vector<std::function<void ()>>{
94- [&]() {
95- for (size_t i = 0 ; i < INITIAL_ELEMENTS; ++i) {
96- auto res = ptr->find (key<Container>(i));
97- UT_ASSERT (res != ptr->end ());
98- UT_ASSERT (res->value () == value<Container>(i) ||
99- res->value () ==
100- value<Container>(i + 1 ));
101- }
102- },
103- };
10450
105- parallel_write_read (writer, readers, threads);
106-
107- nvobj::transaction::run (
108- pop, [&] { nvobj::delete_persistent<Container>(ptr); });
109- }
110-
111- static void
112- test_overwrite_bigger_size_find (
113- nvobj::pool<root> &pop,
114- nvobj::persistent_ptr<container_int_string> &ptr)
115- {
116- const size_t threads = 16 ;
117- const std::string new_val = std::string (100 , ' a' );
118-
119- init_container (pop, ptr);
120-
121- auto writer = [&]() {
122- for (size_t i = 0 ; i < INITIAL_ELEMENTS; ++i) {
123- ptr->insert_or_assign (key<container_int_string>(i),
124- new_val);
125- }
126- };
127-
128- auto readers = std::vector<std::function<void ()>>{
129- [&]() {
130- for (size_t i = 0 ; i < INITIAL_ELEMENTS; ++i) {
131- auto res =
132- ptr->find (key<container_int_string>(i));
133- UT_ASSERT (res != ptr->end ());
134- UT_ASSERT (res->value () ==
135- value<container_int_string>(
136- i) ||
137- res->value () == new_val);
138- }
139- },
140- };
141-
142- parallel_write_read (writer, readers, threads);
143-
144- nvobj::transaction::run (pop, [&] {
145- nvobj::delete_persistent<container_int_string>(ptr);
146- });
51+ UT_ASSERTeq (num_allocs (pop), 0 );
14752}
148- #endif
14953
15054template <typename Container>
15155static void
15256test_various_readers (nvobj::pool<root> &pop,
15357 nvobj::persistent_ptr<Container> &ptr)
15458{
155- const size_t threads = 12 ;
59+ size_t threads = 16 ;
60+ if (On_drd)
61+ threads = 4 ;
15662
157- init_container (pop, ptr);
63+ init_container (pop, ptr, INITIAL_ELEMENTS );
15864
15965 auto writer = [&]() {
16066 /* writer thread does nothing in this test */
@@ -189,6 +95,8 @@ test_various_readers(nvobj::pool<root> &pop,
18995
19096 nvobj::transaction::run (
19197 pop, [&] { nvobj::delete_persistent<Container>(ptr); });
98+
99+ UT_ASSERTeq (num_allocs (pop), 0 );
192100}
193101
194102static void
@@ -210,28 +118,17 @@ test(int argc, char *argv[])
210118 }
211119
212120 test_write_find (pop, pop.root ()->radix_int_int );
213- // test_overwrite_find(pop, pop.root()->radix_int_int);
214121 /* this test only works with int as a value type */
215122 test_various_readers (pop, pop.root ()->radix_int_int );
216123
217- test_write_find (pop, pop.root ()->radix_int );
218- // test_overwrite_find(pop, pop.root()->radix_int);
219-
220- test_write_find (pop, pop.root ()->radix_int_str );
221- // test_overwrite_find(pop, pop.root()->radix_int_str);
222- // test_overwrite_bigger_size_find(pop, pop.root()->radix_int_str);
223-
224- test_write_find (pop, pop.root ()->radix_str );
225- // test_overwrite_find(pop, pop.root()->radix_str);
226-
227- test_write_find (pop, pop.root ()->radix_inline_s_wchart_wchart );
228- // test_overwrite_find(pop, pop.root()->radix_inline_s_wchart_wchart);
229-
230- test_write_find (pop, pop.root ()->radix_inline_s_wchart );
231- // test_overwrite_find(pop, pop.root()->radix_inline_s_wchart);
232-
233- test_write_find (pop, pop.root ()->radix_inline_s_u8t );
234- // test_overwrite_find(pop, pop.root()->radix_inline_s_u8t);
124+ if (!On_drd) {
125+ test_write_find (pop, pop.root ()->radix_int );
126+ test_write_find (pop, pop.root ()->radix_int_str );
127+ test_write_find (pop, pop.root ()->radix_str );
128+ test_write_find (pop, pop.root ()->radix_inline_s_wchart_wchart );
129+ test_write_find (pop, pop.root ()->radix_inline_s_wchart );
130+ test_write_find (pop, pop.root ()->radix_inline_s_u8t );
131+ }
235132
236133 pop.close ();
237134}
0 commit comments