@@ -82,8 +82,11 @@ class FastDiscreteDistribution final : public Distribution {
82
82
size_t right,
83
83
std::vector<size_t > sizes,
84
84
std::vector<double > probs,
85
+ bool useLegacyKeyGen,
85
86
size_t numBuckets = 2048 )
86
- : leftOffset_(left), rightOffset_(right) {
87
+ : leftOffset_(left),
88
+ rightOffset_ (right),
89
+ useLegacyKeyGen_(useLegacyKeyGen) {
87
90
double totalWeight = std::accumulate (probs.begin (), probs.end (), 0.0 );
88
91
double totalObjects = std::accumulate (sizes.begin (), sizes.end (), 0.0 );
89
92
bucketWeight_ = totalWeight / numBuckets;
@@ -113,15 +116,25 @@ class FastDiscreteDistribution final : public Distribution {
113
116
// Determine bucket size. In doing so, take max against 1
114
117
// before and after scaling to account for scaling factors
115
118
objectsSeen = std::max (1UL , objectsSeen);
116
- auto scaledObjects =
117
- static_cast <uint64_t >(objectsSeen * scalingFactor_);
118
- buckets.push_back (std::max (1UL , scaledObjects));
119
- DCHECK_LE (bucketOffsets_.back () + buckets.back (), rightOffset_);
120
-
121
- // determine the offset for next bucket
122
- auto nextOffset = static_cast <uint64_t >(sumObjects * scalingFactor_);
123
- bucketOffsets_.push_back (nextOffset);
124
- DCHECK_LE (nextOffset, rightOffset_);
119
+
120
+ if (useLegacyKeyGen_) {
121
+ buckets.push_back (std::max (1UL , objectsSeen));
122
+ DCHECK_LE (bucketOffsets_.back () + buckets.back (), rightOffset_);
123
+
124
+ bucketOffsets_.push_back (sumObjects);
125
+ DCHECK_LE (sumObjects, rightOffset_);
126
+ } else {
127
+ auto scaledObjects =
128
+ static_cast <uint64_t >(objectsSeen * scalingFactor_);
129
+ buckets.push_back (std::max (1UL , scaledObjects));
130
+ DCHECK_LE (bucketOffsets_.back () + buckets.back (), rightOffset_);
131
+
132
+ // determine the offset for next bucket
133
+ auto nextOffset = static_cast <uint64_t >(sumObjects * scalingFactor_);
134
+ bucketOffsets_.push_back (nextOffset);
135
+ DCHECK_LE (nextOffset, rightOffset_);
136
+ }
137
+
125
138
weightSeen = 0.0 ;
126
139
objectsSeen = 0 ;
127
140
} else {
@@ -147,8 +160,9 @@ class FastDiscreteDistribution final : public Distribution {
147
160
size_t bucket = bucketDistribution_ (gen);
148
161
size_t objectInBucket = facebook::cachelib::util::narrow_cast<size_t >(
149
162
insideBucketDistributions_[bucket](gen));
163
+ auto multiplier = useLegacyKeyGen_ ? scalingFactor_ : 1 ;
150
164
auto ret = facebook::cachelib::util::narrow_cast<size_t >(
151
- (bucketOffsets_[bucket] + objectInBucket)) +
165
+ (multiplier * ( bucketOffsets_[bucket] + objectInBucket) )) +
152
166
leftOffset_;
153
167
XDCHECK_LE (ret, rightOffset_);
154
168
XDCHECK_GE (ret, leftOffset_);
@@ -169,6 +183,7 @@ class FastDiscreteDistribution final : public Distribution {
169
183
std::vector<uint64_t > bucketOffsets_{};
170
184
const size_t leftOffset_{};
171
185
const size_t rightOffset_{};
186
+ bool useLegacyKeyGen_{false };
172
187
double scalingFactor_{};
173
188
double bucketWeight_{};
174
189
std::uniform_int_distribution<uint64_t > bucketDistribution_{};
0 commit comments