Author: slebresne
Date: Tue Apr 12 18:59:43 2011
New Revision: 1091542

URL: http://svn.apache.org/viewvc?rev=1091542&view=rev
Log:
Better detect failure during streaming (always cleaning up tmp files as a 
consequence)
patch by amorton and slebresne; reviewed by jbellis for (the first part of) 
CASSANDRA-2088

Modified:
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/IncomingStreamReader.java

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/IncomingStreamReader.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/IncomingStreamReader.java?rev=1091542&r1=1091541&r2=1091542&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/IncomingStreamReader.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/IncomingStreamReader.java
 Tue Apr 12 18:59:43 2011
@@ -84,6 +84,11 @@ public class IncomingStreamReader
                 {
                     long toRead = Math.min(FileStreamTask.CHUNK_SIZE, length - 
bytesRead);
                     long lastRead = fc.transferFrom(socketChannel, offset + 
bytesRead, toRead);
+                    // if the other side fails, we will not get an exception, 
but instead transferFrom will constantly return 0 byte read
+                    // and we would thus enter an infinite loop. So intead, if 
no bytes are tranferred we assume the other side is dead and 
+                    // raise an exception (that will be catch belove and 'the 
right thing' will be done).
+                    if (lastRead == 0)
+                        throw new IOException("Transfer failed for remote file 
" + remoteFile);
                     bytesRead += lastRead;
                     remoteFile.progress += lastRead;
                 }


Reply via email to