From a965d2cd04b49f07b1694e83223437a0d723acc3 Mon Sep 17 00:00:00 2001 From: jason huang Date: Tue, 9 Jan 2018 18:25:51 +0800 Subject: [PATCH] dump connection is disconnected dump connection is disconnected since SocketChannel.cache is overflow. --- .../driver/mysql/socket/SocketChannel.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/SocketChannel.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/SocketChannel.java index 40ce6c32..9eee2ef7 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/SocketChannel.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/SocketChannel.java @@ -27,10 +27,22 @@ public class SocketChannel { this.channel = channel; } - public void writeCache(ByteBuf buf) { + public void writeCache(ByteBuf buf) throws InterruptedException { synchronized (lock) { - cache.discardReadBytes();// 回收内存 - cache.writeBytes(buf); + while (true) { + cache.discardReadBytes();// 回收内存 + //source buffer is empty. + if (!buf.isReadable()) { + break; + } + + if (cache.isWritable()) { + cache.writeBytes(buf, Math.min(cache.writableBytes(), buf.readableBytes())); + } else { + //dest buffer is full. + lock.wait(100); + } + } } }