-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce NameResolver.Args.Extensions #11669
base: master
Are you sure you want to change the base?
Conversation
Friendly 1 week ping. This is the domain-specific Key<>-based approach you requested in our last meeting. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like how Extensions was implemented to avoid copying the map on build().
} | ||
|
||
/** | ||
* The port number used in case the target or the underlying naming system doesn't provide a | ||
* port number. | ||
* | ||
* <p>TODO: Only meaningful for InetSocketAddress producers. Move to {@link Extensions}? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Put this as a //
comment, not a javadoc one?
/** | ||
* Gets the value of an extended arg by key, or {@code null} if it's not set. | ||
*/ | ||
@SuppressWarnings("unchecked") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove the warning suppression? Extensions.get()
does the cast; there's none here.
* | ||
* <p>Optional, {@link Extensions#EMPTY} by default. | ||
*/ | ||
public Builder setExtensions(Extensions extensions) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmmm... This makes Extensions
public, and you have to set all Extensions for this builder but reading gets only a single one. I see the awkwardness is because we're going through the ManagedChannelBuilder API. I'm tempted to just use a map in the channel builder and copy it to this API later.
* <p>Optional, {@link Extensions#EMPTY} by default. | ||
*/ | ||
public Builder setExtensions(Extensions extensions) { | ||
this.extensions = extensions; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
checkNotNull
|
||
private IdentityHashMap<Key<?>, Object> data(int size) { | ||
if (newdata == null) { | ||
newdata = new IdentityHashMap<>(size); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would it be nicer to copy base at this point:
newdata = new IdentityHashMap<>(base.data);
Yes, you're doing the sizing of the map here, but that size is pretty arbitrary. If we care:
newdata = new IdentityHashMap<>(base.data.size() + 1);
newdata.putAll(base.data);
this.channelLogger = channelLogger; | ||
this.executor = executor; | ||
this.overrideAuthority = overrideAuthority; | ||
private Args(Builder builder) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, it needed this change.
grpc-binder's upcoming
IntentNameResolver
needs to know the target Android user so it can resolve target URIs in the correct place. Unfortunately, Android's built in intent:// URI scheme has no way to specify a user and in fact theandroid.os.UserHandle
object can't reasonably be encoded as a String at all.We solve this problem by extending
NameResolver.Args
to permit externally defined arguments using the same type-safe and domain-specificKey<T>
pattern used byCallOptions
,Context
andCreateSubchannelArgs
. New "extension" arguments could apply to all NameResolvers of a certain URI scheme, to all NameResolvers producing a particular type ofjava.net.SocketAddress
, or even to a specificNameResolver
subclass.A follow up PR will move the target
UserHandle
from being a property of theManagedChannel
to being a property of theSocketAddress
.