← Back to team overview

maria-developers team mailing list archive

Re: MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon INSERT into RocksDB table

 

Hi Varun,

> MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon INSERT into RocksDB table
>
> For INET6 columns the values are stored as BINARY columns and returned to the client in TEXT format.
> For rocksdb the indexes store mem-comparable images for columns, so use the pack_length() to store
> the mem-comparable form for INET6 columns. This would also remain consistent with CHAR columns.
>
> diff --git a/storage/rocksdb/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc
> index 21a9b57b555e..6e73535d1de7 100644
> --- a/storage/rocksdb/rdb_datadic.cc
> +++ b/storage/rocksdb/rdb_datadic.cc
> @@ -3317,7 +3317,9 @@ bool Rdb_field_packing::setup(const Rdb_key_def *const key_descr,
>        field->field_length = field->char_length() * cs->mbmaxlen.
>      */
>      const CHARSET_INFO *cs = field->charset();
> -    m_max_image_len = cs->strnxfrmlen(field->field_length);
> +    m_max_image_len = cs->strnxfrmlen(type == MYSQL_TYPE_STRING ?
> +                                      field->pack_length() :
> +                                      field->field_length);

Field::pack_length is defined as:

  /*
    pack_length() returns size (in bytes) used to store field data in memory
    (i.e. it returns the maximum size of the field in a row of the table,
    which is located in RAM).
  */
  virtual uint32 pack_length() const { return (uint32) field_length; }

so, it is size in bytes, while strnxfrmlen() accepts length *in characters*.
That is, strnxfrmlen(field->pack_length()) is certainly not correct.

Rdb_field_packing::m_max_image_len is defined as:

  /* Length of mem-comparable image of the field, in bytes */
  int m_max_image_len;

while pack_length() seems to describe table->record[0] format (or is it
KeyTupleFormat) ?

Field::sort_length() doesn't have a definition but it seems to be a closer
match as it describes the length of the mem-comparable form?


BR
 Sergei
-- 
Sergei Petrunia, Software Developer
MariaDB Corporation | Skype: sergefp | Blog: http://s.petrunia.net/blog