Compare commits

...

27 Commits

Author SHA1 Message Date
Cloud Wu
cbf22ac9f3 release rc2 2016-03-07 11:46:30 +08:00
Cloud Wu
8f7fa6a562 merge sproto 2016-02-25 14:40:24 +08:00
cloudwu
7b96eb28eb Merge pull request #455 from niuys/patch-2
error deal for query containing multi statement
2016-02-22 16:15:51 +08:00
snail
14ccf96eb0 error deal for query containing multi statement
A query may execute multi sql statements.If an error occurs for any sql, the result should return the error info.
2016-02-22 11:23:35 +08:00
Cloud Wu
ea8557296b fix issue #450 2016-02-13 19:20:07 +08:00
cloudwu
2a821fb62a Merge pull request #445 from DavidFeng/patch
fix
2016-01-27 13:55:14 +08:00
David Feng
d982009260 fix 2016-01-27 10:35:48 +08:00
cloudwu
a3f028ee3d Merge pull request #444 from DavidFeng/patch-1
修复调试模块调试结束后定时器没有取消的问题
2016-01-22 11:05:04 +08:00
David Feng
d34b092cdd remotedebug.lua call skynet.timeout() only in debug hook
定时器在debug结束后没有取消。
2016-01-22 10:28:03 +08:00
David Feng
77f4071191 remove unused local variables 2016-01-22 10:26:13 +08:00
cloudwu
653b29145d Merge pull request #442 from DavidFeng/patch-2
change socket.write to socketdriver.send
2016-01-20 22:05:23 +08:00
David Feng
96e0a4e3cc change socket.write to socketdriver.send
这样改过之后可以直接调试使用了gate服务的模块。
因为gate服务注册了socket类型的消息,所以不能和socket模块一块使用;而debug模块只使用到了socket模块的write函数,所以这样修改后对debug的功能并没有影响,但改过之后就可以调试gate服务了。
2016-01-20 19:24:58 +08:00
Cloud Wu
1da92850a0 bugfix: dispatch local global message queue 2016-01-19 17:14:52 +08:00
Cloud Wu
9747cf9aee don't assert here 2016-01-19 16:16:18 +08:00
Cloud Wu
7f45b3fd10 correct maxsz 2016-01-13 13:13:31 +08:00
cloudwu
217ab47577 Merge pull request #435 from niuys/patch-1
reduce needless 'add_string' call
2016-01-11 15:56:52 +08:00
snail
532f47444b reduce needless 'add_string' call
Short strings in lua proto are reused most of the time. The string in SSM may be added by one service and used by other service,  there is no need to call `add_string`,which will call 'new_string' first.
2016-01-11 15:06:51 +08:00
Cloud Wu
24f9ee1560 work thread for channel may not create if you never connect 2016-01-08 18:34:45 +08:00
Cloud Wu
d7a76c7c72 If no content-length, read all. see issue #431 2016-01-07 16:01:17 +08:00
Cloud Wu
c175d66e23 remove unused function 2016-01-06 16:55:15 +08:00
Cloud Wu
05003e3e2a sproto.attach also need ud 2016-01-05 17:51:48 +08:00
Cloud Wu
64c2cb1b51 sproto dispatch support ud 2016-01-05 16:06:20 +08:00
cloudwu
7f0e4eac8a Merge pull request #428 from fztcjjl/master
fix comment error
2016-01-04 16:07:50 +08:00
Cloud Wu
141a4d0992 lua 5.3.2 bugfix,see http://lua-users.org/lists/lua-l/2016-01/msg00000.html 2016-01-04 16:01:03 +08:00
fztcjjl
645ce72e7e fix comment error 2016-01-04 14:55:28 +08:00
cloudwu
fca4d67a43 Merge pull request #425 from DeanHH/patch-1
Update skynet_mq.c
2016-01-01 00:08:23 +08:00
DeanHH
014cbb9676 Update skynet_mq.c
Comment error:-)
2015-12-31 17:31:08 +08:00
16 changed files with 68 additions and 44 deletions

View File

@@ -419,8 +419,11 @@ luaS_clonestring(lua_State *L, TString *ts) {
result = query_ptr(ts);
if (result)
return result;
// ts is not in SSM, so recalc hash, and add it to SSM
h = luaS_hash(str, l, 0);
result = query_string(h, str, l);
if (result)
return result;
// ts is not in SSM, so recalc hash, and add it to SSM
return add_string(h, str, l);
}

View File

@@ -200,18 +200,19 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
for (loop = 0; loop < MAXTAGLOOP; loop++) {
const TValue *tm;
if (oldval != NULL) {
lua_assert(ttistable(t) && ttisnil(oldval));
Table *h = hvalue(t);
lua_assert(ttisnil(oldval));
/* must check the metamethod */
if ((tm = fasttm(L, hvalue(t)->metatable, TM_NEWINDEX)) == NULL &&
if ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL &&
/* no metamethod; is there a previous entry in the table? */
(oldval != luaO_nilobject ||
/* no previous entry; must create one. (The next test is
always true; we only need the assignment.) */
(oldval = luaH_newkey(L, hvalue(t), key), 1))) {
(oldval = luaH_newkey(L, h, key), 1))) {
/* no metamethod and (now) there is an entry with given key */
setobj2t(L, cast(TValue *, oldval), val);
invalidateTMcache(hvalue(t));
luaC_barrierback(L, hvalue(t), val);
invalidateTMcache(h);
luaC_barrierback(L, h, val);
return;
}
/* else will try the metamethod */

View File

@@ -1,3 +1,12 @@
v1.0.0-rc2 (2015-3-7)
-----------
* Fix a bug in lua 5.3.2
* Update sproto (fix bugs and add ud for package)
* Fix a bug in http
* Fix a bug in harbor
* Fix a bug in socket channel
* Enhance remote debugger
v1.0.0-rc (2015-12-28)
-----------
* Update to lua 5.3.2

View File

@@ -885,7 +885,12 @@ int lhmac_sha1(lua_State *L);
int
luaopen_crypt(lua_State *L) {
luaL_checkversion(L);
srandom(time(NULL));
static int init = 0;
if (!init) {
// Don't need call srandom more than once.
init = 1 ;
srandom(time(NULL));
}
luaL_Reg l[] = {
{ "hashkey", lhashkey },
{ "randomkey", lrandomkey },

View File

@@ -469,7 +469,7 @@ lpack(lua_State *L) {
size_t sz=0;
const void * buffer = getbuffer(L, 1, &sz);
// the worst-case space overhead of packing is 2 bytes per 2 KiB of input (256 words = 2KiB).
size_t maxsz = (sz + 2047) / 2048 * 2 + sz;
size_t maxsz = (sz + 2047) / 2048 * 2 + sz + 2;
void * output = lua_touserdata(L, lua_upvalueindex(1));
int bytes;
int osz = lua_tointeger(L, lua_upvalueindex(2));

View File

@@ -72,7 +72,8 @@ local function request(fd, method, host, url, recvheader, header, content)
body = body .. padding
end
else
body = nil
-- no content-length, read all
body = body .. socket.readall(fd)
end
end

View File

@@ -19,6 +19,8 @@ function sockethelper.readfunc(fd)
end
end
sockethelper.readall = socket.readall
function sockethelper.writefunc(fd)
return function(content)
local ok = writebytes(fd, content)

View File

@@ -125,19 +125,6 @@ local function _compose_packet(self, req, size)
return packet
end
local function _send_packet(self, req, size)
local sock = self.sock
self.packet_no = self.packet_no + 1
local packet = _set_byte3(size) .. strchar(self.packet_no) .. req
return socket.write(self.sock,packet)
end
local function _recv_packet(self,sock)
@@ -620,6 +607,10 @@ local function _query_resp(self)
while err =="again" do
res, err, errno, sqlstate = read_result(self,sock)
if not res then
mulitresultset.badresult = true
mulitresultset.err = err
mulitresultset.errno = errno
mulitresultset.sqlstate = sqlstate
return true, mulitresultset
end
mulitresultset[i]=res

View File

@@ -1,6 +1,4 @@
local io = io
local table = table
local debug = debug
return function (skynet, export)

View File

@@ -1,6 +1,6 @@
local skynet = require "skynet"
local debugchannel = require "debugchannel"
local socket = require "socket"
local socketdriver = require "socketdriver"
local injectrun = require "skynet.injectcode"
local table = table
local debug = debug
@@ -56,7 +56,7 @@ local function gen_print(fd)
tmp[i] = tostring(tmp[i])
end
table.insert(tmp, "\n")
socket.write(fd, table.concat(tmp, "\t"))
socketdriver.send(fd, table.concat(tmp, "\t"))
end
end
@@ -140,10 +140,13 @@ end
local function watch_proto(protoname, cond)
local proto = assert(replace_upvalue(skynet.register_protocol, "proto"), "Can't find proto table")
local p = proto[protoname]
local dispatch = p.dispatch_origin or p.dispatch
if p == nil or dispatch == nil then
if p == nil then
return "No " .. protoname
end
local dispatch = p.dispatch_origin or p.dispatch
if dispatch == nil then
return "No dispatch"
end
p.dispatch_origin = dispatch
p.dispatch = function(...)
if not cond or cond(...) then
@@ -208,7 +211,7 @@ local function hook_dispatch(dispatcher, resp, fd, channel)
local function debug_hook()
while true do
if newline then
socket.write(fd, prompt)
socketdriver.send(fd, prompt)
newline = false
end
local cmd = channel:read()
@@ -244,7 +247,9 @@ local function hook_dispatch(dispatcher, resp, fd, channel)
func = replace_upvalue(dispatcher, HOOK_FUNC, hook)
if func then
local function idle()
skynet.timeout(10,idle) -- idle every 0.1s
if raw_dispatcher then
skynet.timeout(10,idle) -- idle every 0.1s
end
end
skynet.timeout(0, idle)
end

View File

@@ -1,7 +1,4 @@
local si = require "snax.interface"
local io = io
local hotfix = {}
local function envid(f)
local i = 1

View File

@@ -411,10 +411,10 @@ end
function channel:close()
if not self.__closed then
local thread = assert(self.__dispatch_thread)
local thread = self.__dispatch_thread
self.__closed = true
close_channel_socket(self)
if not self.__response and self.__dispatch_thread == thread then
if not self.__response and self.__dispatch_thread == thread and thread then
-- dispatch by order, send close signal to dispatch thread
push_response(self, true, false) -- (true, false) is close signal
end

View File

@@ -180,9 +180,10 @@ end
local header_tmp = {}
local function gen_response(self, response, session)
return function(args)
return function(args, ud)
header_tmp.type = nil
header_tmp.session = session
header_tmp.ud = ud
local header = core.encode(self.__package, header_tmp)
if response then
local content = core.encode(response, args)
@@ -197,6 +198,7 @@ function host:dispatch(...)
local bin = core.unpack(...)
header_tmp.type = nil
header_tmp.session = nil
header_tmp.ud = nil
local header, size = core.decode(self.__package, bin, header_tmp)
local content = bin:sub(size + 1)
if header.type then
@@ -207,9 +209,9 @@ function host:dispatch(...)
result = core.decode(proto.request, content)
end
if header_tmp.session then
return "REQUEST", proto.name, result, gen_response(self, proto.response, header_tmp.session)
return "REQUEST", proto.name, result, gen_response(self, proto.response, header_tmp.session), header.ud
else
return "REQUEST", proto.name, result
return "REQUEST", proto.name, result, nil, header.ud
end
else
-- response
@@ -217,19 +219,20 @@ function host:dispatch(...)
local response = assert(self.__session[session], "Unknown session")
self.__session[session] = nil
if response == true then
return "RESPONSE", session
return "RESPONSE", session, nil, header.ud
else
local result = core.decode(response, content)
return "RESPONSE", session, result
return "RESPONSE", session, result, header.ud
end
end
end
function host:attach(sp)
return function(name, args, session)
return function(name, args, session, ud)
local proto = queryproto(sp, name)
header_tmp.type = proto.tag
header_tmp.session = session
header_tmp.ud = ud
local header = core.encode(self.__package, header_tmp)
if session then

View File

@@ -346,7 +346,6 @@ dispatch_name_queue(struct harbor *h, struct keyvalue * node) {
struct harbor_msg_queue * queue = node->queue;
uint32_t handle = node->value;
int harbor_id = handle >> HANDLE_REMOTE_SHIFT;
assert(harbor_id != 0);
struct skynet_context * context = h->ctx;
struct slave *s = &h->s[harbor_id];
int fd = s->fd;
@@ -366,6 +365,16 @@ dispatch_name_queue(struct harbor *h, struct keyvalue * node) {
push_queue_msg(s->queue, m);
}
}
if (harbor_id == (h->slave >> HANDLE_REMOTE_SHIFT)) {
// the harbor_id is local
struct harbor_msg * m;
while ((m = pop_queue(s->queue)) != NULL) {
int type = m->header.destination >> HANDLE_REMOTE_SHIFT;
skynet_send(context, m->header.source, handle , type | PTYPE_TAG_DONTCOPY, m->header.session, m->buffer, m->size);
}
release_queue(s->queue);
s->queue = NULL;
}
}
return;
}

View File

@@ -84,7 +84,7 @@ skynet_mq_create(uint32_t handle) {
SPIN_INIT(q)
// When the queue is create (always between service create and service init) ,
// set in_global flag to avoid push it to global queue .
// If the service init success, skynet_context_new will call skynet_mq_force_push to push it to global queue.
// If the service init success, skynet_context_new will call skynet_mq_push to push it to global queue.
q->in_global = MQ_IN_GLOBAL;
q->release = 0;
q->overload = 0;

View File

@@ -16,7 +16,7 @@ struct socket_server;
struct socket_message {
int id;
uintptr_t opaque;
int ud; // for accept, ud is listen id ; for data, ud is size of data
int ud; // for accept, ud is new connection id ; for data, ud is size of data
char * data;
};