From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 9399F29264 for ; Fri, 1 Jun 2018 16:56:02 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TdMuJfH_Zu17 for ; Fri, 1 Jun 2018 16:56:02 -0400 (EDT) Received: from smtp40.i.mail.ru (smtp40.i.mail.ru [94.100.177.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 472F329254 for ; Fri, 1 Jun 2018 16:56:02 -0400 (EDT) From: Vladislav Shpilevoy Subject: [tarantool-patches] [PATCH v3 0/4] box.session.push Date: Fri, 1 Jun 2018 23:55:54 +0300 Message-Id: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org Cc: kostja@tarantool.org Branch: http://github.com/tarantool/tarantool/tree/gh-2677-box-session-push Issue: https://github.com/tarantool/tarantool/issues/2677 Sometimes it is needed to send some intermediate results from long poll request. Or to create a watcher on a server side, which listens for some events and sends notifications to a client. Or split a big response into multiple ones, as it is described in Tarantool Wire Protocol RFC. IPROTO_CHUNK protocol command solves all of the problems. IPROTO_CHUNK is a non-final response, and a single request can produce multiple response chunks. Box.session.push is API to send a chunk. It takes a Lua object and sends it to a client using the way depending of a session type: console or binary. Console session pushes are YAML documents tagged with using YAML %TAG feature - push message is tagged with !push! tag. For example: tarantool> box.session.push({a = 100, b = 200}) %TAG !push! tag:tarantool.io/push,2018 --- <--------- Here pushed message starts. a: 100 b: 200 ... --- <--------- Here push() call result starts. - true ... It is not the same as future console.print() pushes - they are not linked with chunks. Binary push is an IProto response with IPROTO_CHUNK key in the REQUEST_TYPE header field. In the rest it has the same structure as any another response. IPROTO_CHUNK response must have the same sync as a request, and to avoid specifying it in the box.session.push() API, that is ugly, the request sync is stored in the local storage of the fiber that executes the request. Sync key does not extend the storage size - instead it shares one of storage cells with another fiber local variable, that is never used in IProto sessions. Vladislav Shpilevoy (4): session: introduce text box.session.push session: enable box.session.push in local console session: introduce binary box.session.push netbox: introduce iterable future objects src/box/iproto.cc | 241 +++++++++++++++++----- src/box/iproto_constants.h | 3 + src/box/lua/call.c | 4 + src/box/lua/console.c | 75 ++++++- src/box/lua/console.lua | 29 ++- src/box/lua/net_box.lua | 188 ++++++++++++++--- src/box/lua/session.c | 6 +- src/box/port.c | 7 + src/box/port.h | 17 ++ src/box/xrow.c | 12 ++ src/box/xrow.h | 12 ++ src/diag.h | 3 + src/fiber.h | 14 +- src/sio.cc | 16 ++ test/app-tap/console.test.lua | 6 +- test/box/net.box.result | 8 +- test/box/net.box.test.lua | 8 +- test/box/push.result | 461 ++++++++++++++++++++++++++++++++++++++++-- test/box/push.test.lua | 227 +++++++++++++++++++-- 19 files changed, 1218 insertions(+), 119 deletions(-) -- 2.15.1 (Apple Git-101)