From b355aa66e4654623e44849138dbf79b7a5389883 Mon Sep 17 00:00:00 2001 From: Guillaume Bort Date: Wed, 13 Sep 2017 08:14:24 +0200 Subject: [PATCH] Sbt server could miss some messages If the read buffer contains more that 2 messages, we need to consume them all before blocking on socket read again. For that we have to loop until the buffer does not contain anymore the message delimiter character. Same problem in the client ServerConnection code. --- .../main/scala/sbt/internal/client/ServerConnection.scala | 5 +++-- main/src/main/scala/sbt/internal/server/NetworkChannel.scala | 5 +++-- notes/1.0.2/server-issue.markdown | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 notes/1.0.2/server-issue.markdown diff --git a/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala b/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala index 1ad599825..c551613ae 100644 --- a/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala +++ b/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala @@ -30,8 +30,8 @@ abstract class ServerConnection(connection: Socket) { bytesRead = in.read(readBuffer) buffer = buffer ++ readBuffer.toVector.take(bytesRead) // handle un-framing - val delimPos = buffer.indexOf(delimiter) - if (delimPos > 0) { + var delimPos = buffer.indexOf(delimiter) + while (delimPos > -1) { val chunk = buffer.take(delimPos) buffer = buffer.drop(delimPos + 1) @@ -47,6 +47,7 @@ abstract class ServerConnection(connection: Socket) { case event: StringEvent => onLogEntry(event) } ) + delimPos = buffer.indexOf(delimiter) } } catch { diff --git a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala index b8bc171a5..22d51c5ce 100644 --- a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala +++ b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala @@ -29,8 +29,8 @@ final class NetworkChannel(val name: String, connection: Socket, structure: Buil bytesRead = in.read(readBuffer) buffer = buffer ++ readBuffer.toVector.take(bytesRead) // handle un-framing - val delimPos = buffer.indexOf(delimiter) - if (delimPos > 0) { + var delimPos = buffer.indexOf(delimiter) + while (delimPos > -1) { val chunk = buffer.take(delimPos) buffer = buffer.drop(delimPos + 1) @@ -40,6 +40,7 @@ final class NetworkChannel(val name: String, connection: Socket, structure: Buil errorDesc => println("Got invalid chunk from client: " + errorDesc), onCommand ) + delimPos = buffer.indexOf(delimiter) } } catch { diff --git a/notes/1.0.2/server-issue.markdown b/notes/1.0.2/server-issue.markdown new file mode 100644 index 000000000..631237f80 --- /dev/null +++ b/notes/1.0.2/server-issue.markdown @@ -0,0 +1,5 @@ +### Bug fixes + +- In some cases sbt server was missing some messages. By [@guillaumebort][@guillaumebort]. + + [@guillaumebort]: https://github.com/guillaumebort