@@ -61,9 +61,9 @@ rocksdb::Status TopK::IncrBy(engine::Context &ctx, const Slice &user_key, const
6161
6262 std::vector<bool > is_dirty_buckets (topk_metadata.width * topk_metadata.depth , false );
6363 std::vector<bool > is_dirty_heaps (topk_metadata.top_k , false );
64- topk.Add (items.data_ , incr);
64+ topk.Add (items.data_ , incr, is_dirty_buckets, is_dirty_heaps );
6565
66- s = setTopkData (ctx, ns_key, topk_metadata, topk);
66+ s = setTopkData (ctx, ns_key, topk_metadata, topk, is_dirty_buckets, is_dirty_heaps );
6767 if (!s.ok ()) return s;
6868
6969 return storage_->Write (ctx, storage_->DefaultWriteOptions (), batch->GetWriteBatch ());
@@ -154,10 +154,6 @@ rocksdb::Status TopK::createTopK(engine::Context &ctx, const Slice &ns_key, uint
154154rocksdb::Status TopK::getTopKData (engine::Context &ctx, const Slice &ns_key, const TopKMetadata &metadata,
155155 BlockSplitTopK *topk) {
156156 for (uint8_t i = 0 ; i < 3 ; i++) {
157- std::string tk_key = getTKKey (ns_key, metadata, i);
158- rocksdb::PinnableSlice pinnable_value;
159- rocksdb::Status s = storage_->Get (ctx, ctx.GetReadOptions (), tk_key, &pinnable_value);
160- if (!s.ok ()) return s;
161157 if (i == 0 ) {
162158 // get buckets of topk structure
163159 for (uint32_t j = 0 ; j < metadata.width * metadata.depth ; j++) {
@@ -166,13 +162,13 @@ rocksdb::Status TopK::getTopKData(engine::Context &ctx, const Slice &ns_key, con
166162 rocksdb::PinnableSlice bk_value;
167163 rocksdb::Status s = storage_->Get (ctx, ctx.GetReadOptions (), bk_key, &bk_value);
168164 if (!s.ok ()) return s;
169-
170- int dep = j / metadata.width ;
171- int wid = j % metadata.width ;
165+
166+ uint32_t dep = j / metadata.width ;
167+ uint32_t wid = j % metadata.width ;
172168 if (k == 0 ) {
173- topk->buckets [dep][wid].fp = static_cast <uint32_t >(std::stoul (pinnable_value .data ()));
169+ topk->buckets [dep][wid].fp = static_cast <uint32_t >(std::stoul (bk_value .data ()));
174170 } else {
175- topk->buckets [dep][wid].count = static_cast <uint32_t >(std::stoul (pinnable_value .data ()));
171+ topk->buckets [dep][wid].count = static_cast <uint32_t >(std::stoul (bk_value .data ()));
176172 }
177173 }
178174 }
@@ -186,23 +182,27 @@ rocksdb::Status TopK::getTopKData(engine::Context &ctx, const Slice &ns_key, con
186182 if (!s.ok ()) return s;
187183
188184 if (k == 0 ) {
189- topk->heap [j].count = static_cast <uint32_t >(std::stoul (pinnable_value .data ()));
185+ topk->heap [j].count = static_cast <uint32_t >(std::stoul (hb_value .data ()));
190186 } else if (k == 1 ) {
191- topk->heap [j].fp = static_cast <uint32_t >(std::stoul (pinnable_value .data ()));
187+ topk->heap [j].fp = static_cast <uint32_t >(std::stoul (hb_value .data ()));
192188 } else {
193189 topk->heap [j].item = hb_value.data ();
194190 }
195191 }
196192 }
197193 } else {
194+ std::string tk_key = getTKKey (ns_key, metadata, i);
195+ rocksdb::PinnableSlice pinnable_value;
196+ rocksdb::Status s = storage_->Get (ctx, ctx.GetReadOptions (), tk_key, &pinnable_value);
197+ if (!s.ok ()) return s;
198198 topk->heap_size = static_cast <int >(std::stoul (pinnable_value.data ()));
199199 }
200200 }
201201 return rocksdb::Status::OK ();
202202}
203203
204204rocksdb::Status TopK::setTopkData (engine::Context &ctx, const Slice &ns_key, const TopKMetadata &metadata,
205- const BlockSplitTopK &topk, const std::vector<bool > &is_dirty_buckets,
205+ const BlockSplitTopK &topk, const std::vector<bool > &is_dirty_buckets,
206206 const std::vector<bool > &is_dirty_heaps) {
207207 auto batch = storage_->GetWriteBatchBase ();
208208
@@ -215,8 +215,8 @@ rocksdb::Status TopK::setTopkData(engine::Context &ctx, const Slice &ns_key, con
215215 for (uint32_t k = 0 ; k < 2 ; k++) {
216216 std::string sub_key = getSubKey (ns_key, metadata, i, j, k);
217217 std::string sub_value;
218- int dep = j / metadata.width ;
219- int wid = j % metadata.width ;
218+ uint32_t dep = j / metadata.width ;
219+ uint32_t wid = j % metadata.width ;
220220 if (k == 0 ) {
221221 sub_value = std::to_string (topk.buckets [dep][wid].fp );
222222 } else {
@@ -264,7 +264,8 @@ std::string TopK::getTKKey(const Slice &ns_key, const TopKMetadata &metadata, ui
264264 return bf_key;
265265}
266266
267- std::string TopK::getSubKey (const Slice &ns_key, const TopKMetadata &metadata, uint8_t topk_index, uint32_t sub_index, uint8_t index) {
267+ std::string TopK::getSubKey (const Slice &ns_key, const TopKMetadata &metadata, uint8_t topk_index, uint32_t sub_index,
268+ uint8_t index) {
268269 std::string sub_key;
269270 PutFixed8 (&sub_key, topk_index);
270271 PutFixed32 (&sub_key, sub_index);
0 commit comments