@@ -54,6 +54,7 @@ extern "C" {
5454ABSL_DECLARE_FLAG (int32_t , list_max_listpack_size);
5555ABSL_DECLARE_FLAG (int32_t , list_compress_depth);
5656ABSL_DECLARE_FLAG (uint32_t , dbnum);
57+ ABSL_DECLARE_FLAG (bool , rdb_sbf_chunked);
5758ABSL_FLAG (bool , rdb_load_dry_run, false , " Dry run RDB load without applying changes" );
5859ABSL_FLAG (bool , rdb_ignore_expiry, false , " Ignore Key Expiry when loding from RDB snapshot" );
5960
@@ -188,7 +189,7 @@ string ModuleTypeName(uint64_t module_id) {
188189bool RdbTypeAllowedEmpty (int type) {
189190 return type == RDB_TYPE_STRING || type == RDB_TYPE_JSON || type == RDB_TYPE_SBF ||
190191 type == RDB_TYPE_STREAM_LISTPACKS || type == RDB_TYPE_SET_WITH_EXPIRY ||
191- type == RDB_TYPE_HASH_WITH_EXPIRY;
192+ type == RDB_TYPE_HASH_WITH_EXPIRY || type == RDB_TYPE_SBF2 ;
192193}
193194
194195DbSlice& GetCurrentDbSlice () {
@@ -1316,6 +1317,9 @@ error_code RdbLoaderBase::ReadObj(int rdbtype, OpaqueObj* dest) {
13161317 case RDB_TYPE_SBF:
13171318 iores = ReadSBF ();
13181319 break ;
1320+ case RDB_TYPE_SBF2:
1321+ iores = ReadSBF2 ();
1322+ break ;
13191323 default :
13201324 LOG (ERROR) << " Unsupported rdb type " << rdbtype;
13211325
@@ -1851,7 +1855,7 @@ auto RdbLoaderBase::ReadRedisJson() -> io::Result<OpaqueObj> {
18511855 return OpaqueObj{std::move (dest), RDB_TYPE_JSON};
18521856}
18531857
1854- auto RdbLoaderBase::ReadSBF ( ) -> io::Result<OpaqueObj> {
1858+ auto RdbLoaderBase::ReadSBFImpl ( bool chunking ) -> io::Result<OpaqueObj> {
18551859 RdbSBF res;
18561860 uint64_t options;
18571861 SET_OR_UNEXPECT (LoadLen (nullptr ), options);
@@ -1875,20 +1879,24 @@ auto RdbLoaderBase::ReadSBF() -> io::Result<OpaqueObj> {
18751879 string filter_data;
18761880 SET_OR_UNEXPECT (LoadLen (nullptr ), hash_cnt);
18771881
1878- unsigned total_size = 0 ;
1879- SET_OR_UNEXPECT (LoadLen (nullptr ), total_size);
1882+ if (absl::GetFlag (FLAGS_rdb_sbf_chunked)) {
1883+ unsigned total_size = 0 ;
1884+ SET_OR_UNEXPECT (LoadLen (nullptr ), total_size);
18801885
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- }
1886+ filter_data.resize (total_size);
1887+ size_t offset = 0 ;
1888+ while (offset < total_size) {
1889+ unsigned chunk_size = 0 ;
1890+ SET_OR_UNEXPECT (LoadLen (nullptr ), chunk_size);
1891+ error_code ec = FetchBuf (chunk_size, filter_data.data () + offset);
1892+ if (ec) {
1893+ return make_unexpected (ec);
1894+ }
18901895
1891- offset += chunk_size;
1896+ offset += chunk_size;
1897+ }
1898+ } else {
1899+ SET_OR_UNEXPECT (FetchGenericString (), filter_data);
18921900 }
18931901
18941902 size_t bit_len = filter_data.size () * 8 ;
@@ -1900,6 +1908,15 @@ auto RdbLoaderBase::ReadSBF() -> io::Result<OpaqueObj> {
19001908 return OpaqueObj{std::move (res), RDB_TYPE_SBF};
19011909}
19021910
1911+
1912+ auto RdbLoaderBase::ReadSBF () -> io::Result<OpaqueObj> {
1913+ return ReadSBFImpl (false );
1914+ }
1915+
1916+ auto RdbLoaderBase::ReadSBF2 () -> io::Result<OpaqueObj> {
1917+ return ReadSBFImpl (true );
1918+ }
1919+
19031920template <typename T> io::Result<T> RdbLoaderBase::FetchInt () {
19041921 auto ec = EnsureRead (sizeof (T));
19051922 if (ec)
0 commit comments