@@ -29,6 +29,7 @@ extern "C" {
29
29
#include " base/flags.h"
30
30
#include " base/logging.h"
31
31
#include " core/bloom.h"
32
+ #include " core/intrusive_string_set.h"
32
33
#include " core/json/json_object.h"
33
34
#include " core/qlist.h"
34
35
#include " core/sorted_map.h"
@@ -57,6 +58,7 @@ ABSL_DECLARE_FLAG(int32_t, list_max_listpack_size);
57
58
ABSL_DECLARE_FLAG (int32_t , list_compress_depth);
58
59
ABSL_DECLARE_FLAG (uint32_t , dbnum);
59
60
ABSL_DECLARE_FLAG (bool , list_experimental_v2);
61
+ ABSL_DECLARE_FLAG (bool , stringset_experimental);
60
62
ABSL_FLAG (bool , rdb_load_dry_run, false , " Dry run RDB load without applying changes" );
61
63
ABSL_FLAG (bool , rdb_ignore_expiry, false , " Ignore Key Expiry when loding from RDB snapshot" );
62
64
@@ -410,7 +412,9 @@ void RdbLoaderBase::OpaqueObjLoader::CreateSet(const LoadTrace* ltrace) {
410
412
return ;
411
413
412
414
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);
414
418
}
415
419
std::move (cleanup).Cancel ();
416
420
}
@@ -877,14 +881,26 @@ void RdbLoaderBase::OpaqueObjLoader::HandleBlob(string_view blob) {
877
881
unsigned len = intsetLen (is);
878
882
879
883
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);
881
886
882
- if (!set) {
883
- LOG (ERROR) << " OOM in ConvertToStrSet " << len;
884
- ec_ = RdbError (errc::out_of_memory);
885
- return ;
887
+ if (!set) {
888
+ LOG (ERROR) << " OOM in ConvertToStrSet " << len;
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 " << len;
898
+ ec_ = RdbError (errc::out_of_memory);
899
+ return ;
900
+ }
901
+ pv_->InitRobj (OBJ_SET, kEncodingIntrusiveSet , set);
886
902
}
887
- pv_-> InitRobj (OBJ_SET, kEncodingStrMap2 , set);
903
+
888
904
} else {
889
905
intset* mine = (intset*)zmalloc (blob.size ());
890
906
::memcpy (mine, blob.data(), blob.size());
@@ -898,21 +914,39 @@ void RdbLoaderBase::OpaqueObjLoader::HandleBlob(string_view blob) {
898
914
}
899
915
900
916
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 " << elem;
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 " << elem;
924
+ ec_ = RdbError (errc::duplicate_key);
925
+ break ;
926
+ }
909
927
}
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 " << elem;
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);
910
949
}
911
- if (ec_) {
912
- CompactObj::DeleteMR<StringSet>(set);
913
- return ;
914
- }
915
- pv_->InitRobj (OBJ_SET, kEncodingStrMap2 , set);
916
950
} else if (rdb_type_ == RDB_TYPE_HASH_ZIPLIST || rdb_type_ == RDB_TYPE_HASH_LISTPACK) {
917
951
unsigned char * lp = lpNew (blob.size ());
918
952
switch (rdb_type_) {
0 commit comments