Unprocessed items handling in DynamoDB - Time & Space Complexity
When working with DynamoDB batch operations, some items may not process immediately and need retrying.
We want to understand how the time to finish depends on how many items are unprocessed.
Analyze the time complexity of the following code snippet.
let unprocessedItems = initialBatch;
while (unprocessedItems && Object.keys(unprocessedItems).length > 0) {
const response = await dynamodb.batchWrite({ RequestItems: unprocessedItems });
unprocessedItems = response.UnprocessedItems || {};
}
This code sends a batch write request and retries only the items that were not processed until all are done.
- Primary operation: The while loop that retries unprocessed items.
- How many times: It repeats until no unprocessed items remain, which depends on how many fail each time.
Each batch can process many items at once, but some may fail and need retry.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 to a few retries |
| 100 | 1 to several retries |
| 1000 | Multiple retries, depending on failures |
Pattern observation: The total retries grow roughly with how many items remain unprocessed each time, so more unprocessed items mean more retries.
Time Complexity: O(k)
This means the time grows linearly with the number of retry rounds needed to process all unprocessed items.
[X] Wrong: "All items are processed in one batch call, so time is always constant."
[OK] Correct: Some items may fail and need retries, so the total time depends on how many unprocessed items appear and how many retries happen.
Understanding how retries affect time helps you explain real-world batch processing behavior clearly and confidently.
"What if the batch size limit changes? How would the time complexity change?"
Practice
Solution
Step 1: Understand batch write behavior
DynamoDB may not process all items in a batch due to throttling or limits.Step 2: Identify returned data for unprocessed items
It returns unprocessed items so the client can retry sending them.Final Answer:
A list of unprocessed items to retry later -> Option DQuick Check:
Unprocessed items = retry list [OK]
- Thinking DynamoDB throws an error instead
- Assuming all items are processed without feedback
- Ignoring unprocessed items in code
Solution
Step 1: Understand response structure
The response includes 'UnprocessedItems' key if any items were not processed.Step 2: Correctly check for unprocessed items
Check if 'UnprocessedItems' exists and is not empty to retry those items.Final Answer:
if 'UnprocessedItems' in response and response['UnprocessedItems']: -> Option AQuick Check:
Check key exists and is not empty [OK]
- Checking for None instead of empty dict
- Using 'not in' which misses unprocessed items
- Checking for False which is incorrect
response = client.batch_write_item(RequestItems=batch)
if response.get('UnprocessedItems'):
retry_items = response['UnprocessedItems']
else:
retry_items = None
print(retry_items)
What will be printed if all items were processed successfully?Solution
Step 1: Understand response when all items processed
If all items are processed, 'UnprocessedItems' key is empty or missing.Step 2: Analyze code behavior
response.get('UnprocessedItems') returns None or empty dict; if empty dict is falsy, else branch sets retry_items to None.Final Answer:
None -> Option CQuick Check:
No unprocessed items means retry_items = None [OK]
- Expecting empty dict instead of None
- Assuming an error is raised
- Thinking retry_items contains all items
while True:
response = client.batch_write_item(RequestItems=items)
items = response.get('UnprocessedItems', {})
if not items:
break
What is the likely bug causing infinite retries?Solution
Step 1: Analyze the retry loop
The code updates items correctly but retries immediately without delay.Step 2: Identify the cause of infinite retries
Missing delay or exponential backoff leads to rapid retries, causing persistent throttling. DynamoDB continually returns the same unprocessed items.Final Answer:
Missing a delay between retries causing throttling -> Option AQuick Check:
Add sleep/backoff between retries [OK]
- Blaming item update logic instead of throttling
- Assuming empty dict check prevents infinite loops
- Overlooking need for backoff in tight retry loops
Solution
Step 1: Understand batch write limitations
DynamoDB batch writes can return unprocessed items due to throttling or limits.Step 2: Best practice for data safety
Retry unprocessed items repeatedly until all are saved to avoid data loss.Final Answer:
Check for unprocessed items after each batch write and retry them until none remain -> Option BQuick Check:
Retry unprocessed items until empty for safe writes [OK]
- Ignoring unprocessed items causing data loss
- Writing items one by one causing inefficiency
- Logging without retrying unprocessed items
Ready to prove it?
Pass the test and this pattern moves unknown
