diff options
author | Dr Scofield | 2009-04-21 13:17:34 +0000 |
---|---|---|
committer | Dr Scofield | 2009-04-21 13:17:34 +0000 |
commit | f31a60bad7133f877fe50570d811b320905280ab (patch) | |
tree | b3d64380d1c85079058bc4267c4242ae3880d4de /OpenSim | |
parent | * Implements Extensions to MRM. This allows Region Modules to insert new clas... (diff) | |
download | opensim-SC-f31a60bad7133f877fe50570d811b320905280ab.zip opensim-SC-f31a60bad7133f877fe50570d811b320905280ab.tar.gz opensim-SC-f31a60bad7133f877fe50570d811b320905280ab.tar.bz2 opensim-SC-f31a60bad7133f877fe50570d811b320905280ab.tar.xz |
From: Alan Webb <alan_webb@us.ibm.com>
Fixes IRC reconnect problem
When a session fails to establish, the login attempt eventually
times out and the login is retried. This should occur once every
25 seconds (to give the server plenty of time to respond). In fact
the interval was typically only 10 seconds, this was being caused
by a second reset that was being scheduled when the failed
listener thread was terminated. Because the second reset occurred
inside the ICC timeout, it eventually gets scheduled after only
10 seconds.
In addition to this, the connector was being added to the monitoring
twice. This was harmless, but entirely redundant.
Both of these problems have been fixed and tested. Each connector
now maintains a count of how often it has been reset. The listener
thread records this value on entry and checks for a change on exit.
If the counts are the same, then the listener is exiting and can
potentially reschedule the connection.
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs index 5123ef5..ca85817 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs | |||
@@ -96,6 +96,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
96 | 96 | ||
97 | internal int depends = 0; | 97 | internal int depends = 0; |
98 | 98 | ||
99 | // This variable counts the number of resets that have been performed | ||
100 | // on the connector. When a listener thread terminates, it checks to | ||
101 | // see of the reset count has changed before it schedules another | ||
102 | // reset. | ||
103 | |||
104 | internal int m_resetk = 0; | ||
105 | |||
99 | // Working threads | 106 | // Working threads |
100 | 107 | ||
101 | private Thread m_listener = null; | 108 | private Thread m_listener = null; |
@@ -229,7 +236,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
229 | 236 | ||
230 | // Add the newly created connector to the known connectors list | 237 | // Add the newly created connector to the known connectors list |
231 | 238 | ||
232 | m_connectors.Add(this); | 239 | // m_connectors.Add(this); |
233 | 240 | ||
234 | m_log.InfoFormat("[IRC-Connector-{0}]: Initialization complete", idn); | 241 | m_log.InfoFormat("[IRC-Connector-{0}]: Initialization complete", idn); |
235 | 242 | ||
@@ -393,6 +400,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
393 | 400 | ||
394 | if (m_connected) | 401 | if (m_connected) |
395 | { | 402 | { |
403 | |||
396 | m_log.InfoFormat("[IRC-Connector-{0}] Resetting connector", idn); | 404 | m_log.InfoFormat("[IRC-Connector-{0}] Resetting connector", idn); |
397 | 405 | ||
398 | // Mark as disconnected. This will allow the listener thread | 406 | // Mark as disconnected. This will allow the listener thread |
@@ -410,6 +418,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
410 | 418 | ||
411 | m_connected = false; | 419 | m_connected = false; |
412 | m_pending = false; | 420 | m_pending = false; |
421 | m_resetk++; | ||
413 | 422 | ||
414 | } | 423 | } |
415 | 424 | ||
@@ -478,7 +487,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
478 | 487 | ||
479 | public void ListenerRun() | 488 | public void ListenerRun() |
480 | { | 489 | { |
490 | |||
481 | string inputLine; | 491 | string inputLine; |
492 | int resetk = m_resetk; | ||
482 | 493 | ||
483 | try | 494 | try |
484 | { | 495 | { |
@@ -534,7 +545,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
534 | // The connection is marked as not connected the first time | 545 | // The connection is marked as not connected the first time |
535 | // through reconnect. | 546 | // through reconnect. |
536 | 547 | ||
537 | if (m_enabled) Reconnect(); | 548 | if (m_enabled && (m_resetk == resetk)) |
549 | Reconnect(); | ||
538 | 550 | ||
539 | } | 551 | } |
540 | 552 | ||
@@ -830,6 +842,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
830 | 842 | ||
831 | foreach (IRCConnector connector in m_connectors) | 843 | foreach (IRCConnector connector in m_connectors) |
832 | { | 844 | { |
845 | // m_log.InfoFormat("[IRC-Watchdog] Scanning {0}", connector); | ||
833 | if (connector.Enabled) | 846 | if (connector.Enabled) |
834 | { | 847 | { |
835 | if (!connector.Connected) | 848 | if (!connector.Connected) |
@@ -851,7 +864,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
851 | { | 864 | { |
852 | if (connector.m_timeout == 0) | 865 | if (connector.m_timeout == 0) |
853 | { | 866 | { |
854 | m_log.ErrorFormat("[IRC-Watchdog] Login timed-out for connector {0}, reconnecting", connector.idn); | 867 | // m_log.ErrorFormat("[IRC-Watchdog] Login timed-out for connector {0}, reconnecting", connector.idn); |
855 | connector.Reconnect(); | 868 | connector.Reconnect(); |
856 | } | 869 | } |
857 | else | 870 | else |
@@ -865,10 +878,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
865 | connector.m_writer.WriteLine(String.Format("PING :{0}", connector.m_server)); | 878 | connector.m_writer.WriteLine(String.Format("PING :{0}", connector.m_server)); |
866 | connector.m_writer.Flush(); | 879 | connector.m_writer.Flush(); |
867 | } | 880 | } |
868 | catch (Exception /*e*/) | 881 | catch (Exception e) |
869 | { | 882 | { |
870 | // m_log.ErrorFormat("[IRC-PingRun] Exception on connector {0}: {1} ", connector.idn, e.Message); | 883 | m_log.ErrorFormat("[IRC-PingRun] Exception on connector {0}: {1} ", connector.idn, e.Message); |
871 | // m_log.Debug(e); | 884 | m_log.Debug(e); |
872 | connector.Reconnect(); | 885 | connector.Reconnect(); |
873 | } | 886 | } |
874 | } | 887 | } |