=act #3672 fix garbling of big outgoing Tcp.Write caused by mixup of buffers

This commit is contained in:
Johannes Rudolph 2013-10-17 14:10:00 +02:00
parent f194860dfb
commit f87f166aac
2 changed files with 26 additions and 3 deletions

View file

@ -5,7 +5,7 @@
package akka.io
import java.io.{ File, IOException }
import java.net.{ URLClassLoader, ConnectException, InetSocketAddress, SocketException, SocketTimeoutException }
import java.net.{ URLClassLoader, InetSocketAddress }
import java.nio.ByteBuffer
import java.nio.channels._
import java.nio.channels.spi.SelectorProvider
@ -22,6 +22,7 @@ import akka.actor._
import akka.testkit.{ AkkaSpec, EventFilter, TestActorRef, TestProbe }
import akka.util.{ Helpers, ByteString }
import akka.TestUtils._
import java.util.Random
object TcpConnectionSpec {
case class Ack(i: Int) extends Event
@ -176,6 +177,28 @@ class TcpConnectionSpec extends AkkaSpec("""
}
}
"send big buffers to network correctly" in new EstablishedConnectionTest() {
run {
val bufferSize = 512 * 1024 // 256kB are too few
val random = new Random(0)
val testBytes = new Array[Byte](bufferSize)
random.nextBytes(testBytes)
val testData = ByteString(testBytes)
val writer = TestProbe()
val write = Write(testData, Ack)
val buffer = ByteBuffer.allocate(bufferSize)
serverSideChannel.read(buffer) must be(0)
writer.send(connectionActor, write)
pullFromServerSide(remaining = bufferSize, into = buffer)
buffer.flip()
buffer.limit must be(bufferSize)
ByteString(buffer) must be(testData)
}
}
"write data after not acknowledged data" in new EstablishedConnectionTest() {
run {
val writer = TestProbe()

View file

@ -348,9 +348,9 @@ private[io] abstract class TcpConnection(val tcp: TcpExt, val channel: SocketCha
} else if (data.nonEmpty) {
buffer.clear()
val copied = remainingData.copyToBuffer(buffer)
val copied = data.copyToBuffer(buffer)
buffer.flip()
writeToChannel(remainingData drop copied)
writeToChannel(data drop copied)
} else {
if (!ack.isInstanceOf[NoAck]) commander ! ack