正在查看: 逼多多 v3.6.2 应用的 GracefulSwitchLoadBalancer.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 逼多多 v3.6.2 应用的 GracefulSwitchLoadBalancer.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package io.grpc.util;
import io.grpc.ConnectivityState;
import io.grpc.ConnectivityStateInfo;
import io.grpc.ExperimentalApi;
import io.grpc.LoadBalancer;
import io.grpc.Status;
import q.l;
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/5999")
public final class GracefulSwitchLoadBalancer extends ForwardingLoadBalancer {
static final LoadBalancer.SubchannelPicker BUFFER_PICKER = new LoadBalancer.SubchannelPicker() {
@Override
public LoadBalancer.PickResult pickSubchannel(LoadBalancer.PickSubchannelArgs pickSubchannelArgs) {
return LoadBalancer.PickResult.withNoResult();
}
public String toString() {
return "BUFFER_PICKER";
}
};
private LoadBalancer.Factory currentBalancerFactory;
private LoadBalancer currentLb;
private boolean currentLbIsReady;
private final LoadBalancer defaultBalancer;
private final LoadBalancer.Helper helper;
private LoadBalancer.Factory pendingBalancerFactory;
private LoadBalancer pendingLb;
private LoadBalancer.SubchannelPicker pendingPicker;
private ConnectivityState pendingState;
class C1PendingHelper extends ForwardingLoadBalancerHelper {
LoadBalancer lb;
C1PendingHelper() {
}
@Override
protected LoadBalancer.Helper delegate() {
return GracefulSwitchLoadBalancer.this.helper;
}
@Override
public void updateBalancingState(ConnectivityState connectivityState, LoadBalancer.SubchannelPicker subchannelPicker) {
if (this.lb == GracefulSwitchLoadBalancer.this.pendingLb) {
l.u(GracefulSwitchLoadBalancer.this.currentLbIsReady, "there's pending lb while current lb has been out of READY");
GracefulSwitchLoadBalancer.this.pendingState = connectivityState;
GracefulSwitchLoadBalancer.this.pendingPicker = subchannelPicker;
if (connectivityState == ConnectivityState.READY) {
GracefulSwitchLoadBalancer.this.swap();
return;
}
return;
}
if (this.lb == GracefulSwitchLoadBalancer.this.currentLb) {
GracefulSwitchLoadBalancer.this.currentLbIsReady = connectivityState == ConnectivityState.READY;
if (GracefulSwitchLoadBalancer.this.currentLbIsReady || GracefulSwitchLoadBalancer.this.pendingLb == GracefulSwitchLoadBalancer.this.defaultBalancer) {
GracefulSwitchLoadBalancer.this.helper.updateBalancingState(connectivityState, subchannelPicker);
} else {
GracefulSwitchLoadBalancer.this.swap();
}
}
}
}
public GracefulSwitchLoadBalancer(LoadBalancer.Helper helper) {
LoadBalancer loadBalancer = new LoadBalancer() {
@Override
public void handleNameResolutionError(Status status) {
GracefulSwitchLoadBalancer.this.helper.updateBalancingState(ConnectivityState.TRANSIENT_FAILURE, new LoadBalancer.FixedResultPicker(LoadBalancer.PickResult.withError(status)));
}
@Override
public void handleResolvedAddresses(LoadBalancer.ResolvedAddresses resolvedAddresses) {
throw new IllegalStateException("GracefulSwitchLoadBalancer must switch to a load balancing policy before handling ResolvedAddresses");
}
@Override
public void shutdown() {
}
};
this.defaultBalancer = loadBalancer;
this.currentLb = loadBalancer;
this.pendingLb = loadBalancer;
this.helper = (LoadBalancer.Helper) l.o(helper, "helper");
}
public void swap() {
this.helper.updateBalancingState(this.pendingState, this.pendingPicker);
this.currentLb.shutdown();
this.currentLb = this.pendingLb;
this.currentBalancerFactory = this.pendingBalancerFactory;
this.pendingLb = this.defaultBalancer;
this.pendingBalancerFactory = null;
}
@Override
protected LoadBalancer delegate() {
LoadBalancer loadBalancer = this.pendingLb;
return loadBalancer == this.defaultBalancer ? this.currentLb : loadBalancer;
}
public String delegateType() {
return delegate().getClass().getSimpleName();
}
@Override
@Deprecated
public void handleSubchannelState(LoadBalancer.Subchannel subchannel, ConnectivityStateInfo connectivityStateInfo) {
throw new UnsupportedOperationException("handleSubchannelState() is not supported by " + GracefulSwitchLoadBalancer.class.getName());
}
@Override
public void shutdown() {
this.pendingLb.shutdown();
this.currentLb.shutdown();
}
public void switchTo(LoadBalancer.Factory factory) {
l.o(factory, "newBalancerFactory");
if (factory.equals(this.pendingBalancerFactory)) {
return;
}
this.pendingLb.shutdown();
this.pendingLb = this.defaultBalancer;
this.pendingBalancerFactory = null;
this.pendingState = ConnectivityState.CONNECTING;
this.pendingPicker = BUFFER_PICKER;
if (factory.equals(this.currentBalancerFactory)) {
return;
}
C1PendingHelper c1PendingHelper = new C1PendingHelper();
LoadBalancer newLoadBalancer = factory.newLoadBalancer(c1PendingHelper);
c1PendingHelper.lb = newLoadBalancer;
this.pendingLb = newLoadBalancer;
this.pendingBalancerFactory = factory;
if (this.currentLbIsReady) {
return;
}
swap();
}
}