core: use withOptions instead of withAffinity (#2791)

Fixes #2738
Closes #1766
This commit is contained in:
Łukasz Strzałkowski 2017-03-14 12:47:10 -07:00 committed by Kun Zhang
parent 884b65a891
commit da93a64ec1
4 changed files with 11 additions and 19 deletions

View File

@ -152,7 +152,10 @@ public final class CallOptions {
/** /**
* Returns a new {@code CallOptions} with attributes for affinity-based routing. * Returns a new {@code CallOptions} with attributes for affinity-based routing.
*
* @deprecated use {@link #withOption(Key, Object)}.
*/ */
@Deprecated
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1766") @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1766")
public CallOptions withAffinity(Attributes affinity) { public CallOptions withAffinity(Attributes affinity) {
CallOptions newOptions = new CallOptions(this); CallOptions newOptions = new CallOptions(this);
@ -183,7 +186,10 @@ public final class CallOptions {
/** /**
* Returns the attributes for affinity-based routing. * Returns the attributes for affinity-based routing.
*
* @deprecated use {@link #getOption(Key)}.
*/ */
@Deprecated
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1766") @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1766")
public Attributes getAffinity() { public Attributes getAffinity() {
return affinity; return affinity;

View File

@ -187,6 +187,7 @@ public abstract class LoadBalancer {
* @param args the pick arguments * @param args the pick arguments
*/ */
// TODO(lukaszx0) make it abstract once deprecated overload will be removed. // TODO(lukaszx0) make it abstract once deprecated overload will be removed.
@SuppressWarnings("deprecation")
public PickResult pickSubchannel(PickSubchannelArgs args) { public PickResult pickSubchannel(PickSubchannelArgs args) {
return pickSubchannel(args.getCallOptions().getAffinity(), args.getHeaders()); return pickSubchannel(args.getCallOptions().getAffinity(), args.getHeaders());
} }

View File

@ -42,7 +42,6 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import io.grpc.Attributes.Key;
import io.grpc.internal.SerializingExecutor; import io.grpc.internal.SerializingExecutor;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -57,15 +56,12 @@ public class CallOptionsTest {
private String sampleCompressor = "compressor"; private String sampleCompressor = "compressor";
private Deadline.Ticker ticker = new FakeTicker(); private Deadline.Ticker ticker = new FakeTicker();
private Deadline sampleDeadline = Deadline.after(1, NANOSECONDS, ticker); private Deadline sampleDeadline = Deadline.after(1, NANOSECONDS, ticker);
private Key<String> sampleKey = Attributes.Key.of("sample");
private Attributes sampleAffinity = Attributes.newBuilder().set(sampleKey, "blah").build();
private CallCredentials sampleCreds = mock(CallCredentials.class); private CallCredentials sampleCreds = mock(CallCredentials.class);
private CallOptions.Key<String> option1 = CallOptions.Key.of("option1", "default"); private CallOptions.Key<String> option1 = CallOptions.Key.of("option1", "default");
private CallOptions.Key<String> option2 = CallOptions.Key.of("option2", "default"); private CallOptions.Key<String> option2 = CallOptions.Key.of("option2", "default");
private CallOptions allSet = CallOptions.DEFAULT private CallOptions allSet = CallOptions.DEFAULT
.withAuthority(sampleAuthority) .withAuthority(sampleAuthority)
.withDeadline(sampleDeadline) .withDeadline(sampleDeadline)
.withAffinity(sampleAffinity)
.withCallCredentials(sampleCreds) .withCallCredentials(sampleCreds)
.withCompression(sampleCompressor) .withCompression(sampleCompressor)
.withWaitForReady() .withWaitForReady()
@ -77,7 +73,6 @@ public class CallOptionsTest {
public void defaultsAreAllNull() { public void defaultsAreAllNull() {
assertThat(CallOptions.DEFAULT.getDeadline()).isNull(); assertThat(CallOptions.DEFAULT.getDeadline()).isNull();
assertThat(CallOptions.DEFAULT.getAuthority()).isNull(); assertThat(CallOptions.DEFAULT.getAuthority()).isNull();
assertThat(CallOptions.DEFAULT.getAffinity()).isEqualTo(Attributes.EMPTY);
assertThat(CallOptions.DEFAULT.getExecutor()).isNull(); assertThat(CallOptions.DEFAULT.getExecutor()).isNull();
assertThat(CallOptions.DEFAULT.getCredentials()).isNull(); assertThat(CallOptions.DEFAULT.getCredentials()).isNull();
assertThat(CallOptions.DEFAULT.getCompressor()).isNull(); assertThat(CallOptions.DEFAULT.getCompressor()).isNull();
@ -95,7 +90,6 @@ public class CallOptionsTest {
public void allWiths() { public void allWiths() {
assertThat(allSet.getAuthority()).isSameAs(sampleAuthority); assertThat(allSet.getAuthority()).isSameAs(sampleAuthority);
assertThat(allSet.getDeadline()).isSameAs(sampleDeadline); assertThat(allSet.getDeadline()).isSameAs(sampleDeadline);
assertThat(allSet.getAffinity()).isSameAs(sampleAffinity);
assertThat(allSet.getCredentials()).isSameAs(sampleCreds); assertThat(allSet.getCredentials()).isSameAs(sampleCreds);
assertThat(allSet.getCompressor()).isSameAs(sampleCompressor); assertThat(allSet.getCompressor()).isSameAs(sampleCompressor);
assertThat(allSet.getExecutor()).isSameAs(directExecutor()); assertThat(allSet.getExecutor()).isSameAs(directExecutor());
@ -112,10 +106,6 @@ public class CallOptionsTest {
equal(allSet, equal(allSet,
allSet.withDeadline(Deadline.after(314, NANOSECONDS)).withDeadline(sampleDeadline))) allSet.withDeadline(Deadline.after(314, NANOSECONDS)).withDeadline(sampleDeadline)))
.isTrue(); .isTrue();
assertThat(
equal(allSet,
allSet.withAffinity(Attributes.EMPTY).withAffinity(sampleAffinity)))
.isTrue();
assertThat( assertThat(
equal(allSet, equal(allSet,
allSet.withCallCredentials(mock(CallCredentials.class)) allSet.withCallCredentials(mock(CallCredentials.class))
@ -168,7 +158,6 @@ public class CallOptionsTest {
assertThat(actual).contains("deadline=null"); assertThat(actual).contains("deadline=null");
assertThat(actual).contains("authority=authority"); assertThat(actual).contains("authority=authority");
assertThat(actual).contains("callCredentials=null"); assertThat(actual).contains("callCredentials=null");
assertThat(actual).contains("affinity={sample=blah}");
assertThat(actual).contains("executor=class io.grpc.internal.SerializingExecutor"); assertThat(actual).contains("executor=class io.grpc.internal.SerializingExecutor");
assertThat(actual).contains("compressorName=compressor"); assertThat(actual).contains("compressorName=compressor");
assertThat(actual).contains("customOptions=[[option1, value1], [option2, value2]]"); assertThat(actual).contains("customOptions=[[option1, value1], [option2, value2]]");
@ -217,7 +206,6 @@ public class CallOptionsTest {
private static boolean equal(CallOptions o1, CallOptions o2) { private static boolean equal(CallOptions o1, CallOptions o2) {
return Objects.equal(o1.getDeadline(), o2.getDeadline()) return Objects.equal(o1.getDeadline(), o2.getDeadline())
&& Objects.equal(o1.getAuthority(), o2.getAuthority()) && Objects.equal(o1.getAuthority(), o2.getAuthority())
&& Objects.equal(o1.getAffinity(), o2.getAffinity())
&& Objects.equal(o1.getCredentials(), o2.getCredentials()); && Objects.equal(o1.getCredentials(), o2.getCredentials());
} }

View File

@ -48,7 +48,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import io.grpc.Attributes;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.IntegerMarshaller; import io.grpc.IntegerMarshaller;
import io.grpc.LoadBalancer.PickResult; import io.grpc.LoadBalancer.PickResult;
@ -93,7 +92,7 @@ public class DelayedClientTransportTest {
@Captor private ArgumentCaptor<Status> statusCaptor; @Captor private ArgumentCaptor<Status> statusCaptor;
@Captor private ArgumentCaptor<ClientStreamListener> listenerCaptor; @Captor private ArgumentCaptor<ClientStreamListener> listenerCaptor;
private static final Attributes.Key<Integer> SHARD_ID = Attributes.Key.of("shard-id"); private static final CallOptions.Key<Integer> SHARD_ID = CallOptions.Key.of("shard-id", -1);
private final MethodDescriptor<String, Integer> method = private final MethodDescriptor<String, Integer> method =
MethodDescriptor.<String, Integer>newBuilder() MethodDescriptor.<String, Integer>newBuilder()
@ -304,11 +303,9 @@ public class DelayedClientTransportTest {
} }
@Test public void reprocessSemantics() { @Test public void reprocessSemantics() {
Attributes affinity1 = Attributes.newBuilder().set(SHARD_ID, 1).build(); CallOptions failFastCallOptions = CallOptions.DEFAULT.withOption(SHARD_ID, 1);
Attributes affinity2 = Attributes.newBuilder().set(SHARD_ID, 2).build(); CallOptions waitForReadyCallOptions = CallOptions.DEFAULT.withOption(SHARD_ID, 2)
CallOptions failFastCallOptions = CallOptions.DEFAULT.withAffinity(affinity1); .withWaitForReady();
CallOptions waitForReadyCallOptions =
CallOptions.DEFAULT.withWaitForReady().withAffinity(affinity2);
SubchannelImpl subchannel1 = mock(SubchannelImpl.class); SubchannelImpl subchannel1 = mock(SubchannelImpl.class);
SubchannelImpl subchannel2 = mock(SubchannelImpl.class); SubchannelImpl subchannel2 = mock(SubchannelImpl.class);