2014-06-09 17 views
5

Ho un java.nio.channels.SocketChannel nel mio jlamSI implamantation che si sta disconnettendo quando provo ad aprire un driver con dimensioni superiori a 4 GB. La RFC iscsi dice che BasicHeaderSegment.BHS_FIXED_SIZE può essere 48, quindi con questa posizione posso leggere i byte sul canale. Il documento java dice 5 tipi di errori, ma la mia app sta lanciando l'ultimo che non dice informazioni specifiche. 1 - NotYetConnectedException 2 - ClosedChannelException 3 - AsynchronousCloseException 4 - ClosedByInterruptException 5 - IOExceptionConnessione forzata dall'host remoto

public final int read(final SocketChannel sChannel) throws InternetSCSIException, IOException, DigestException { 
// read Basic Header Segment first to determine the total length of this 
// Protocol Data Unit. 
clear(); 

final ByteBuffer bhs = ByteBuffer.allocate(BasicHeaderSegment.BHS_FIXED_SIZE); 
int len = 0; 
while (len < BasicHeaderSegment.BHS_FIXED_SIZE) { 
    int lens = sChannel.read(bhs); 
    if (lens == -1) { 
     // The Channel was closed at the Target (e.g. the Target does 
     // not support Multiple Connections) 
     // throw new ClosedChannelException(); 
     return lens; 
    } 
    len += lens; 
    LOGGER.trace("Receiving through SocketChannel: " + len + " of maximal " + BasicHeaderSegment.BHS_FIXED_SIZE); 

} 
bhs.flip(); 

errore:

java.io.IOException: An existing connection was forcibly closed by the remote host 
    at sun.nio.ch.SocketDispatcher.read0(Native Method) 
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) 
    at sun.nio.ch.IOUtil.read(IOUtil.java:197) 
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379) 
    at org.jscsi.parser.ProtocolDataUnit.read(ProtocolDataUnit.java:417) 
    at org.jscsi.target.connection.TargetSenderWorker.receiveFromWire(TargetSenderWorker.java:145) 
    at org.jscsi.target.connection.Connection$TargetConnection.receivePdu(Connection.java:217) 
    at org.jscsi.target.connection.phase.TargetFullFeaturePhase.execute(TargetFullFeaturePhase.java:96) 
    at org.jscsi.target.connection.Connection$TargetConnection.call(Connection.java:264) 
    at org.jscsi.target.connection.Connection$TargetConnection.call(Connection.java:79) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
[pool-9-thread-1] INFO org.jscsi.target.connection 

Grazie in anticipo, Felipe

+0

Nota la correzione del titolo. Il tuo SocketChannel è ancora aperto. È la * connessione * che è stata forzatamente chiusa. – EJP

risposta

4

tua descrizione del problema è errato. SocketChannel non è chiuso: la connessione è; e non sta succedendo quando provi ad aprire la connessione: sta accadendo quando leggi da essa.

Questo di solito risulta dall'invio di qualcosa dopo che il peer ha già chiuso la connessione, che a sua volta di solito significa che in precedenza l'hai inviato qualcosa che non capiva.

+0

Sto cercando su questo link le proprietà di iscsi, forse posso aumentare il timeout, ma non so cosa modificare http://blogs.msdn.com/b/san/archive/2008/07/27/microsoft- iscsi-software-initiator-isns-server-timers-quick-reference.aspx –

+0

I timeout non hanno nulla a che fare con questo. Sembra che tu non abbia letto questa risposta. – EJP

0

Sembra che l'altro lato si sia disconnesso a causa di un qualche tipo di problema. Supponendo che si sta sviluppando l'iniziatore, è necessario controllare i registri di sistema di destinazione (server).

Puoi spiegare il commento da 4 GB? Voglio dire, che cosa significa "aprire un driver con dimensioni superiori a 4 GB" significa, quale driver?

+0

Devo montare i driver moltiplicati per 2. es .: 4Gb, 8GB, 16GB –

+0

Intendi "drive", ad es. un LUN, disco, giusto? Quindi, il 4GB sembra sospetto. Non c'è nulla in iSCSI stesso che potrebbe avere una condizione di bordo relativa a 4 GB. Forse è un problema a livello SCSI? Ancora una volta, qualcosa di interessante nei registri di destinazione? –

Problemi correlati