Commit 473fbd91 authored by David McKenzie's avatar David McKenzie

Added configuration option "HighPrioritySocketThreads" (default 'true' = current behavior)

parent 83a046eb
......@@ -71,7 +71,7 @@ internal static void Unknown(string key)
internal const string AllowAdmin = "allowAdmin", SyncTimeout = "syncTimeout",
ServiceName = "serviceName", ClientName = "name", KeepAlive = "keepAlive",
Version = "version", ConnectTimeout = "connectTimeout", Password = "password",
TieBreaker = "tiebreaker", WriteBuffer = "writeBuffer", Ssl = "ssl", SslHost = "sslHost",
TieBreaker = "tiebreaker", WriteBuffer = "writeBuffer", Ssl = "ssl", SslHost = "sslHost", HighPrioritySocketThreads = "highPriorityThreads",
ConfigChannel = "configChannel", AbortOnConnectFail = "abortConnect", ResolveDns = "resolveDns",
ChannelPrefix = "channelPrefix", Proxy = "proxy", ConnectRetry = "connectRetry",
ConfigCheckSeconds = "configCheckSeconds", ResponseTimeout = "responseTimeout", DefaultDatabase = "defaultDatabase";
......@@ -80,7 +80,7 @@ internal static void Unknown(string key)
AllowAdmin, SyncTimeout,
ServiceName, ClientName, KeepAlive,
Version, ConnectTimeout, Password,
TieBreaker, WriteBuffer, Ssl, SslHost,
TieBreaker, WriteBuffer, Ssl, SslHost, HighPrioritySocketThreads,
ConfigChannel, AbortOnConnectFail, ResolveDns,
ChannelPrefix, Proxy, ConnectRetry,
ConfigCheckSeconds, DefaultDatabase,
......@@ -100,7 +100,7 @@ public static string TryNormalize(string value)
private readonly EndPointCollection endpoints = new EndPointCollection();
private bool? allowAdmin, abortOnConnectFail, resolveDns, ssl;
private bool? allowAdmin, abortOnConnectFail, highPrioritySocketThreads, resolveDns, ssl;
private string clientName, serviceName, password, tieBreaker, sslHost, configChannel;
......@@ -210,6 +210,11 @@ public CommandMap CommandMap
/// </summary>
public EndPointCollection EndPoints { get { return endpoints; } }
/// <summary>
/// Use ThreadPriority.AboveNormal for SocketManager reader and writer threads (true by default). If false, ThreadPriority.Normal will be used.
/// </summary>
public bool HighPrioritySocketThreads { get { return highPrioritySocketThreads ?? true; } set { highPrioritySocketThreads = value; } }
/// <summary>
/// Specifies the time in seconds at which connections should be pinged to ensure validity
/// </summary>
......@@ -322,6 +327,7 @@ public ConfigurationOptions Clone()
writeBuffer = writeBuffer,
ssl = ssl,
sslHost = sslHost,
highPrioritySocketThreads = highPrioritySocketThreads,
configChannel = configChannel,
abortOnConnectFail = abortOnConnectFail,
resolveDns = resolveDns,
......@@ -371,7 +377,8 @@ public override string ToString()
Append(sb, OptionKeys.TieBreaker, tieBreaker);
Append(sb, OptionKeys.WriteBuffer, writeBuffer);
Append(sb, OptionKeys.Ssl, ssl);
Append(sb, OptionKeys.SslHost, sslHost);
Append(sb, OptionKeys.SslHost, sslHost);
Append(sb, OptionKeys.HighPrioritySocketThreads, highPrioritySocketThreads);
Append(sb, OptionKeys.ConfigChannel, configChannel);
Append(sb, OptionKeys.AbortOnConnectFail, abortOnConnectFail);
Append(sb, OptionKeys.ResolveDns, resolveDns);
......@@ -471,7 +478,7 @@ void Clear()
{
clientName = serviceName = password = tieBreaker = sslHost = configChannel = null;
keepAlive = syncTimeout = connectTimeout = writeBuffer = connectRetry = configCheckSeconds = defaultDatabase = null;
allowAdmin = abortOnConnectFail = resolveDns = ssl = null;
allowAdmin = abortOnConnectFail = highPrioritySocketThreads = resolveDns = ssl = null;
defaultVersion = null;
endpoints.Clear();
commandMap = null;
......@@ -567,6 +574,9 @@ private void DoParse(string configuration, bool ignoreUnknown)
case OptionKeys.SslHost:
SslHost = value;
break;
case OptionKeys.HighPrioritySocketThreads:
HighPrioritySocketThreads = OptionKeys.ParseBoolean(key, value);
break;
case OptionKeys.WriteBuffer:
WriteBuffer = OptionKeys.ParseInt32(key, value);
break;
......
......@@ -10,7 +10,7 @@ partial class ConnectionMultiplexer
partial void OnCreateReaderWriter(ConfigurationOptions configuration)
{
this.ownsSocketManager = configuration.SocketManager == null;
this.socketManager = configuration.SocketManager ?? new SocketManager(ClientName);
this.socketManager = configuration.SocketManager ?? new SocketManager(ClientName, configuration.HighPrioritySocketThreads);
}
partial void OnCloseReaderWriter()
......
......@@ -400,7 +400,7 @@ private void StartReader()
var thread = new Thread(read, 32 * 1024); // don't need a huge stack
thread.Name = name + ":Read";
thread.IsBackground = true;
thread.Priority = ThreadPriority.AboveNormal; // time critical
thread.Priority = useHighPrioritySocketThreads ? ThreadPriority.AboveNormal : ThreadPriority.Normal;
thread.Start(this);
}
[StructLayout(LayoutKind.Sequential)]
......
......@@ -80,19 +80,21 @@ public sealed partial class SocketManager : IDisposable
private readonly Queue<PhysicalBridge> writeQueue = new Queue<PhysicalBridge>();
bool isDisposed;
private bool useHighPrioritySocketThreads = true;
/// <summary>
/// Creates a new (optionally named) SocketManager instance
/// </summary>
public SocketManager(string name = null)
public SocketManager(string name = null, bool useHighPrioritySocketThreads = true)
{
if (string.IsNullOrWhiteSpace(name)) name = GetType().Name;
this.name = name;
this.useHighPrioritySocketThreads = useHighPrioritySocketThreads;
// we need a dedicated writer, because when under heavy ambient load
// (a busy asp.net site, for example), workers are not reliable enough
Thread dedicatedWriter = new Thread(writeAllQueues, 32 * 1024); // don't need a huge stack;
dedicatedWriter.Priority = ThreadPriority.AboveNormal; // time critical
dedicatedWriter.Priority = useHighPrioritySocketThreads ? ThreadPriority.AboveNormal : ThreadPriority.Normal;
dedicatedWriter.Name = name + ":Write";
dedicatedWriter.IsBackground = true; // should not keep process alive
dedicatedWriter.Start(this); // will self-exit when disposed
......
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