[
https://issues.apache.org/jira/browse/HADOOP-12529?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14983778#comment-14983778
]
Vinayakumar B commented on HADOOP-12529:
----------------------------------------
Thanks [~cnauroth] for details. I agree, we cannot directly use equals, because
UGI is mutable.
Just for the specific case of proxy users, How about using principal of the
proxy User, and RealUser's subject ref comparison?
Just like below
{code}public boolean equals(Object o) {
if (o == this) {
return true;
} else if (o == null || getClass() != o.getClass()) {
return false;
}
UserGroupInformation other = ((UserGroupInformation) o);
if (getAuthenticationMethod() == other.getAuthenticationMethod()
&& getAuthenticationMethod() == AuthenticationMethod.PROXY) {
User user = subject.getPrincipals(User.class).iterator().next();
RealUser realUser =
subject.getPrincipals(RealUser.class).iterator().next();
User otherUser =
other.subject.getPrincipals(User.class).iterator().next();
RealUser otherRealUser =
other.subject.getPrincipals(RealUser.class).iterator().next();
return user.equals(otherUser) && realUser
.getRealUser().subject == otherRealUser.getRealUser().subject;
} else {
return subject == other.subject;
}
}{code}
And for the hascode() can be like below
{code} @Override
public int hashCode() {
if (getAuthenticationMethod() == AuthenticationMethod.PROXY) {
User user = subject.getPrincipals(User.class).iterator().next();
RealUser realUser =
subject.getPrincipals(RealUser.class).iterator().next();
return user.hashCode()
& System.identityHashCode(realUser.getRealUser().subject);
}
return System.identityHashCode(subject);
}
{code}
Will this address concerns mentioned in above comments?
> UserGroupInformation equals method depend on the subject object address
> -----------------------------------------------------------------------
>
> Key: HADOOP-12529
> URL: https://issues.apache.org/jira/browse/HADOOP-12529
> Project: Hadoop Common
> Issue Type: Bug
> Components: security
> Affects Versions: 2.7.1
> Reporter: wangwenli
>
> my question is why UserGroupInformation equals method depend on the
> subject object?
> try below code which is extract from HiveMetaStore:
> {code:title=TestUgi.java|borderStyle=solid}
> UserGroupInformation clientUgi = null;
> UserGroupInformation clientUgi2 = null;
> try {
> clientUgi = UserGroupInformation.createProxyUser("user2",
> UserGroupInformation.getLoginUser());
> clientUgi2 = UserGroupInformation.createProxyUser("user2",
> UserGroupInformation.getLoginUser());
> if (clientUgi.equals(clientUgi2)) {
> System.out.println("==");
> } else {
> System.out.println("!="); // strangely this will be hit
> }
> } catch (IOException e1) {
> e1.printStackTrace();
> }
> {code}
> i found that it is because the equal method from UserGroupInformation
> is compare on subject object ref : subject == ((UserGroupInformation)
> o).subject; .
> as you know, ipc.Client connect to namenode,
> connections.get(ConnectionId) this code will try to reuse the same socket
> to namenode, but because of ConnectionId's equal depend on ugi equal, which
> will cause connections.get(ConnectionId) cann't get the same socket,
> suppose many connect to HiveMetaStore, then many connection to Namenode will
> established.
> so my doubts is why UserGroupInformation is compare on subject object
> ref : subject == ((UserGroupInformation) o).subject, it should compare on
> subject's principal, am i right?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)