[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