@@ -29,6 +29,7 @@ extern "C" {
2929#include  " base/flags.h" 
3030#include  " base/logging.h" 
3131#include  " core/bloom.h" 
32+ #include  " core/intrusive_string_set.h" 
3233#include  " core/json/json_object.h" 
3334#include  " core/qlist.h" 
3435#include  " core/sorted_map.h" 
@@ -57,6 +58,7 @@ ABSL_DECLARE_FLAG(int32_t, list_max_listpack_size);
5758ABSL_DECLARE_FLAG (int32_t , list_compress_depth);
5859ABSL_DECLARE_FLAG (uint32_t , dbnum);
5960ABSL_DECLARE_FLAG (bool , list_experimental_v2);
61+ ABSL_DECLARE_FLAG (bool , stringset_experimental);
6062ABSL_FLAG (bool , rdb_load_dry_run, false , " Dry run RDB load without applying changes" 
6163ABSL_FLAG (bool , rdb_ignore_expiry, false , " Ignore Key Expiry when loding from RDB snapshot" 
6264
@@ -410,7 +412,9 @@ void RdbLoaderBase::OpaqueObjLoader::CreateSet(const LoadTrace* ltrace) {
410412    return ;
411413
412414  if  (!config_.append ) {
413-     pv_->InitRobj (OBJ_SET, is_intset ? kEncodingIntSet  : kEncodingStrMap2 , inner_obj);
415+     int  str_set_encoding =
416+         absl::GetFlag (FLAGS_stringset_experimental) ? kEncodingIntrusiveSet  : kEncodingStrMap2 ;
417+     pv_->InitRobj (OBJ_SET, is_intset ? kEncodingIntSet  : str_set_encoding, inner_obj);
414418  }
415419  std::move (cleanup).Cancel ();
416420}
@@ -877,14 +881,26 @@ void RdbLoaderBase::OpaqueObjLoader::HandleBlob(string_view blob) {
877881    unsigned  len = intsetLen (is);
878882
879883    if  (len > SetFamily::MaxIntsetEntries ()) {
880-       StringSet* set = SetFamily::ConvertToStrSet (is, len);
884+       if  (!absl::GetFlag (FLAGS_stringset_experimental)) {
885+         StringSet* set = SetFamily::ConvertToStrSet (is, len);
881886
882-       if  (!set) {
883-         LOG (ERROR) << " OOM in ConvertToStrSet " 
884-         ec_ = RdbError (errc::out_of_memory);
885-         return ;
887+         if  (!set) {
888+           LOG (ERROR) << " OOM in ConvertToStrSet " 
889+           ec_ = RdbError (errc::out_of_memory);
890+           return ;
891+         }
892+         pv_->InitRobj (OBJ_SET, kEncodingStrMap2 , set);
893+       } else  {
894+         IntrusiveStringSet* set = SetFamily::ConvertToIntrStrSet (is, len);
895+ 
896+         if  (!set) {
897+           LOG (ERROR) << " OOM in ConvertToStrSet " 
898+           ec_ = RdbError (errc::out_of_memory);
899+           return ;
900+         }
901+         pv_->InitRobj (OBJ_SET, kEncodingIntrusiveSet , set);
886902      }
887-       pv_-> InitRobj (OBJ_SET,  kEncodingStrMap2 , set); 
903+ 
888904    } else  {
889905      intset* mine = (intset*)zmalloc (blob.size ());
890906      ::memcpy (mine, blob.data(), blob.size());
@@ -898,21 +914,39 @@ void RdbLoaderBase::OpaqueObjLoader::HandleBlob(string_view blob) {
898914    }
899915
900916    unsigned  char * lp = (unsigned  char *)blob.data ();
901-     StringSet* set = CompactObj::AllocateMR<StringSet>();
902-     for  (unsigned  char * cur = lpFirst (lp); cur != nullptr ; cur = lpNext (lp, cur)) {
903-       unsigned  char  field_buf[LP_INTBUF_SIZE];
904-       string_view elem = container_utils::LpGetView (cur, field_buf);
905-       if  (!set->Add (elem)) {
906-         LOG (ERROR) << " Duplicate member " 
907-         ec_ = RdbError (errc::duplicate_key);
908-         break ;
917+     if  (!absl::GetFlag (FLAGS_stringset_experimental)) {
918+       StringSet* set = CompactObj::AllocateMR<StringSet>();
919+       for  (unsigned  char * cur = lpFirst (lp); cur != nullptr ; cur = lpNext (lp, cur)) {
920+         unsigned  char  field_buf[LP_INTBUF_SIZE];
921+         string_view elem = container_utils::LpGetView (cur, field_buf);
922+         if  (!set->Add (elem)) {
923+           LOG (ERROR) << " Duplicate member " 
924+           ec_ = RdbError (errc::duplicate_key);
925+           break ;
926+         }
909927      }
928+       if  (ec_) {
929+         CompactObj::DeleteMR<StringSet>(set);
930+         return ;
931+       }
932+       pv_->InitRobj (OBJ_SET, kEncodingStrMap2 , set);
933+     } else  {
934+       IntrusiveStringSet* set = CompactObj::AllocateMR<IntrusiveStringSet>();
935+       for  (unsigned  char * cur = lpFirst (lp); cur != nullptr ; cur = lpNext (lp, cur)) {
936+         unsigned  char  field_buf[LP_INTBUF_SIZE];
937+         string_view elem = container_utils::LpGetView (cur, field_buf);
938+         if  (!set->Add (elem)) {
939+           LOG (ERROR) << " Duplicate member " 
940+           ec_ = RdbError (errc::duplicate_key);
941+           break ;
942+         }
943+       }
944+       if  (ec_) {
945+         CompactObj::DeleteMR<IntrusiveStringSet>(set);
946+         return ;
947+       }
948+       pv_->InitRobj (OBJ_SET, kEncodingIntrusiveSet , set);
910949    }
911-     if  (ec_) {
912-       CompactObj::DeleteMR<StringSet>(set);
913-       return ;
914-     }
915-     pv_->InitRobj (OBJ_SET, kEncodingStrMap2 , set);
916950  } else  if  (rdb_type_ == RDB_TYPE_HASH_ZIPLIST || rdb_type_ == RDB_TYPE_HASH_LISTPACK) {
917951    unsigned  char * lp = lpNew (blob.size ());
918952    switch  (rdb_type_) {
0 commit comments