diff --git a/src/lua/net_box.lua b/src/lua/net_box.lua index 70e3e2077ba21a8b41cd4a59dc8d3b9f11e1daad..a6efbcf6a58aaf798462e59c792de17a7157770f 100644 --- a/src/lua/net_box.lua +++ b/src/lua/net_box.lua @@ -592,7 +592,7 @@ local remote_methods = { self:_switch_state('error') self:_error_waiters(emsg) self.rbuf = '' - self.wbuf = '' + self.wbuf = {} self.handshake = '' end, @@ -791,7 +791,7 @@ local remote_methods = { elseif string.len(self.handshake) ~= 128 then self:_fatal("Can't read handshake") else - self.wbuf = '' + self.wbuf = {} self.rbuf = '' if string.match(self.handshake, '^Tarantool .*console') then @@ -985,7 +985,7 @@ local remote_methods = { break end - if string.len(self.wbuf) == 0 then + if self.wbuf[1] == nil then local wstate = self._to_rstate[self.state] if wstate ~= nil then @@ -998,12 +998,17 @@ local remote_methods = { break end if self:_is_rw_state() then - if #self.wbuf > 0 then - local written = self.s:syswrite(self.wbuf) + if self.wbuf[1] ~= nil then + local s = table.concat(self.wbuf) + self.wbuf = {} + local written = self.s:syswrite(s) if written ~= nil then - self.wbuf = string.sub(self.wbuf, - tonumber(1 + written)) + if written ~= #s then + table.insert(self.wbuf, + string.sub(s, written + 1)) + end else + table.insert(self.wbuf, s) self:_fatal(errno.strerror(errno())) end end @@ -1062,7 +1067,7 @@ local remote_methods = { self.timeouts[fid] = TIMEOUT_INFINITY end - self.wbuf = self.wbuf .. request + table.insert(self.wbuf, request) local wstate = self._to_wstate[self.state] if wstate ~= nil then