You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 43 Next »

IDIEP-76
Author
Sponsor
Created

  

Status
DRAFT


Motivation

Thin client protocol will be the primary way to interact with Ignite 3.0 from code.

Description

Adapt Ignite 2.x protocol for Ignite 3.0. Main differences are:

TCP Socket

  • Every Ignite node listens on a TCP port. Thin client implementations connect to any node in the cluster (possibly multiple nodes) through a TCP socket and perform Ignite operations using a well-defined binary protocol.
  • Server-side connection parameters are defined in ClientConnectorConfiguration class.
    • Default port is 10800.
    • Connector is enabled by default, no configuration changes needed.
  • Netty is used on the server for network IO.

Data Format

MsgPack is used for data serialization.

Data Types Mapping

Ignite data types defined in IEP-54 map to MsgPack data types the following way:

Ignite Type

Size

MsgPack TypeNotes
Bitmask(n)n/8 bytesbin8 / bin16 / bin32
IntX, UintX1-8 bytesfixint / intX / uintXInteger types are interchangeable when possible. fixint (1 byte) can be passed as a value for uint64 column.
Float4 bytesfloat32
Double8 bytesfloat64
Number([n])Variableext16 (up to 2^8 - 1 bytes)Extension 1
DecimalVariableext16 (up to 2^8 - 1 bytes)Extension 2
UUID16 bytesfixext16Extension 3
StringVariablestr
Date3 bytesfixext4Extension 4
Time4 bytesfixext4Extension 5
Datetime7 bytesfixext8Extension 6
Timestamp8 bytestimestamp 64
BinaryVariablebin32 (up to 2^32 - 1 bytes)

"Extension X" is a MsgPack extension type (up to 128 extension types are allowed).

Integer data types, varint encoding

MsgPack provides multiple data types for integer values. When encoding a value, smallest data type for that value is picked automatically.

"int" is used below to denote int format family. Values such as payload size, request ID, error codes, are encoded this way - using variable number of bytes based on the value.

Message format

All messages, request and response, except handshake, start with int message length (excluding the length itself).

  • Any MsgPack int type can be used (see varint above). Empty message will be single 0 byte.
  • Maximum message length is 2147483647 (Integer.MAX_VALUE and maximum byte array length in Java)
int Length of Payload
...Payload

Tuple serialization

  • This IEP covers Table API - Ignite#tables(), which is the only public API available at the moment.
  • Table API operates on tuples (Tuple and TupleBuilder interfaces).
  • Tuple is a set of key-value pairs - column name and value.
  • Values can be of basic types described above and in IEP-54, according to the table schema. 
  • Table schema can evolve over time, columns get added and removed. Ignite tracks the evolution with incrementing integer schema version.
  • All schema versions are stored by Ignite. It is possible to retrieve the set of columns for any version.

A simple way to serialize a tuple would be to write a map (String → ...) from column name to value.

However, thanks to schema-first approach, we can avoid sending column names with the values (serializing strings is expensive). Instead, we can write integer schema version, and then an array of values for every column in that schema.

intSchema version
arrColumn values in schema order. nil when there is no value for a particular column.

To read or write a value for a column, we get the column type from the schema and use corresponding MsgPack data type according to Data Types Mapping above.

Tuple serialization (pseudocode)
for (Column col : tuple) {
	switch (col.type().spec()) {
    	case BYTE:
        	packer.packByte(tuple.byteValue(col.name()));
	        break;
	    case SHORT:
...

Key tuples

Key tuples are tuples with key columns only. Key columns always come first in the schema. So if there are 2 key columns, first two values of the tuple is the key.

Dynamic schema expansion (Live-schema)

IEP-54: Schema-first Approach includes "dynamic schema expansion" feature, which means that users can insert arbitrary tuples and Ignite will automatically update the schema with extra fields, if any.

To support this feature, we provide schemaless alternatives for all write operations (upsert, insert, etc).

Handshake


Request
4 bytesMagic number 49 47 4E 49, or "IGNI". Helps identifying misconfigured SSL or other apps probing the port.
intPayload length
intVersion major
intVersion minor
intVersion patch
intClient code (1 for JDBC, 2 for general-purpose client)
binFeatures (bitmask)
map (string → any)Extensions (auth, attributes, etc). Server can skip unknown extension data (when client is newer).


Response
4 bytesMagic number 49 47 4E 49, or "IGNI". Helps identifying misconfigured SSL or different server on the port.
intPayload length
intServer version major
intServer version minor
intServer version patch
intError code (0 for success)
stringError message (when error code is not 0)
binWhen error code is 0: Server features (bitmask)
map (string → any)When error code is 0: Extensions (auth, attributes, etc). Client can skip unknown extension data (when server is newer).

Client Operations

 Upon successful handshake client can start performing operations by sending a request with specific op code. Each operation has it's own request and response format, with a common header.

Request
intOperation code
intRequest id, generated by client and returned as-is in response
...Operation-specific data


Response
intType = 0
intRequest id
intError code (0 for success)
stringError message (when error code is not 0)
...Operation-specific data

Request or response without operation-specific data is called basic request or basic response below.

Notifications

Clients should expect notification messages at any moment after the successful handshake.

Notification
intType = 1
intNotification code
...Notification-specific data


Operation codes and request ids are omitted everywhere below for brevity.

TABLE_CREATE = 1

Request
mapconfiguration (name, partitions, replicas, columns, indices, ...) - according to TableConfigurationSchema


Response
UUIDtable ID

TABLE_DROP = 2

Request
stringtable name

Basic response.

TABLES_GET = 3

Basic request.

Response
intN = table count
N * (UUID + string)pairs of tables ids and names

TABLE_GET = 4

Request
stringtable name
Response
UUID or niltable ID or null when table with the given name does not exist

SCHEMAS_GET = 5

Request
UUIDtable ID
arr or nilschema IDs, or null to get all
Response
map (int → array (array))Map from schema ID to columns. Column is represented by an array of values for: name, type, isKey. The array can contain extra data in future for additional properties.

TUPLE_UPSERT = 10

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)

Basic response.

Client side is supposed to match provided columns against the latest known schema. If columns don't match, request the latest schema and try again.

TUPLE_GET = 11

Request
UUIDtable ID
intschema ID
arr or nilvalues for key columns (in schema order), or null when there is no record with the given key


Response
intschema id for the current tuple
arrtuple values in schema order

Clients should retrieve schemas with SCHEMAS_GET and cache them per table.

TUPLE_UPSERT_ALL = 12

Request
UUIDtable ID
intschema ID
arr of arrarray of rows with values for all columns in given schema (nil when value is missing for a column)

Basic response.

TUPLE_GET_ALL = 13

Request
UUIDtable ID
intschema ID
arr of arrarray of rows with values for key columns (in schema order)


Response
intschema ID (for all tuples in response)
arr of arrarray of rows with values in schema order. Any row can be null

TUPLE_GET_AND_UPSERT = 14

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
intschema id for the current tuple
arr or niltuple values in schema order, or null when there was no matching record

TUPLE_INSERT = 15

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)

Basic response.

TUPLE_INSERT_ALL = 16

Request
UUIDtable ID
intschema ID
arr of arrarray of rows with values for all columns in given schema (nil when value is missing for a column)

Basic response.

TUPLE_REPLACE = 17

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
boolReplace result

TUPLE_REPLACE2 = 18

Request
UUIDtable ID
intschema ID
arroldRec: values for all columns in given schema (nil when value is missing for a column)
arrnewRec: values for all columns in given schema (nil when value is missing for a column)
Response
boolReplace result

TUPLE_GET_AND_REPLACE = 19

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
intschema id for the current tuple
arr or niltuple values in schema order, or null when there was no matching record

TUPLE_DELETE = 20

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
boolDelete result

TUPLE_DELETE_ALL = 21

Request
UUIDtable ID
intschema ID
arr of arrarray of rows with values for all columns in given schema (nil when value is missing for a column)
Response
intschema ID (for all tuples in response)
arr of arrRecords that were not deleted: array of rows with values in schema order.

TUPLE_DELETE_EXACT = 22

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
boolDelete result

TUPLE_DELETE_ALL_EXACT = 23

Request
UUIDtable ID
intschema ID
arr of arrarray of rows with values for all columns in given schema (nil when value is missing for a column)
Response
intschema ID (for all tuples in response)
arr of arrRecords that were not deleted: array of rows with values in schema order.

TUPLE_GET_AND_DELETE = 24

Request
UUIDtable ID
intschema ID
arrvalues for all columns in given schema (nil when value is missing for a column)
Response
intschema id for the current tuple
arr or niltuple values in schema order, or null when there was no matching record

Risks and Assumptions

  • This IEP covers handshake and Tables API, which is the only public API available at the moment.
  • Invoke API is out of scope: code deployment and processor serialization should be designed separately.

Discussion Links

Reference Links

Tickets

key summary type created updated due assignee reporter priority status resolution

JQL and issue key arguments for this macro require at least one Jira application link to be configured

  • No labels