RFR of JDK-8170669: com/sun/jndi/rmi/registry/RegistryContext/UnbindIdempotent.java fails after JDK-8153916

Roger Riggs Roger.Riggs at Oracle.com
Mon Dec 5 14:31:25 UTC 2016


Hi Hamlin,

The changeset looks fine (to use /othervm).

Please file a new issue for your finding about createRegistry(0);  I 
agree it is likely a  product issue.

Thanks, Roger


On 12/5/2016 3:12 AM, Hamlin Li wrote:
> Would you please review the below patch?
>
> bug: https://bugs.openjdk.java.net/browse/JDK-8170669
> webrev: http://cr.openjdk.java.net/~mli/8170669/webrev.00/
>
> Root Cause:
> 2 tests impact each other. 
> (test/com/sun/jndi/rmi/registry/RegistryContext/ContextWithNullProperties.java, 
> UnbindIdempotent.java)
> Solution:
> adding othervm should resolve the issue.
>
> Thank you
> -Hamlin
>
>
> p.s.  Besides of the test issue talked above, I think there is some 
> defect in RMI API, below is the analysis.
>
> Root Cause:
> when calling LocateRegistry.createRegistry(port), it will check if the 
> ObjectTable contains the same ObjectEndPoint, if it contains, 
> "java.rmi.server.ExportException: internal error: ObjID already in 
> use" is thrown in ObjectTable.java. 2 ObjectEndPoint objects are 
> considered the same if both have the same id and same tranport 
> instance. For 2 calls of LocateRegistry.createRegistry(0), they have 
> the same id(ObjID.REGISTRY_ID) and same endpoint & transport instance, 
> so they are considered the same and exception is thrown.
>
> ================= more detailed explanation =================
> Although in 
> LocateRegistry.createRegistry(0)->...->TCPTransport->exportObject(target)->TCPTransport.listen()->TCPEndpoint.setDefaultPort(...), 
> it will add new endpoint instance for port 0 with a specific port 
> number(for example, it's 9999) in localEndpoints, but it still keeps 
> endpoint instance for port 0 in localEndpoints, and both endpoints(0, 
> 9999) are mapped to the same epList which includes one item with port 
> number as 9999. the transport member of previous 2 endpoint 
> instances(0, 9999) is indeed built on port 9999, this transport 
> listening on port 9999 is used as part of key(other part is object id) 
> to insert into ObjectTable. so when LocateRegistry.createRegistry(0) 
> is called second time, 
> LocateRegistry.createRegistry(0)->...->TCPEndpoint.getLocalEndpoint(0, 
> ...) will get the previous transport instance(listening on 9999), so 
> finally, in 
> LocateRegistry.createRegistry(0)->...->ObjectTable.putTarget(target), 
> in line 183 of ObjectTable.java, objTable.containsKey(oe) will return 
> true, then exception is thrown.
>
> ================= conclusion =================
> I think this is a RMI product issue, because below code runs 
> successfully,
>         Registry registry1 = LocateRegistry.createRegistry(60003);
>         Registry registry2 = LocateRegistry.createRegistry(60004);
> but below code will throw exception,
>         Registry registry1 = LocateRegistry.createRegistry(0);
>         Registry registry2 = LocateRegistry.createRegistry(0);
>



More information about the core-libs-dev mailing list