3189410f9d
We previously realized we needed to do that for accounts and containers where the consequences of treating the 404 as authoritative were more obvious: we'd cache the non-existence which prevented writes until it fell out of cache. The same basic logic applies for objects, though: if we see (Timeout, Timeout, Timeout, 404, 404, 404) on a triple-replica policy, we don't really have any reason to think that a 404 is appropriate. In fact, it seems reasonably likely that there's a thundering-herd problem where there are too many concurrent requests for data that *definitely is there*. By responding with a 503, we apply some back-pressure to clients, who hopefully have some exponential backoff in their retries. The situation gets a bit more complicated with erasure-coded data, but the same basic principle applies. We're just more likely to have confirmation that there *is* data out there, we just can't reconstruct it (right now). Note that we *still want to check* those handoffs, of course. Our fail-in-place strategy has us replicate (and, more recently, reconstruct) to handoffs to maintain durability; it'd be silly *not* to look. UpgradeImpact: -------------- Be aware that this may cause an increase in 503 Service Unavailable responses served by proxy-servers. However, this should more accurately reflect the state of the system. Co-Authored-By: Thiago da Silva <thiagodasilva@gmail.com> Change-Id: Ia832e9bab13167948f01bc50aa8a61974ce189fb Closes-Bug: #1837819 Related-Bug: #1833612 Related-Change: I53ed04b5de20c261ddd79c98c629580472e09961 Related-Change: Ief44ed39d97f65e4270bf73051da9a2dd0ddbaec |
||
---|---|---|
.. | ||
__init__.py | ||
brain.py | ||
common.py | ||
test_account_failures.py | ||
test_account_get_fake_responses_match.py | ||
test_account_reaper.py | ||
test_container_failures.py | ||
test_container_merge_policy_index.py | ||
test_container_sync.py | ||
test_db_replicator.py | ||
test_empty_device_handoff.py | ||
test_object_async_update.py | ||
test_object_conditional_requests.py | ||
test_object_expirer.py | ||
test_object_failures.py | ||
test_object_handoff.py | ||
test_object_metadata_replication.py | ||
test_object_partpower_increase.py | ||
test_reconstructor_rebuild.py | ||
test_reconstructor_revert.py | ||
test_replication_servers_working.py | ||
test_sharder.py | ||
test_signals.py |