2121#include < gtest/gtest.h>
2222
2323#include < memory>
24+ #include < random>
2425
2526#include " test_base.h"
2627#include " types/redis_bloom_chain.h"
@@ -111,3 +112,36 @@ TEST_F(RedisBloomChainTest, DuplicateInsert) {
111112 s = sb_chain_->MAdd (*ctx_, key_, arrays, &results);
112113 EXPECT_TRUE (s.ok ());
113114}
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