2014-06-09 16 views
5

Ich habe eine java.nio.channels.SocketChannel in meiner jSCSI-Implantation, die trennt, wenn ich versuche, einen Treiber mit einer Größe größer als 4 GB zu öffnen. Der iscsi-RFC sagt, dass das BasicHeaderSegment.BHS_FIXED_SIZE 48 sein kann, also kann ich mit dieser Position die Bytes auf dem Kanal lesen. Der Java-Doc sagt 5 Arten von Fehlern, aber meine App wirft den letzten, der keine bestimmte Information sagt. 1 - NotYetConnectedException 2 - ClosedChannelException 3 - AsynchronousCloseException 4 - ClosedByInterruptException 5 - IOExceptionVerbindung wurde zwangsweise vom Remote-Host geschlossen

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(); 

Fehler:

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 

Vielen Dank im Voraus, Felipe

+0

Beachten Sie die Korrektur Ihres Titels. Dein SocketChannel ist noch offen. Es ist die * Verbindung *, die gewaltsam geschlossen wurde. – EJP

Antwort

4

Ihre Beschreibung des Problems ist falsch. Der SocketChannel ist nicht geschlossen: Die Verbindung ist; und es passiert nicht, wenn Sie versuchen, die Verbindung zu öffnen: es passiert, wenn Sie daraus lesen.

Dies ergibt sich normalerweise aus dem Senden von etwas, nachdem der Peer die Verbindung bereits geschlossen hat, was wiederum bedeutet, dass Sie ihm zuvor etwas gesendet haben, das er nicht verstanden hat.

+0

Ich suche auf diesem Link die Eigenschaften von iscsi, vielleicht kann ich die Auszeit erhöhen, aber ich weiß nicht, was ich bearbeiten soll http://blogs.msdn.com/b/san/archive/2008/07/27/microsoft- iscsi-software-initiator-isns-server-zeitgeber-quick-reference.aspx –

+0

Timeouts haben damit nichts zu tun. Sie scheinen diese Antwort nicht gelesen zu haben. – EJP

0

Es sieht so aus, als ob die andere Seite Sie wegen irgendeines Problems getrennt hat. Wenn Sie den Initiator entwickeln, sollten Sie die Systemprotokolle des Zielsystems (des Servers) überprüfen.

Können Sie den 4 GB Kommentar erklären? Ich meine, was genau "öffnet einen Treiber mit einer Größe größer als 4 GB" bedeuten, welcher Fahrer?

+0

Ich muss Treiber für 2 multiplizieren. ZB: 4Gb, 8GB, 16GB –

+0

Sie meinen "Laufwerk", z. eine LUN, Festplatte, oder? Also, die 4GB sieht verdächtig aus. Es gibt nichts in iSCSI selbst, das eine Randbedingung in Bezug auf 4 GB haben könnte. Vielleicht ist es ein SCSI-Level-Problem? Noch einmal, alles interessante in den Zielprotokollen? –

Verwandte Themen