[
https://issues.apache.org/jira/browse/IGNITE-23120?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18002700#comment-18002700
]
Philipp Shergalis edited comment on IGNITE-23120 at 7/7/25 10:12 AM:
---------------------------------------------------------------------
[~timonin.maksim] Hi! I updated PR so:
* real page size is used, number of children can be easily changed in future
* inline recommender warns if inline is too big and recommends to reduce it /
increase page size
* reverted changes to {*}computeInlineSize{*}, though they fixed 2 unrelated
bugs
I don't see any tests for inline recommender :( TBH I don't want to introduce
them myself
Unrelated bugs:
1. We break loop for calculating *size* if limit is exceeded, but we could skip
fields with not fixed size
{code:java}
fixedSize &= keyType.keySize() != -1;
...
if (size > propSize) {
size = propSize;
break;
} {code}
1. *size* is limited by property and {*}sqlIndexMaxInlineSize{*}, but for
*!fixedSize* case we return configured size that could exceed them.
{code:java}
if (cfgInlineSize != -1) {
cfgInlineSize = Math.min(PageIO.MAX_PAYLOAD_SIZE, cfgInlineSize);
if (fixedSize && size < cfgInlineSize) {
...
return size;
}
return cfgInlineSize;
}
{code}
was (Author: JIRAUSER303902):
[~timonin.maksim] Hi! I updated PR so:
* real page size is used, number of children can be easily changed in future
* inline recommender warns if inline is too big and recommends to reduce it /
increase page size
* reverted changes to computeInlineSize, though they fixed 2 unrelated bugs
I don't see any tests for inline recommender :( TBH I don't want to introduce
them myself
Unrelated bugs:
1. We break loop for calculating size if limit is exceeded, but we could skip
fields with not fixed size
{code:java}
fixedSize &= keyType.keySize() != -1;
...
if (size > propSize) {
size = propSize;
break;
} {code}
1. ```size``` is limited by property and ```sqlIndexMaxInlineSize```, but for
```!fixedSize``` case we return configured size that could exceed them.
{code:java}
if (cfgInlineSize != -1) {
cfgInlineSize = Math.min(PageIO.MAX_PAYLOAD_SIZE, cfgInlineSize);
if (fixedSize && size < cfgInlineSize) {
log.warning("Explicit INLINE_SIZE for fixed size index item is too big.
" +
"This will lead to wasting of space inside index pages. Ignoring " +
"[index=" + name + ", explicitInlineSize=" + cfgInlineSize + ",
realInlineSize=" + size + ']');
return size;
}
return cfgInlineSize;
}
{code}
> Improve inline index feature
> ----------------------------
>
> Key: IGNITE-23120
> URL: https://issues.apache.org/jira/browse/IGNITE-23120
> Project: Ignite
> Issue Type: Improvement
> Reporter: Vladimir Pligin
> Assignee: Philipp Shergalis
> Priority: Major
>
> Ignite allows index rows to be inlined directly into the page. However, it
> doesn’t guard properly against too big inline size values. Currently, it uses
> {{PageIO.MAX_PAYLOAD_SIZE}} as the maximum allowed value, but this value can
> still be too large, because it does not take the page size and encryption
> (which adds additional bytes to the page header) into account. This possibly
> leads to a bad situation when only one item can fit in one page which can
> lead to BTree performance degradation.
> The following is expected to be done:
> # When inline size for an index is set, a maximum inline size should be
> computed:
> ## Considering we want to have _at least_ 2 items per page, here’s how the
> page layout with max inline size will look like: {{PS = H + L + I + L + I +
> L}} . Where PS - Page Size, H - page header size, L - size of the child link,
> I - item size.
> ## Using the above equation, we get the max possible item size to be equal
> to: {{I = (PS - H - 3L) / 2}} . However, for inline indexes, every item has
> an additional overhead to the actual inlined value (a.k.a payload), which
> depends on MVCC being present.
> ## Taking this into account, the maximum payload size will be equal: {{P =
> (PS - H - 3L) / 2 - X}} , where P - Payload size, X - overhead per item.
> ## In implementation terms, {{PS}} must be computed using the
> {{PageMemory#realPageSize}} which takes encryption overhead into
> account,{{{}H{}}} is equal to {{{}BPlusIo#ITEMS_OFF{}}}, {{L}} is 8 bytes and
> {{X}} depends on the actual {{AbstractH2ExtrasInnerIO}} implementation and
> varies between 8 and 28 bytes.
> # If the configured inline size exceeds the computed maximum size or
> {{PageIO.MAX_PAYLOAD_SIZE}} then an exception must be thrown with a message
> that notifies the user of the incorrect inline size value. Note that this
> should only happen for _new_ indexes, if a nodes is started on top of an
> existing PDS, no exceptions should be thrown and a warning should be printed
> instead, to preserve backwards compatibility.
> # Fix the “Indexed columns of a row cannot be fully inlined into index”
> warning to recommend at most the maximum allowed inline size.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)