|
21 | 21 | #include <gtest/gtest.h> |
22 | 22 |
|
23 | 23 | #include <memory> |
| 24 | +#include <random> |
24 | 25 |
|
25 | 26 | #include "test_base.h" |
26 | 27 | #include "types/redis_bloom_chain.h" |
@@ -111,3 +112,36 @@ TEST_F(RedisBloomChainTest, DuplicateInsert) { |
111 | 112 | s = sb_chain_->MAdd(*ctx_, key_, arrays, &results); |
112 | 113 | EXPECT_TRUE(s.ok()); |
113 | 114 | } |
| 115 | + |
| 116 | +TEST_F(RedisBloomChainTest, MultiThreadInsert) { |
| 117 | + // Concurrent insert, every task would insert 100 random values |
| 118 | + std::mutex mu; |
| 119 | + |
| 120 | + std::default_random_engine gen(42); |
| 121 | + std::uniform_int_distribution<uint32_t> dist; |
| 122 | + auto insert_task = [&]() { |
| 123 | + // Generate 100 random keys |
| 124 | + std::vector<std::string> arrays; |
| 125 | + for (size_t idx = 0; idx < 100; ++idx) { |
| 126 | + arrays.push_back("itemx" + std::to_string(dist(gen))); |
| 127 | + } |
| 128 | + engine::Context ctx(storage_.get()); |
| 129 | + // Call madd |
| 130 | + std::vector<redis::BloomFilterAddResult> results; |
| 131 | + results.resize(arrays.size()); |
| 132 | + auto s = sb_chain_->MAdd(ctx, key_, arrays, &results); |
| 133 | + EXPECT_TRUE(s.ok()); |
| 134 | + }; |
| 135 | + |
| 136 | + std::vector<std::thread> threads; |
| 137 | + threads.reserve(10); |
| 138 | + for (int32_t thread_idx = 0; thread_idx < 10; ++thread_idx) { |
| 139 | + threads.emplace_back([&]() { |
| 140 | + std::lock_guard<std::mutex> lock(mu); |
| 141 | + insert_task(); |
| 142 | + }); |
| 143 | + } |
| 144 | + for (auto& thread : threads) { |
| 145 | + thread.join(); |
| 146 | + } |
| 147 | +} |
0 commit comments