File tree Expand file tree Collapse file tree 3 files changed +29
-5
lines changed Expand file tree Collapse file tree 3 files changed +29
-5
lines changed Original file line number Diff line number Diff line change @@ -1874,7 +1874,23 @@ auto RdbLoaderBase::ReadSBF() -> io::Result<OpaqueObj> {
18741874 unsigned hash_cnt;
18751875 string filter_data;
18761876 SET_OR_UNEXPECT (LoadLen (nullptr ), hash_cnt);
1877- SET_OR_UNEXPECT (FetchGenericString (), filter_data);
1877+
1878+ unsigned total_size = 0 ;
1879+ SET_OR_UNEXPECT (LoadLen (nullptr ), total_size);
1880+
1881+ filter_data.resize (total_size);
1882+ size_t offset = 0 ;
1883+ while (offset < total_size) {
1884+ unsigned chunk_size = 0 ;
1885+ SET_OR_UNEXPECT (LoadLen (nullptr ), chunk_size);
1886+ error_code ec = FetchBuf (chunk_size, filter_data.data () + offset);
1887+ if (ec) {
1888+ return make_unexpected (ec);
1889+ }
1890+
1891+ offset += chunk_size;
1892+ }
1893+
18781894 size_t bit_len = filter_data.size () * 8 ;
18791895 if (!is_power2 (bit_len)) { // must be power of two
18801896 return Unexpected (errc::rdb_file_corrupted);
Original file line number Diff line number Diff line change @@ -623,11 +623,17 @@ std::error_code RdbSerializer::SaveSBFObject(const PrimeValue& pv) {
623623 RETURN_ON_ERR (SaveLen (sbf->hashfunc_cnt (i)));
624624
625625 string_view blob = sbf->data (i);
626- RETURN_ON_ERR (SaveString (blob));
627- FlushState flush_state = FlushState::kFlushMidEntry ;
628- if ((i + 1 ) == sbf->num_filters ())
629- flush_state = FlushState::kFlushEndEntry ;
626+ size_t num_chunks = (blob.size () + kFilterChunkSize - 1 ) / kFilterChunkSize ;
627+ RETURN_ON_ERR (SaveLen (blob.size ()));
630628
629+ for (size_t chunk_idx = 0 ; chunk_idx < num_chunks; ++chunk_idx) {
630+ size_t offset = chunk_idx * kFilterChunkSize ;
631+ size_t chunk_len = std::min (kFilterChunkSize , blob.size () - offset);
632+ RETURN_ON_ERR (SaveString (blob.substr (offset, chunk_len)));
633+ }
634+
635+ FlushState flush_state =
636+ (i + 1 == sbf->num_filters ()) ? FlushState::kFlushEndEntry : FlushState::kFlushMidEntry ;
631637 FlushIfNeeded (flush_state);
632638 }
633639
Original file line number Diff line number Diff line change @@ -20,6 +20,8 @@ extern "C" {
2020#include " server/journal/types.h"
2121#include " server/table.h"
2222
23+ constexpr size_t kFilterChunkSize = 1ULL << 26 ;
24+
2325typedef struct rax rax;
2426typedef struct streamCG streamCG;
2527typedef struct quicklistNode quicklistNode;
You can’t perform that action at this time.
0 commit comments