[tarantool-patches] Re: [PATCH] box: add tuple:size function

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed Oct 17 23:36:53 MSK 2018



On 17/10/2018 21:14, Konstantin Osipov wrote:
> * Vladislav Shpilevoy <v.shpilevoy at tarantool.org> [18/10/17 21:12]:
> 
>> Also, some people can use it right now to allocate a
>> buffer of a correct size before calling box_tuple_to_buf.
>> I understand, that box_tuple_to_buf(tuple, NULL, 0) returns
>> bsize as well, but some people could miss it, or just use
>> box_tuple_bsize because it looks better when you write like
>> this:
>>
>>      size = box_tuple_bsize(tuple)
>>      buf = alloc(size)
>>      box_tuple_to_buf(tuple, buf, size)
>>
>> than like this:
>>
>>      size = box_tuple_to_buf(tuple, NULL, 0) // <- difference
>>      buf = alloc(size)
>>      box_tuple_to_buf(tuple, buf, size)
>>
>> Even if we close eyes on the fact, that a user of
>> the first way will allocate more data than needed,
>> imagine, that then he does something like this:
>>
>>      send(sockfd, buf, size)
>>
>> Now, he send some garbage uninitialized data of 14
>> bytes at the end of buf.
> 
> Is there any known use?
> 

It is a strange question, especially from you. Open
source public API's nature is to be assumed as being
used right now in a real project. When a product is
free and open source, you can not be sure how many
users do you have exactly and who uses which API, so
you HAVE to assume that each API function is used
somewhere in all possible ways.

At first, it can be used in some GitHub project as
Alexander underlined, in some connectors. At second,
not all projects are hosted on GH. Out API can be
used in any imaginable proprietary project.

As I said, I knew you will not believe me, but if you
asked about why somebody needs 'send' in their Tarantool
module, I would answer this:

* it can be a customer's proxy - he could create own
   TCP server in front of Tarantool to send/receive
   tuples with very simplified protocol, easier than
   IProto, or to just convert to protocol of another DB;

* it is not necessary 'send'. It can be 'write' to a
   disk. For example, Tarantool is an extra light and
   fast in-memory cache for some non-critical data, that
   is persisted by user's facilities, or in another DB,
   having disk storage;

* it can be Mons-like weird way to get tuple data
   without iterating over it via box_tuple_iterator nor
   copying into buf:

       const char *tuple_whole_data = box_tuple_field(tuple, 0);
       size_t tuple_msgpack_size = box_tuple_size(tuple);
       /*
        * then use whole range
        * [tuple_whole_data, tuple_whole_data + tuple_msgpack_size]
        */

   I know that it is illegal way, but it works now, and allows to
   do not copy data.
   




More information about the Tarantool-patches mailing list