Skip to content
Snippets Groups Projects
Commit 6b171db2 authored by Vladislav Shpilevoy's avatar Vladislav Shpilevoy
Browse files

rfc: describe a Tarantool wire protocol

Part of #3328
parent 2821872e
No related branches found
No related tags found
No related merge requests found
# Tarantool Wire protocol
* **Status**: In progress
* **Start date**: 04-04-2018
* **Authors**: Vladislav Shpilevoy @Gerold103 v.shpilevoy@tarantool.org, Konstantin Osipov @kostja kostja@tarantool.org, Alexey Gadzhiev @alg1973 alg1973@gmail.com
* **Issues**: [#2677](https://github.com/tarantool/tarantool/issues/2677), [#2620](https://github.com/tarantool/tarantool/issues/2620), [#2618](https://github.com/tarantool/tarantool/issues/2618)
## Summary
Tarantool wire protocol is a convention for encoding and sending execution results of SQL, Lua and C stored functions, DML (Data Manipulation Language), DDL (Data Definition Language), DQL (Data Query Language). The protocol is unified for all request types. For a single request multiple responses of different types can be sent.
## Background and motivation
Tarantool wire protocol is called **IProto**, and is used by database connectors written in different languages and accessing the database via network. The protocol describes how to distinguish different message types and what data can be stored in each message. Tarantool response messages can be of the following kind:
* A response, which represents a single reply to a request or completes a chain of replies. There are two response types of this kind: OK and ERROR. Error response is trivial, and contains an error code and message. OK response may contain useful payload, such as result set rows or metadata.
* A response which is a part of a chain of replies - a so called PUSH-message. Multiple push messages can be sent in response to a single request, but they never indicate an end of reply stream: the end is always flagged by a response of the previous kind.
In support of this response set 2 main challenges appear:
1. How to unify responses;
2. How to support multiple messages inside a single request.
A response which contains a payload can contain either data or metadata, or both. If it is necessary to share the same response metadata among multiple PUSH messages, the metadata can be assigned a numeric identifier (PUSH ID) and referenced in the stream by this identifier.
The metadata itself can contain:
* affected row count, last autoincrement column value, flags (such metadata
is sent in response to DML statements such as INSERT/UPDATE/DELETE);
* column count, names and types (used to describe result set rows that
follow).
To understand how a single request can produce multiple responses, consider the stored procedure (do not pay attention to the syntax - it does not matter here):
```SQL
FUNCTION my_sql_func(a1, a2, a3, a4) BEGIN
SELECT my_lua_func(a1);
SELECT * FROM table1;
SELECT my_c_func(a2);
INSERT INTO table1 VALUES (1, 2, 3);
RETURN a4;
END;
```
, where `my_lua_func()` is the function, written in Lua and sending its own push-messages:
```Lua
function my_lua_func(arg)
box.session.push(arg)
return arg
end
```
and `my_c_func()` is the function, written in C and returning some raw data:
```C
int
my_c_func(box_function_ctx_t *ctx) {
box_tuple_t *tuple;
/* Fill the tuple with any data. */
return box_return_tuple(ctx, tuple);
}
```
Consider each statement:
* `SELECT FROM` can split a big result set into multiple messages;
* `SELECT my_lua_func()` produces 2 messages: one is the push-message generated in `my_lua_func` and another is the result of `SELECT` itself;
* `INSERT` creates 1 message with metadata;
* `RETURN` creates a final response message.
Of course, some of messages, or even all of them can be batched and sent as a single TCP packet.
In the next section we specify code names and messages used by the protocol.
For the protocol details - code values, all header and body keys - see Tarantool [website](https://tarantool.io/).
## Detailed design
Tarantool response consists of a body and a header. Header is used to store response code and some internal metainfo such as schema version, request id (called **sync** in Tarantool). Body is used to store result data and request-dependent metainfo.
### Header
There are 3 response codes in header:
* `IPROTO_OK` - the terminal response to a successful request;
* `IPROTO_ERROR | error code` - the terminal response to a request, which ended with an error.
* `IPROTO_PUSH` - non-final response. One request can generate multuple PUSH messages;
`IPROTO_ERROR` response is trivial, and consists just of code and message.
`IPROTO_OK` and `IPROTO_PUSH` have the same body format. But
1. `IPROTO_OK` finalizes a request;
2. `IPROTO_PUSH` can have `IPROTO_PUSH_ID` field in the header, that allows to build a chain of pushes with the same `ID`. Absense of this field means, that the push is not a part of a chain. All pushes which are part of the same chain (are identified by the same id) should share chain metadata.
### Body
The common body structure:
```
+----------------------------------------------+
| IPROTO_BODY: { |
| IPROTO_METADATA: [ |
| { |
| IPROTO_FIELD_NAME: string, |
| IPROTO_FIELD_TYPE: number, |
| IPROTO_FIELD_FLAGS: number, |
| }, |
| ... |
| ], |
| |
| IPROTO_SQL_INFO: { |
| SQL_INFO_ROW_COUNT: number, |
| SQL_INFO_LAST_ID: number, |
| ... |
| }, |
| |
| IPROTO_DATA: [ |
| tuple/scalar, |
| ... |
| ] |
| } |
+----------------------------------------------+
```
Consider, how different responses use the body, and how they can be distinguished.
_A non formatted response_ has only `IPROTO_DATA` key in a body. It is the result of Lua and C DML, DDL, DQL, stored procedures calls, push messages. Such response is never linked with the next or previous messages of the same request.
_A non formatted response with metadata_ has only `IPROTO_SQL_INFO` and it is always a result of DDL/DML executed via SQL. As well as the previous type, this response is independent from other messages in the stream.
_A formatted response_ always has `IPROTO_DATA`, and can have both `IPROTO_SQL_INFO` and `IPROTO_METADATA`. It is a result of SQL DQL (`SELECT`) or SQL DML (`INSERT`). The response can be part of a stream. The first message of the stream always contains `IPROTO_METADATA` in the body and sets `IPROTO_PUSH_ID` in the header, should there be multiple messages sharing the same metadata. All other messasges in the stream contain `IPROTO_PUSH_ID` with the same value.
On the picture the state machine of the protocol is showed:
![alt text](https://raw.githubusercontent.com/tarantool/tarantool/gerold103/gh-3328-new-iproto/doc/rfc/3328-wire_protocol_img1.svg?sanitize=true)
For a call to `FUNCTION my_sql_func` the following responses are sent:
```
/* Push from my_lua_func(a1). */
+----------------------------------------------+
| HEADER: IPROTO_PUSH |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ a1 ] |
| } |
+----------------------------------------------+
/* Result of SELECT my_lua_func(a1). */
+----------------------------------------------+
| HEADER: IPROTO_PUSH |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ [ a1 ] ], |
| IPROTO_METADATA: [ |
| { /* field name, type ... */ } |
| ] |
| } |
+----------------------------------------------+
/* First push of SELECT * FROM table1. */
+----------------------------------------------+
| HEADER: IPROTO_PUSH, IPROTO_PUSH_ID = <id1> |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ tuple1, tuple2, ... ] |
| IPROTO_METADATA: [ |
| { /* field1 name, type ... */ }, |
| { /* field2 name, type ... */ }, |
| ... |
| ] |
| } |
+----------------------------------------------+
/* From second to last push. */
+----------------------------------------------+
| HEADER: IPROTO_PUSH, IPROTO_PUSH_ID = <id1> |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ tuple1, tuple2, ... ] |
| } |
+----------------------------------------------+
/* Result of SELECT my_c_func(a2). */
+----------------------------------------------+
| HEADER: IPROTO_PUSH |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ [ tuple ] ], |
| IPROTO_METADATA: [ |
| { /* field name, type ... */ } |
| ] |
| } |
+----------------------------------------------+
/* Result of INSERT INTO table1 VALUES (1, 2, 3). */
+----------------------------------------------+
| HEADER: IPROTO_PUSH |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_SQL_INFO: { |
| SQL_INFO_ROW_COUNT: number, |
| SQL_INFO_LAST_ID: number, |
| } |
| } |
+----------------------------------------------+
/* Result of RETURN a4 */
+----------------------------------------------+
| HEADER: IPROTO_OK |
+- - - - - - - - - - - - - - - - - - - - - - - +
| BODY: { |
| IPROTO_DATA: [ a4 ] |
| } |
+----------------------------------------------+
```
## Rationale and alternatives
Another way to link pushes together exists, replacing `IPROTO_PUSH_ID`.
Pushes can be linked via flag in a header: `IPROTO_FLAG_IS_CHAIN`, that would be stored in `IPROTO_FLAGS` header value. When a multiple messages form a chain, all of them except last one contain this flag. For example:
```
IPROTO_PUSH
|
IPROTO_PUSH, IS_CHAIN
|
+--IPROTO_PUSH, IS_CHAIN
|
+--IPROTO_PUSH, IS_CHAIN
|
+--IPROTO_PUSH
|
IPROTO_PUSH
|
...
|
IPROTO_OK/ERROR
```
It is slightly simpler than `PUSH_ID`, but
1. Does not enable to mix parts of different chains, if it will be needed sometimes;
2. The last response does not contain `IS_CHAIN`, but it is actually a part of chain. `IS_CHAIN` can not be stored in the last response, because else it will not be distinguishable from the next chain. This can be solved by renaming `IS_CHAIN` to `HAS_NEXT_CHAIN` or something, but `PUSH_ID` seems better - it has no these problems, and is more scalable.
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="697px" height="544px" version="1.1" content="&lt;mxfile userAgent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Safari/605.1.15&quot; version=&quot;8.8.7&quot; editor=&quot;www.draw.io&quot; type=&quot;google&quot;&gt;&lt;diagram id=&quot;435cd5a9-9e28-c869-87b9-da134b84e446&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g transform="translate(0.5,0.5)"><rect x="336" y="53" width="160" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(401.5,76.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="28" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 29px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Initial<br /></div></div></foreignObject><text x="14" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Initial&lt;br&gt;</text></switch></g><rect x="136" y="233" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(137.5,249.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="116" height="26" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 116px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SQL DQL responses sequence</div></div></foreignObject><text x="58" y="19" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">SQL DQL responses sequence</text></switch></g><path d="M 376 113 L 376 163 Q 376 173 366 173 L 316 173 Q 306 173 306 183 L 306 238 Q 306 248 296 248 L 262.37 248" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 257.12 248 L 264.12 244.5 L 262.37 248 L 264.12 251.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(232.5,160.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="147" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_MEDATADA</font><br /><font color="#0600b5">push_id = IPROTO_PUSH_ID</font><br /></div></div></foreignObject><text x="74" y="18" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 136 263 L 86 263 Q 76 263 76 273 L 76 383 Q 76 393 86 393 L 129.63 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 134.88 393 L 127.88 396.5 L 129.63 393 L 127.88 389.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5,305.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="153" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900"><span>IPROTO_PUSH<br /></span>IPROTO_PUSH_ID</font> == <font color="#0600b5">push_id</font><br /></div></div></foreignObject><text x="77" y="18" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="356" y="483" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(403.5,506.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="25" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 26px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">EOF</div></div></foreignObject><text x="13" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">EOF</text></switch></g><path d="M 196 363 L 196 299.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 196 294.12 L 199.5 301.12 L 196 299.37 L 192.5 301.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 196 233 L 196 93 Q 196 83 206 83 L 329.63 83" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 334.88 83 L 327.88 86.5 L 329.63 83 L 327.88 79.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(120.5,120.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="150" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_PUSH<br /></font><font color="#009900">IPROTO_PUSH_ID </font>!= <font color="#0600b5">push_id</font><br /></div></div></foreignObject><text x="75" y="18" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 256 278 L 296 278 Q 306 278 306 288 L 306 503 Q 306 513 316 513 L 349.63 513" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 354.88 513 L 347.88 516.5 L 349.63 513 L 347.88 509.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(271.5,417.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="70" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_OK</font></div></div></foreignObject><text x="35" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="356" y="233" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(357.5,249.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="116" height="26" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 116px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Non-formatted response.</div></div></foreignObject><text x="58" y="19" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Non-formatted response.</text></switch></g><path d="M 416 113 L 416 226.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 416 231.88 L 412.5 224.88 L 416 226.63 L 419.5 224.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(357.5,190.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="117" height="26" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><span><font color="#cc0000">IPROTO_MEDATADA<br /></font></span><font color="#cc0000">IPROTO_SQL_INFO</font><br /></div></div></foreignObject><text x="59" y="19" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 416 293 L 416 476.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 416 481.88 L 412.5 474.88 L 416 476.63 L 419.5 474.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(381.5,417.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="70" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_OK</font></div></div></foreignObject><text x="35" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="576" y="233" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(583.5,256.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="105" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 106px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SQL DML response</div></div></foreignObject><text x="53" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">SQL DML response</text></switch></g><path d="M 456 113 L 456 163 Q 456 173 466 173 L 516 173 Q 526 173 526 183 L 526 238 Q 526 248 536 248 L 569.63 248" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 574.88 248 L 567.88 251.5 L 569.63 248 L 567.88 244.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(471.5,160.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="108" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><span><font color="#009900">IPROTO_SQL_INFO</font></span><span><font color="#cc0000"><br />IPROTO_MEDATADA</font></span><br /></div></div></foreignObject><text x="54" y="18" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 576 278 L 536 278 Q 526 278 526 288 L 526 503 Q 526 513 516 513 L 482.37 513" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 477.12 513 L 484.12 509.5 L 482.37 513 L 484.12 516.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(489.5,415.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="70" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_OK</font></div></div></foreignObject><text x="35" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(197.5,5.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="427" height="28" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 25px">Tarantool Wire Protocol State Machine</font></div></div></foreignObject><text x="214" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">&lt;font style="font-size: 25px"&gt;Tarantool Wire Protocol State Machine&lt;/font&gt;</text></switch></g><ellipse cx="196" cy="393" rx="60" ry="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(142.5,386.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="107" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 108px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Read next response</div></div></foreignObject><text x="54" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read next response</text></switch></g><ellipse cx="636" cy="83" rx="60" ry="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(582.5,76.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="107" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 108px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Read next response</div></div></foreignObject><text x="54" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read next response</text></switch></g><path d="M 636 233 L 636 119.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 636 114.12 L 639.5 121.12 L 636 119.37 L 632.5 121.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(596.5,171.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">IPROTO_PUSH<br /></font></div></div></foreignObject><text x="43" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 576 83 L 502.37 83" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 497.12 83 L 504.12 79.5 L 502.37 83 L 504.12 86.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/></g></svg>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment