Don't treat NameError in deserialize as network error #728
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
General
The problem I have stumbled upon after upgrading Rails version of my Ruby on Rails application was
dalli
marking a memcached server as failed and removing it from the list of servers for 60 seconds. In application log it looked like this:After a lot of debugging I discovered the following error in my production log:
This means
dalli
has run intoNameError
while deserializing object, and treated this error as memcached server error!Reproducing the error
I've made a simple code snippet to reproduce the error.
First, let's define a simple test class:
Next, instantiate and object and save it to memcache:
Things look good so far. But let's do the trick: remove
M::C
class and try again.We got it! Unexpected exception
NameError
led us toWARN -- : 127.0.0.1:11211 is down
. And the one to blame isActiveSupport
's internal call forconst_get
.Redemption
The solution to this problem is simple: we should handle this kind on
NameError
as it's already done toArgumentError
inDalli::Server#deserialize
.After applying the proposed patch running the same test snippet ends up like this: