From cf5de91acb5e70bc343adbabe69da7f2cd7914fe Mon Sep 17 00:00:00 2001 From: Raif Atef Date: Wed, 23 Aug 2017 12:36:32 +0200 Subject: [PATCH 1/3] Use job objects with SIP003 plugin to avoid lingering processes if app is killed. --- shadowsocks-csharp/Controller/Service/Sip003Plugin.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs index afd395c9..e3391ecb 100644 --- a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs +++ b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Sockets; using System.Reflection; using Shadowsocks.Model; +using Shadowsocks.Util.ProcessManagement; namespace Shadowsocks.Controller.Service { @@ -15,6 +16,7 @@ namespace Shadowsocks.Controller.Service public int ProcessId => _started ? _pluginProcess.Id : 0; private readonly object _startProcessLock = new object(); + private readonly Job _pluginJob; private readonly Process _pluginProcess; private bool _started; private bool _disposed; @@ -66,6 +68,8 @@ namespace Shadowsocks.Controller.Service } } }; + + _pluginJob = new Job(); } public bool StartIfNeeded() @@ -88,6 +92,7 @@ namespace Shadowsocks.Controller.Service _pluginProcess.StartInfo.Environment["SS_LOCAL_HOST"] = LocalEndPoint.Address.ToString(); _pluginProcess.StartInfo.Environment["SS_LOCAL_PORT"] = LocalEndPoint.Port.ToString(); _pluginProcess.Start(); + _pluginJob.AddProcess(_pluginProcess.Handle); _started = true; } @@ -124,6 +129,7 @@ namespace Shadowsocks.Controller.Service try { _pluginProcess.Dispose(); + _pluginJob.Dispose(); } catch (Exception) { } From a316b95f454e089e9c7a4be1af8c9e053fdbcd18 Mon Sep 17 00:00:00 2001 From: Raif Atef Date: Sat, 26 Aug 2017 21:22:53 +0200 Subject: [PATCH 2/3] Logging for SIP003 start failure. --- .../Controller/ShadowsocksController.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 9b27a700..39c48211 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -158,10 +158,18 @@ namespace Shadowsocks.Controller return null; } - if (plugin.StartIfNeeded()) + try + { + if (plugin.StartIfNeeded()) + { + Logging.Info( + $"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); + } + } + catch (Exception ex) { - Logging.Info( - $"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); + Logging.Error("Failed to start SIP003 plugin: " + ex.Message); + throw; } return plugin.LocalEndPoint; From f239244af20fc288acb9b2e1efd49bfa23be6905 Mon Sep 17 00:00:00 2001 From: Raif Atef Date: Sun, 27 Aug 2017 09:11:41 +0200 Subject: [PATCH 3/3] Early start SIP003 plugins when reloading servers to avoid delay on first packet. --- shadowsocks-csharp/Controller/ShadowsocksController.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 39c48211..467f3fc0 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -534,6 +534,7 @@ namespace Shadowsocks.Controller strategy.ReloadServers(); } + StartPlugins(); privoxyRunner.Start(_config); TCPRelay tcpRelay = new TCPRelay(this, _config); @@ -571,6 +572,15 @@ namespace Shadowsocks.Controller Utils.ReleaseMemory(true); } + private void StartPlugins() + { + foreach (var server in _config.configs) + { + // Early start plugin processes + GetPluginLocalEndPointIfConfigured(server); + } + } + protected void SaveConfig(Configuration newConfig) { Configuration.Save(newConfig);