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

Hamlin Li huaming.li at oracle.com
Tue Dec 6 00:04:26 UTC 2016


Hi Roger,

Thank you for reviewing. File bug: 
https://bugs.openjdk.java.net/browse/JDK-8170728

-Hamlin


On 2016/12/5 22:31, Roger Riggs wrote:
> 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