Skip to content

UpdateTable refuses every GSI Update action, so index throughput cannot change and a table with indexes cannot switch to PROVISIONED #716

Open

Description

@LeeroyHannigan

Problem

UpdateTable refuses every Update member of GlobalSecondaryIndexUpdates on every backend. validate_gsi_updates (crates/engine/src/update_table.rs, called at line 143) returns ValidationException "UpdateGlobalSecondaryIndex is not yet supported" for any entry with Update (lines 217 to 223), before the storage call. The service accepts this action to change an index's throughput, and requires it when a table with indexes switches to PROVISIONED. So on ExtendDB:

  • a client cannot change an index's provisioned throughput or its on-demand maximums;
  • a client cannot switch a table with indexes from PAY_PER_REQUEST to PROVISIONED the way the service requires, because the service refuses the switch without an Update for each index and ExtendDB refuses it with one.

ExtendDB accepts the switch without the index members, which the service refuses (measured on the branch of #708 on 30 October, with the index CREATING and ACTIVE).

Measured on the service

DynamoDB in us-east-1, 1 November 2026, 00:31 to 00:35 UTC, on a PAY_PER_REQUEST table with two ACTIVE indexes and a second PAY_PER_REQUEST table with one, switched to PROVISIONED during the run:

Table mode Request Answer
PAY_PER_REQUEST Update gsi1 with OnDemandThroughput 100 and 100 200; DescribeTable shows the new OnDemandThroughput on gsi1 at once, table ACTIVE
PAY_PER_REQUEST the same Update again 200
PAY_PER_REQUEST Update gsi1 with ProvisionedThroughput 1 and 1 400 ValidationException "One or more parameter values were invalid: The only Updates for index: gsi1 when TableThroughputMode is PAY_PER_REQUEST can be to OnDemandThroughput, WarmThroughput"
PAY_PER_REQUEST Update gsi1 with no throughput member 400, the same message
PAY_PER_REQUEST Update of an index that does not exist 400 ResourceNotFoundException "Requested resource not found: Index nope for table extenddb-test-654-p"
PAY_PER_REQUEST two Update entries for gsi2 400 ValidationException "One or more parameter values were invalid: Only one global secondary index update per index is allowed simultaneously. Index: gsi2"
PAY_PER_REQUEST BillingMode PROVISIONED with table throughput 1 and 1, no index member 400 ValidationException "One or more parameter values were invalid: ProvisionedThroughput must be specified for index: gsi1"
PAY_PER_REQUEST the same with Update gsi1 ProvisionedThroughput 1 and 1 200; table and gsi1 PROVISIONED at 1 and 1
PROVISIONED Update gsi1 with ProvisionedThroughput 2 and 1 200
PROVISIONED the same values again 400 ValidationException "The provisioned throughput for the index gsi1 will not change. The requested value equals the current value. Current ReadCapacityUnits provisioned for index gsi1: 2. Requested ReadCapacityUnits: 2. Current WriteCapacityUnits provisioned for index gsi1: 1. Requested WriteCapacityUnits: 1. Refer to the Amazon DynamoDB Developer Guide for current limits and how to request higher limits."
PROVISIONED Update gsi1 with OnDemandThroughput 100 and 100 400 ValidationException "One or more parameter values were invalid: MaxReadRequestUnits for OnDemandThroughput for index : gsi1 cannot be specified when table BillingMode is PROVISIONED"
PROVISIONED table throughput 2 and 1 and Update gsi1 3 and 1 in one request 200, TableStatus UPDATING; ACTIVE with both values applied

A throughput of 0 was not sent: the SDK refuses it before the request.

Expected

UpdateTable accepts Update with ProvisionedThroughput or OnDemandThroughput under the same rules and messages as the table above, stores the values per index and returns them from DescribeTable, and refuses the switch to PROVISIONED without an Update for each index. WarmThroughput can follow #462. Tests cover each row of the table on every backend.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions