@@ -175,8 +175,10 @@ using ClusterSlotUpdateCallBackSharedPtr = std::shared_ptr<ClusterSlotUpdateCall
175175 * This factory is created and returned by RedisCluster's factory() method, the create() method will
176176 * be called on each thread to create a thread local RedisClusterLoadBalancer.
177177 */
178- class RedisClusterLoadBalancerFactory : public ClusterSlotUpdateCallBack ,
179- public Upstream::LoadBalancerFactory {
178+ class RedisClusterLoadBalancerFactory
179+ : public ClusterSlotUpdateCallBack,
180+ public Upstream::LoadBalancerFactory,
181+ public std::enable_shared_from_this<RedisClusterLoadBalancerFactory> {
180182public:
181183 RedisClusterLoadBalancerFactory (Random::RandomGenerator& random) : random_(random) {}
182184
@@ -186,7 +188,8 @@ class RedisClusterLoadBalancerFactory : public ClusterSlotUpdateCallBack,
186188 void onHostHealthUpdate () override ;
187189
188190 // Upstream::LoadBalancerFactory
189- Upstream::LoadBalancerPtr create (Upstream::LoadBalancerParams) override ;
191+ Upstream::LoadBalancerPtr create (Upstream::LoadBalancerParams params) override ;
192+ bool recreateOnHostChange () const override { return false ; }
190193
191194private:
192195 class RedisShard {
@@ -267,10 +270,8 @@ class RedisClusterLoadBalancerFactory : public ClusterSlotUpdateCallBack,
267270 */
268271 class RedisClusterLoadBalancer : public Upstream ::LoadBalancer {
269272 public:
270- RedisClusterLoadBalancer (SlotArraySharedPtr slot_array, ShardVectorSharedPtr shard_vector,
271- Random::RandomGenerator& random)
272- : slot_array_(std::move(slot_array)), shard_vector_(std::move(shard_vector)),
273- random_ (random) {}
273+ RedisClusterLoadBalancer (std::shared_ptr<RedisClusterLoadBalancerFactory> factory,
274+ const Upstream::PrioritySet& priority_set);
274275
275276 // Upstream::LoadBalancerBase
276277 Upstream::HostSelectionResponse chooseHost (Upstream::LoadBalancerContext*) override ;
@@ -290,9 +291,14 @@ class RedisClusterLoadBalancerFactory : public ClusterSlotUpdateCallBack,
290291 }
291292
292293 private:
293- const SlotArraySharedPtr slot_array_;
294- const ShardVectorSharedPtr shard_vector_;
294+ // Re-snapshots the topology from the parent factory under its mutex.
295+ void refresh ();
296+
297+ const std::shared_ptr<RedisClusterLoadBalancerFactory> factory_;
298+ SlotArraySharedPtr slot_array_;
299+ ShardVectorSharedPtr shard_vector_;
295300 Random::RandomGenerator& random_;
301+ ::Envoy::Common::CallbackHandlePtr member_update_cb_;
296302 };
297303
298304 absl::Mutex mutex_;
0 commit comments