[
https://issues.apache.org/jira/browse/PHOENIX-8017?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrew Kyle Purtell updated PHOENIX-8017:
-----------------------------------------
Description:
A write to a data table fails when the table has both a LOCAL index and a CDC
index. The region server rejects the batch with an
IndexBuildingFailureException:
{noformat}
java.lang.IllegalArgumentException: Encoded region name is required
for a CDC index
at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1725)
at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1718)
at PhoenixIndexCodec.getIndexDeletes(PhoenixIndexCodec.java:144)
at NonTxIndexBuilder.addDeleteUpdatesToMap(
NonTxIndexBuilder.java:225)
at NonTxIndexBuilder.addCleanupForCurrentBatch(
NonTxIndexBuilder.java:157)
...
at IndexBuildManager.getIndexUpdates(IndexBuildManager.java:102)
at IndexRegionObserver.handleLocalIndexUpdates(
IndexRegionObserver.java:1128)
{noformat}
An insert of a new row fails at a different frame with the same exception:
{noformat}
at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1325)
at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1318)
at PhoenixIndexCodec.getIndexUpserts(PhoenixIndexCodec.java:113)
...
{noformat}
Steps to reproduce
{noformat}
CREATE TABLE T (K INTEGER PRIMARY KEY, V1 INTEGER, V2 INTEGER);
UPSERT INTO T VALUES (1, 10, 100);
CREATE LOCAL INDEX T_IDX ON T (V1) INCLUDE (V2);
CREATE CDC T_CDC ON T;
UPSERT INTO T VALUES (1, 11, 101); -- fails
UPSERT INTO T VALUES (2, 20, 200); -- fails
DELETE FROM T WHERE K = 1; -- fails
{noformat}
IndexRegionObserver.handleLocalIndexUpdates passes the entire batch's
PhoenixIndexMetaData to the index builder, including all client-provided
maintainers (local, covered/uncovered global, CDC, and transform).
PhoenixIndexCodec generates delete and upsert mutations for every maintainer in
the set, even though handleLocalIndexUpdates ultimately discards everything
except local index updates (non-local updates are handled elsewhere in the
observer). Since PHOENIX-7425, a CDC index requires the encoded region name as
its leading row key column. When the codec calls IndexMaintainer.buildRowKey
without it, this throws an exception, and all write operations fail during
local index preparation simply trying to construct CDC updates that would be
discarded anyway.
The fix modifies handleLocalIndexUpdates to restrict the metadata passed to the
index builder, aligning with how the observer classifies maintainers elsewhere.
If a batch contains only local indexes, the original metadata is reused as-is
to avoid overhead and preserve existing behavior. Eliminating non-local
maintainers stops the local path from building and immediately discarding
global updates, allowing the prior row scan to fetch only the columns required
by local indexes.
was:
A write to a data table fails when the table has both a LOCAL index and a CDC
index. The region server rejects the batch with an
IndexBuildingFailureException:
{noformat}
java.lang.IllegalArgumentException: Encoded region name is required
for a CDC index
at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1725)
at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1718)
at PhoenixIndexCodec.getIndexDeletes(PhoenixIndexCodec.java:144)
at NonTxIndexBuilder.addDeleteUpdatesToMap(
NonTxIndexBuilder.java:225)
at NonTxIndexBuilder.addCleanupForCurrentBatch(
NonTxIndexBuilder.java:157)
...
at IndexBuildManager.getIndexUpdates(IndexBuildManager.java:102)
at IndexRegionObserver.handleLocalIndexUpdates(
IndexRegionObserver.java:1128)
{noformat}
An insert of a new row fails at a different frame with the same exception:
{noformat}
at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1325)
at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1318)
at PhoenixIndexCodec.getIndexUpserts(PhoenixIndexCodec.java:113)
...
{noformat}
Steps to reproduce
{noformat}
CREATE TABLE T (K INTEGER PRIMARY KEY, V1 INTEGER, V2 INTEGER);
UPSERT INTO T VALUES (1, 10, 100);
CREATE LOCAL INDEX T_IDX ON T (V1) INCLUDE (V2);
CREATE CDC T_CDC ON T;
UPSERT INTO T VALUES (1, 11, 101); -- fails
UPSERT INTO T VALUES (2, 20, 200); -- fails
DELETE FROM T WHERE K = 1; -- fails
{noformat}
IndexRegionObserver.handleLocalIndexUpdates passes the entire batch's
PhoenixIndexMetaData to the index builder, including all client-provided
maintainers (local, covered/uncovered global, CDC, and transform).
PhoenixIndexCodec generates delete and upsert mutations for every maintainer in
the set, even though handleLocalIndexUpdates ultimately discards everything
except local index updates (non-local updates are handled elsewhere in the
observer). Since PHOENIX-7425, a CDC index requires the encoded region name as
its leading row key column. When the codec calls IndexMaintainer.buildRowKey
without it, this throws an exception, and all write operations fail during
local index preparation simply trying to construct CDC updates that would be
discarded anyway.
> Writes fail on a table with both a local index and a CDC index
> --------------------------------------------------------------
>
> Key: PHOENIX-8017
> URL: https://issues.apache.org/jira/browse/PHOENIX-8017
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 5.3.2
> Reporter: Andrew Kyle Purtell
> Assignee: Andrew Kyle Purtell
> Priority: Major
> Fix For: 5.4.0, 5.3.3
>
>
> A write to a data table fails when the table has both a LOCAL index and a CDC
> index. The region server rejects the batch with an
> IndexBuildingFailureException:
> {noformat}
> java.lang.IllegalArgumentException: Encoded region name is required
> for a CDC index
> at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
> at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1725)
> at IndexMaintainer.buildDeleteMutation(IndexMaintainer.java:1718)
> at PhoenixIndexCodec.getIndexDeletes(PhoenixIndexCodec.java:144)
> at NonTxIndexBuilder.addDeleteUpdatesToMap(
> NonTxIndexBuilder.java:225)
> at NonTxIndexBuilder.addCleanupForCurrentBatch(
> NonTxIndexBuilder.java:157)
> ...
> at IndexBuildManager.getIndexUpdates(IndexBuildManager.java:102)
> at IndexRegionObserver.handleLocalIndexUpdates(
> IndexRegionObserver.java:1128)
> {noformat}
> An insert of a new row fails at a different frame with the same exception:
> {noformat}
> at IndexMaintainer.buildRowKey(IndexMaintainer.java:769)
> at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1325)
> at IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:1318)
> at PhoenixIndexCodec.getIndexUpserts(PhoenixIndexCodec.java:113)
> ...
> {noformat}
> Steps to reproduce
> {noformat}
> CREATE TABLE T (K INTEGER PRIMARY KEY, V1 INTEGER, V2 INTEGER);
> UPSERT INTO T VALUES (1, 10, 100);
> CREATE LOCAL INDEX T_IDX ON T (V1) INCLUDE (V2);
> CREATE CDC T_CDC ON T;
> UPSERT INTO T VALUES (1, 11, 101); -- fails
> UPSERT INTO T VALUES (2, 20, 200); -- fails
> DELETE FROM T WHERE K = 1; -- fails
> {noformat}
> IndexRegionObserver.handleLocalIndexUpdates passes the entire batch's
> PhoenixIndexMetaData to the index builder, including all client-provided
> maintainers (local, covered/uncovered global, CDC, and transform).
> PhoenixIndexCodec generates delete and upsert mutations for every maintainer
> in the set, even though handleLocalIndexUpdates ultimately discards
> everything except local index updates (non-local updates are handled
> elsewhere in the observer). Since PHOENIX-7425, a CDC index requires the
> encoded region name as its leading row key column. When the codec calls
> IndexMaintainer.buildRowKey without it, this throws an exception, and all
> write operations fail during local index preparation simply trying to
> construct CDC updates that would be discarded anyway.
> The fix modifies handleLocalIndexUpdates to restrict the metadata passed to
> the index builder, aligning with how the observer classifies maintainers
> elsewhere. If a batch contains only local indexes, the original metadata is
> reused as-is to avoid overhead and preserve existing behavior. Eliminating
> non-local maintainers stops the local path from building and immediately
> discarding global updates, allowing the prior row scan to fetch only the
> columns required by local indexes.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)