[MWy] Unmarshaling problem

Vlastimil Babka babka at dsrg.mff.cuni.cz
Thu Mar 27 11:03:22 CET 2008


Petr Lasak wrote:
> To Lukas: to ze nemam u NodeImpl uvedene ze dedi od UnicastRemoteObject 
> neni na skodu...protoze potom ten objekt je mensi, a pokud ho chci 
> pouzivat v serveru, tak pomoci metody exportObject z nej udelam prave 
> takovy zabaleny objekt typu UnicastRemoteObject a muzu jej i takto 
> pouzivat. tedy zapis je cisty.navic tak nepotrebujes dve implementace 
> tehoz, jenom se lisici ze jedna dedi druha nikoliv.

To je pravda, ale soucasne s timhle se take vsude (vcetne slajdu ze 
cviceni) doctete ze bez dedeni UnicastRemoteObject nemate zarucenou 
korektni semantiku equals a hashCode na remote objektech. A protoze tu 
pracujeme s HashSet na mnozinu sousedu. Proto je ve slajdech doporuceno 
udelat samostatnou implementaci a usetrit si pripadne problemy...

> Ovsem objevil se mi dalsi bubak ve skrini. Muj NodeFactory provadi neco 
> takoveho
> 
>         Node newNode = (Node)UnicastRemoteObject.exportObject( new 
> NodeImpl() );
>         return newNode;

Takto se ale exportObject pouzivat nema. Z metody mate vracet primo ten 
vytvoreny objekt (ktery predtim exportujete). To co vraci exportObject 
vas zajimat nemusi. Je to sice stub exportovaneho objektu, vy byste s 
nim ale takto primo pracovat nemel.

> Coz dle RMI znamena, ze pokud jej zavolam v klientovi jako
> 
>             oNodeFactory = new NodeFactoryImpl();
> 
> a pak cyklus , kde volam
>             aNodes [i] = oNodeFactory.createNode();
> 
> tak vytvori lokalni kopii, protoze RMI se rozhodne, ze pokud je NodeImpl 
> ( ktera neni dedena od UnicastRemoteObject ) a volam na ni tu create 
> object na lokalni kopii tak zustane lokalni. 

Jiste, proc by nemely byt lokalne vytvorene objekty lokalni. Ovsem v 
poli aNodes[] uz nemate lokalni objekty ale jejich stuby.

> Problem je ovsem v tom, ze 
> kdyz to zavolam s pomoci createNode, tak mi to vytvori Nody, ale pri 
> spojovani hranami , mi to treba u 5. nebo treba 50, dvojice spadne a vypise
> 
> Client raised exception: no such object in table
> java.rmi.NoSuchObjectException: no such object in table
>     at 
> sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown 
> Source)
>     at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
>     at sun.rmi.server.UnicastRef.invoke(Unknown Source)
>     at NodeImpl_Stub.addNeighbor(Unknown Source)
>     at Client.connectAllNodes(Client.java:46)
>     at Client.main(Client.java:112)

Ano, a tady se zrejme projevi to ze rucne pracujete ze stuby a ne se 
samotnymi objekty. Domnivam se ze je to zpusobeno remote garbage 
collectorem, ktery za beznych okolnosti pracuje spravne, ale tim, ze 
jste si stuby vytvoril rucne, se nezvysila reference count jim 
prislusnym objektum a GC vam nejake objekty smazal.

> Pokud to zavolam s NodeFactory vzdalenou pres
> 
>     oNodeFactory = (NodeFactory) Naming.lookup("//localhost/NodeFactory");
> 
> Hodi to stejnou chybu. Kdyby mi to pokazde spadlo, tedy myslim u prvni 
> dvojice, tak si bych hledal chybu nekde v kodu, zapisu ci nejak 
> tak...jenze mate mne prave to, ze u v debug mi prvnich 5 - 20 dvojic v 
> pohode projde...a pak to spadne na tenhle error. Metoda createNodes 
> projde, zavola 1000x tu metodu

Ano, pokud je to zpusobeno tim GC, muze se to chovat "nahodne".

> A na zaver pridam opet bombonek: Pokud teda pouziji pouze lokalni kopii 
> s new...a pridam Searcher, ktery je na serveru , tak se mi dostane za 
> odmenu toto
> 
> Client raised exception: Error unmarshaling return header; nested 
> exception is:
>     java.net.SocketException: Connection reset by peer: socket write error
> java.rmi.UnmarshalException: Error unmarshaling return header; nested 
> exception is:
>     java.net.SocketException: Connection reset by peer: socket write error
>     at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
>     at sun.rmi.server.UnicastRef.invoke(Unknown Source)
>     at SearcherImpl_Stub.getDistance(Unknown Source)
>     at Client.searchBenchmark(Client.java:87)
>     at Client.main(Client.java:121)
> Caused by: java.net.SocketException: Connection reset by peer: socket 
> write error
>     at java.net.SocketOutputStream.socketWrite0(Native Method)
>     at java.net.SocketOutputStream.socketWrite(Unknown Source)
>     at java.net.SocketOutputStream.write(Unknown Source)

A je to skutecne cely vypis vyjimky, neni uplne na konci vypisu vnorena 
StackOverflowException, o ktere se tu jiz psalo vcetne reseni?

Hezky den,
-- 
Vlastimil Babka
Ph.D. student
Distributed Systems Research Group
Department of Software Engineering
Faculty of Mathematics and Physics
Charles University in Prague
Czech Republic
   http://dsrg.mff.cuni.cz/





More information about the NSWI080 mailing list