Skip to content

RedisCommandException for "Command cannot be issued to a replica" is difficult to handle #2016

@AdamOutcalt

Description

@AdamOutcalt

Hey all,

I work on a large service using Azure Redis Premium. Our normal pattern for using Redis is something like:

try{
db.StringGet()
}
catch (RedisException)
...
catch (TimeoutException)
...

This works pretty well, but we have some low level of failures that look like this:

RedisCommandException: Exception: 'Command cannot be issued to a slave: UNLINK '

(In newer versions of the SDK, it says "Command cannot be issued to a replica" instead.)

This is a reasonable error, but I am not intentionally targeting a replica. I assume Azure has failed over from under me, changing the recipient to a replica, while it was primary when the command was sent.

I would like to just treat this as a transient failure, log it, and move on with life as though it were a timeout. This is a little tricky though because the exception is RedisCommandException (which doesn't inherit from RedisException). I am hesitant to catch and handle RedisCommandException, because I understand that it usually means the command is bad, like maybe a bad LUA script.

Basically, I'd like some way to differentiate this exception so I can treat it as transient.

My suggestion is to make this case a RedisException or RedisServerException, but I'm open to other resolutions, including being told that I should be catching some different set of exceptions as transient.

Thanks,
Adam

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions