Commit 8d015446 authored by Marc Gravell's avatar Marc Gravell

reinstate forgiving RedisCommandException handling *as long as* we haven't enqueued it

parent 20da3edb
......@@ -727,11 +727,13 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
{
if (message == null) return WriteResult.Success; // for some definition of success
bool isQueued = false;
try
{
var cmd = message.Command;
LastCommand = cmd;
bool isMasterOnly = message.IsMasterOnly();
if (isMasterOnly && ServerEndPoint.IsSlave && (ServerEndPoint.SlaveReadOnly || !ServerEndPoint.AllowSlaveWrites))
{
throw ExceptionFactory.MasterOnly(Multiplexer.IncludeDetailInExceptions, message.Command, message, ServerEndPoint);
......@@ -782,6 +784,7 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
}
connection.EnqueueInsideWriteLock(message);
isQueued = true;
message.WriteTo(connection);
message.SetRequestSent();
......@@ -806,6 +809,21 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
}
return WriteResult.Success;
}
catch (RedisCommandException ex) when (!isQueued)
{
Trace("Write failed: " + ex.Message);
message.Fail(ConnectionFailureType.InternalFailure, ex, null);
this.CompleteSyncOrAsync(message);
// this failed without actually writing; we're OK with that... unless there's a transaction
if (connection?.TransactionActive == true)
{
// we left it in a broken state; need to kill the connection
connection.RecordConnectionFailed(ConnectionFailureType.ProtocolFailure, ex);
return WriteResult.WriteFailure;
}
return WriteResult.Success;
}
catch (Exception ex)
{
Trace("Write failed: " + ex.Message);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment