Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pagination doesn't work when querying a GSI with prefixed sort key #121

Open
salamagd opened this issue Oct 20, 2022 · 0 comments
Open

Pagination doesn't work when querying a GSI with prefixed sort key #121

salamagd opened this issue Oct 20, 2022 · 0 comments

Comments

@salamagd
Copy link

salamagd commented Oct 20, 2022

We encountered a failing non-null assertion in tempest's Prefixer when performing a query on a GSI using a prefixed sort key, once the result set grew large enough to require pagination, causing our service to be unable to read from the database.

Analysis by @jialiang-cash found that the LastEvaluatedKey object returned from Dynamo only includes the partition_key and secondary_index_keys fields. This caused an issue in decodeOffset when Tempest tries to remove the prefixes on both partition_key and sort_key, resulting in a null value exception because no sort_key exists.

Stack trace:

java.lang.IllegalArgumentException: Required value was null.
	at app.cash.tempest.internal.ReflectionCodec$Prefixer.removePrefix(Codec.kt:137)
	at app.cash.tempest.internal.ReflectionCodec.toApp(Codec.kt:92)
	at app.cash.tempest2.internal.DynamoDbQueryable.decodeOffset(DynamoDbQueryable.kt:153)
	at app.cash.tempest2.internal.DynamoDbQueryable.toQueryResponse(DynamoDbQueryable.kt:114)
	at app.cash.tempest2.internal.DynamoDbQueryable.access$toQueryResponse(DynamoDbQueryable.kt:39)
	at app.cash.tempest2.internal.DynamoDbQueryable$Sync.query(DynamoDbQueryable.kt:68)
	at app.cash.tempest2.internal.LogicalDbFactory$SecondaryIndexFactory$secondaryIndex$1.query(LogicalDbFactory.kt)
	at app.cash.tempest2.Queryable$DefaultImpls.query$default(Query.kt:27)

This is the assertion that's failing:

val attributeValue = requireNotNull(attributeValues[attributeName])

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant