[ 
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)

Reply via email to