Repository navigation
Description
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_REQUESTtoPROVISIONEDthe way the service requires, because the service refuses the switch without anUpdatefor 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