all: log picker when updating balancing state

Let `ManagedChannelImpl` log picker update when updating balancing state.
This commit is contained in:
ZHANG Dapeng 2020-01-28 09:55:04 -08:00 committed by GitHub
parent 14e63fea61
commit 1ed538f253
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 100 additions and 22 deletions

View File

@ -432,6 +432,11 @@ public final class AutoConfiguredLoadBalancerFactory {
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return PickResult.withNoResult(); return PickResult.withNoResult();
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(EmptyPicker.class).toString();
}
} }
private static final class FailingPicker extends SubchannelPicker { private static final class FailingPicker extends SubchannelPicker {

View File

@ -812,6 +812,13 @@ final class ManagedChannelImpl extends ManagedChannel implements
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return panicPickResult; return panicPickResult;
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(PanicSubchannelPicker.class)
.add("panicPickResult", panicPickResult)
.toString();
}
} }
updateSubchannelPicker(new PanicSubchannelPicker()); updateSubchannelPicker(new PanicSubchannelPicker());
@ -1146,7 +1153,8 @@ final class ManagedChannelImpl extends ManagedChannel implements
// It's not appropriate to report SHUTDOWN state from lb. // It's not appropriate to report SHUTDOWN state from lb.
// Ignore the case of newState == SHUTDOWN for now. // Ignore the case of newState == SHUTDOWN for now.
if (newState != SHUTDOWN) { if (newState != SHUTDOWN) {
channelLogger.log(ChannelLogLevel.INFO, "Entering {0} state", newState); channelLogger.log(
ChannelLogLevel.INFO, "Entering {0} state with picker: {1}", newState, newPicker);
channelStateManager.gotoState(newState); channelStateManager.gotoState(newState);
} }
} }

View File

@ -173,14 +173,23 @@ final class OobChannel extends ManagedChannel implements InternalInstrumented<Ch
} }
}; };
subchannelPicker = new SubchannelPicker() { final class OobSubchannelPicker extends SubchannelPicker {
final PickResult result = PickResult.withSubchannel(subchannelImpl); final PickResult result = PickResult.withSubchannel(subchannelImpl);
@Override @Override
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return result; return result;
} }
};
@Override
public String toString() {
return MoreObjects.toStringHelper(OobSubchannelPicker.class)
.add("result", result)
.toString();
}
}
subchannelPicker = new OobSubchannelPicker();
delayedTransport.reprocess(subchannelPicker); delayedTransport.reprocess(subchannelPicker);
} }
@ -253,14 +262,23 @@ final class OobChannel extends ManagedChannel implements InternalInstrumented<Ch
delayedTransport.reprocess(subchannelPicker); delayedTransport.reprocess(subchannelPicker);
break; break;
case TRANSIENT_FAILURE: case TRANSIENT_FAILURE:
delayedTransport.reprocess(new SubchannelPicker() { final class OobErrorPicker extends SubchannelPicker {
final PickResult errorResult = PickResult.withError(newState.getStatus()); final PickResult errorResult = PickResult.withError(newState.getStatus());
@Override @Override
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return errorResult; return errorResult;
} }
});
@Override
public String toString() {
return MoreObjects.toStringHelper(OobErrorPicker.class)
.add("errorResult", errorResult)
.toString();
}
}
delayedTransport.reprocess(new OobErrorPicker());
break; break;
default: default:
// Do nothing // Do nothing

View File

@ -21,6 +21,7 @@ import static io.grpc.ConnectivityState.CONNECTING;
import static io.grpc.ConnectivityState.SHUTDOWN; import static io.grpc.ConnectivityState.SHUTDOWN;
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE; import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
import com.google.common.base.MoreObjects;
import io.grpc.ConnectivityState; import io.grpc.ConnectivityState;
import io.grpc.ConnectivityStateInfo; import io.grpc.ConnectivityStateInfo;
import io.grpc.EquivalentAddressGroup; import io.grpc.EquivalentAddressGroup;
@ -135,6 +136,11 @@ final class PickFirstLoadBalancer extends LoadBalancer {
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return result; return result;
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(Picker.class).add("result", result).toString();
}
} }
/** Picker that requests connection during the first pick, and returns noResult. */ /** Picker that requests connection during the first pick, and returns noResult. */

View File

@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import io.grpc.ConnectivityState; import io.grpc.ConnectivityState;
import io.grpc.ConnectivityStateInfo; import io.grpc.ConnectivityStateInfo;
import io.grpc.ExperimentalApi; import io.grpc.ExperimentalApi;
@ -56,14 +57,21 @@ public final class GracefulSwitchLoadBalancer extends ForwardingLoadBalancer {
@Override @Override
public void handleNameResolutionError(final Status error) { public void handleNameResolutionError(final Status error) {
class ErrorPicker extends SubchannelPicker {
@Override
public PickResult pickSubchannel(PickSubchannelArgs args) {
return PickResult.withError(error);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(ErrorPicker.class).add("error", error).toString();
}
}
helper.updateBalancingState( helper.updateBalancingState(
ConnectivityState.TRANSIENT_FAILURE, ConnectivityState.TRANSIENT_FAILURE,
new SubchannelPicker() { new ErrorPicker());
@Override
public PickResult pickSubchannel(PickSubchannelArgs args) {
return PickResult.withError(error);
}
});
} }
@Override @Override

View File

@ -24,6 +24,7 @@ import static io.grpc.ConnectivityState.SHUTDOWN;
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE; import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
@ -428,6 +429,11 @@ final class RoundRobinLoadBalancer extends LoadBalancer {
return PickResult.withSubchannel(subchannel != null ? subchannel : nextSubchannel()); return PickResult.withSubchannel(subchannel != null ? subchannel : nextSubchannel());
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(ReadyPicker.class).add("list", list).toString();
}
private Subchannel nextSubchannel() { private Subchannel nextSubchannel() {
int size = list.size(); int size = list.size();
int i = indexUpdater.incrementAndGet(this); int i = indexUpdater.incrementAndGet(this);
@ -476,6 +482,11 @@ final class RoundRobinLoadBalancer extends LoadBalancer {
return picker instanceof EmptyPicker && (Objects.equal(status, ((EmptyPicker) picker).status) return picker instanceof EmptyPicker && (Objects.equal(status, ((EmptyPicker) picker).status)
|| (status.isOk() && ((EmptyPicker) picker).status.isOk())); || (status.isOk() && ((EmptyPicker) picker).status.isOk()));
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(EmptyPicker.class).add("status", status).toString();
}
} }
/** /**

View File

@ -2862,7 +2862,7 @@ public class ManagedChannelImplTest {
timer.forwardNanos(1234); timer.forwardNanos(1234);
updateBalancingStateSafely(helper, CONNECTING, mockPicker); updateBalancingStateSafely(helper, CONNECTING, mockPicker);
assertThat(getStats(channel).channelTrace.events).contains(new ChannelTrace.Event.Builder() assertThat(getStats(channel).channelTrace.events).contains(new ChannelTrace.Event.Builder()
.setDescription("Entering CONNECTING state") .setDescription("Entering CONNECTING state with picker: mockPicker")
.setSeverity(ChannelTrace.Event.Severity.CT_INFO) .setSeverity(ChannelTrace.Event.Severity.CT_INFO)
.setTimestampNanos(timer.getTicker().read()) .setTimestampNanos(timer.getTicker().read())
.build()); .build());

View File

@ -26,6 +26,7 @@ import static io.grpc.ConnectivityState.SHUTDOWN;
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE; import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Stopwatch; import com.google.common.base.Stopwatch;
import com.google.protobuf.util.Durations; import com.google.protobuf.util.Durations;
@ -1051,5 +1052,12 @@ final class GrpclbState {
} }
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(RoundRobinPicker.class)
.add("dropList", dropList)
.add("pickList", pickList)
.toString();
}
} }
} }

View File

@ -413,6 +413,13 @@ final class ClientLoadCounter {
ClientStreamTracer.Factory originFactory) { ClientStreamTracer.Factory originFactory) {
return new LoadRecordingStreamTracerFactory(counter, originFactory); return new LoadRecordingStreamTracerFactory(counter, originFactory);
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(LoadRecordingSubchannelPicker.class)
.add("delegate", delegate)
.toString();
}
} }
/** /**
@ -445,5 +452,12 @@ final class ClientLoadCounter {
ClientStreamTracer.Factory originFactory) { ClientStreamTracer.Factory originFactory) {
return orcaPerRequestUtil.newOrcaClientStreamTracerFactory(originFactory, listener); return orcaPerRequestUtil.newOrcaClientStreamTracerFactory(originFactory, listener);
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(MetricsObservingSubchannelPicker.class)
.add("delegate", delegate)
.toString();
}
} }
} }