diff --git a/common/aws/dynamodb/client.go b/common/aws/dynamodb/client.go index 76464cfd8..010633ed7 100644 --- a/common/aws/dynamodb/client.go +++ b/common/aws/dynamodb/client.go @@ -187,6 +187,10 @@ func (c *Client) QueryIndexWithPagination(ctx context.Context, tableName string, return QueryResult{}, err } + if len(response.Items) == 0 { + return QueryResult{Items: nil, LastEvaluatedKey: nil}, nil + } + // Return the items and the pagination token return QueryResult{ Items: response.Items, diff --git a/common/aws/dynamodb/client_test.go b/common/aws/dynamodb/client_test.go index 995e6889a..7219f8363 100644 --- a/common/aws/dynamodb/client_test.go +++ b/common/aws/dynamodb/client_test.go @@ -337,7 +337,22 @@ func TestQueryIndexPaginationSingleItem(t *testing.T) { Value: "0", }}, 1, lastEvaluatedKey) assert.NoError(t, err) - assert.Len(t, queryResult.Items, 0) + assert.Nil(t, queryResult.Items) + assert.Nil(t, queryResult.LastEvaluatedKey) +} + +func TestQueryIndexPaginationNoStoredItems(t *testing.T) { + tableName := "ProcessingWithPaginationNoItem" + createTable(t, tableName) + indexName := "StatusIndex" + + ctx := context.Background() + queryResult, err := dynamoClient.QueryIndexWithPagination(ctx, tableName, indexName, "BlobStatus = :status", commondynamodb.ExpresseionValues{ + ":status": &types.AttributeValueMemberN{ + Value: "0", + }}, 1, nil) + assert.NoError(t, err) + assert.Nil(t, queryResult.Items) assert.Nil(t, queryResult.LastEvaluatedKey) } diff --git a/disperser/common/blobstore/blob_metadata_store.go b/disperser/common/blobstore/blob_metadata_store.go index 4cd1616ee..79da3da42 100644 --- a/disperser/common/blobstore/blob_metadata_store.go +++ b/disperser/common/blobstore/blob_metadata_store.go @@ -119,6 +119,11 @@ func (s *BlobMetadataStore) GetBlobMetadataByStatusWithPagination(ctx context.Co return nil, nil, err } + // When their are no more results to fetch, the LastEvaluatedKey is nil + if queryResult.Items == nil && queryResult.LastEvaluatedKey == nil { + return nil, nil, nil + } + metadata := make([]*disperser.BlobMetadata, len(queryResult.Items)) for i, item := range queryResult.Items { metadata[i], err = UnmarshalBlobMetadata(item) diff --git a/disperser/common/blobstore/blob_metadata_store_test.go b/disperser/common/blobstore/blob_metadata_store_test.go index 3b393ac78..b31e10de2 100644 --- a/disperser/common/blobstore/blob_metadata_store_test.go +++ b/disperser/common/blobstore/blob_metadata_store_test.go @@ -175,6 +175,16 @@ func TestBlobMetadataStoreOperationsWithPagination(t *testing.T) { }) } +func TestBlobMetadataStoreOperationsWithPaginationNoStoredBlob(t *testing.T) { + ctx := context.Background() + // Query BlobMetadataStore for a blob that does not exist + // This should return nil for both the blob and lastEvaluatedKey + processing, lastEvaluatedKey, err := blobMetadataStore.GetBlobMetadataByStatusWithPagination(ctx, disperser.Processing, 1, nil) + assert.NoError(t, err) + assert.Nil(t, processing) + assert.Nil(t, lastEvaluatedKey) +} + func deleteItems(t *testing.T, keys []commondynamodb.Key) { _, err := dynamoClient.DeleteItems(context.Background(), metadataTableName, keys) assert.NoError(t, err)