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 ...@@ -727,11 +727,13 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
{ {
if (message == null) return WriteResult.Success; // for some definition of success if (message == null) return WriteResult.Success; // for some definition of success
bool isQueued = false;
try try
{ {
var cmd = message.Command; var cmd = message.Command;
LastCommand = cmd; LastCommand = cmd;
bool isMasterOnly = message.IsMasterOnly(); bool isMasterOnly = message.IsMasterOnly();
if (isMasterOnly && ServerEndPoint.IsSlave && (ServerEndPoint.SlaveReadOnly || !ServerEndPoint.AllowSlaveWrites)) if (isMasterOnly && ServerEndPoint.IsSlave && (ServerEndPoint.SlaveReadOnly || !ServerEndPoint.AllowSlaveWrites))
{ {
throw ExceptionFactory.MasterOnly(Multiplexer.IncludeDetailInExceptions, message.Command, message, ServerEndPoint); throw ExceptionFactory.MasterOnly(Multiplexer.IncludeDetailInExceptions, message.Command, message, ServerEndPoint);
...@@ -782,6 +784,7 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne ...@@ -782,6 +784,7 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
} }
connection.EnqueueInsideWriteLock(message); connection.EnqueueInsideWriteLock(message);
isQueued = true;
message.WriteTo(connection); message.WriteTo(connection);
message.SetRequestSent(); message.SetRequestSent();
...@@ -806,6 +809,21 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne ...@@ -806,6 +809,21 @@ private WriteResult WriteMessageToServerInsideWriteLock(PhysicalConnection conne
} }
return WriteResult.Success; 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) catch (Exception ex)
{ {
Trace("Write failed: " + ex.Message); 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