From 6fbc1f2b23a2b75c87fe901a47845958af990368 Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Tue, 17 Feb 2009 18:27:01 +0000 Subject: - additional code to get ConciergeModule to do truly async broker updates - adding watchdog timer async web request - making broker update timeout configurable --- .../Avatar/Concierge/ConciergeModule.cs | 76 ++++++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) (limited to 'OpenSim/Region/OptionalModules') diff --git a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs index 83c3c34..51aa8f8 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs @@ -72,6 +72,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge private string m_announceLeaving = "{0} leaves {1} (back to {2} visitors in this region)"; private string m_xmlRpcPassword = String.Empty; private string m_brokerURI = String.Empty; + private int m_brokerUpdateTimeout = 300; internal object m_syncy = new object(); @@ -126,6 +127,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge m_announceLeaving = m_config.GetString("announce_leaving", m_announceLeaving); m_xmlRpcPassword = m_config.GetString("password", m_xmlRpcPassword); m_brokerURI = m_config.GetString("broker", m_brokerURI); + m_brokerUpdateTimeout = m_config.GetInt("broker_timeout", m_brokerUpdateTimeout); m_log.InfoFormat("[Concierge] reporting as \"{0}\" to our users", m_whoami); @@ -355,6 +357,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge } } + internal class BrokerState + { + public string Uri; + public string Payload; + public HttpWebRequest Poster; + public Timer Timer; + + public BrokerState(string uri, string payload, HttpWebRequest poster) + { + Uri = uri; + Payload = payload; + Poster = poster; + } + } + protected void UpdateBroker(IScene scene) { if (String.IsNullOrEmpty(m_brokerURI)) @@ -411,13 +428,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge updatePost.ContentLength = payload.Length; updatePost.UserAgent = "OpenSim.Concierge"; + + BrokerState bs = new BrokerState(uri, payload, updatePost); + bs.Timer = new Timer(delegate(object state) + { + BrokerState b = state as BrokerState; + b.Poster.Abort(); + b.Timer.Dispose(); + m_log.Debug("[Concierge]: async broker POST abort due to timeout"); + }, bs, m_brokerUpdateTimeout * 1000, Timeout.Infinite); + try { - StreamWriter payloadStream = new StreamWriter(updatePost.GetRequestStream()); - payloadStream.Write(payload); - payloadStream.Close(); - - updatePost.BeginGetResponse(UpdateBrokerDone, updatePost); + updatePost.BeginGetRequestStream(UpdateBrokerSend, bs); m_log.DebugFormat("[Concierge] async broker POST to {0} started", uri); } catch (WebException we) @@ -426,33 +449,60 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge } } + private void UpdateBrokerSend(IAsyncResult result) + { + BrokerState bs = null; + try + { + bs = result.AsyncState as BrokerState; + string payload = bs.Payload; + HttpWebRequest updatePost = bs.Poster; + + using(StreamWriter payloadStream = new StreamWriter(updatePost.EndGetRequestStream(result))) + { + payloadStream.Write(payload); + payloadStream.Close(); + } + updatePost.BeginGetResponse(UpdateBrokerDone, bs); + } + catch (WebException we) + { + m_log.DebugFormat("[Concierge]: async broker POST to {0} failed: {1}", bs.Uri, we.Status); + } + catch (Exception) + { + m_log.DebugFormat("[Concierge]: async broker POST to {0} failed", bs.Uri); + } + } + private void UpdateBrokerDone(IAsyncResult result) { - HttpWebRequest updatePost = null; + BrokerState bs = null; try { - updatePost = result.AsyncState as HttpWebRequest; + bs = result.AsyncState as BrokerState; + HttpWebRequest updatePost = bs.Poster; using (HttpWebResponse response = updatePost.EndGetResponse(result) as HttpWebResponse) { m_log.DebugFormat("[Concierge] broker update: status {0}", response.StatusCode); } + bs.Timer.Dispose(); } catch (WebException we) { - string uri = updatePost.RequestUri.OriginalString; - m_log.ErrorFormat("[Concierge] broker update to {0} failed with status {1}", uri, we.Status); + m_log.ErrorFormat("[Concierge] broker update to {0} failed with status {1}", bs.Uri, we.Status); if (null != we.Response) { using (HttpWebResponse resp = we.Response as HttpWebResponse) { - m_log.ErrorFormat("[Concierge] response from {0} status code: {1}", uri, resp.StatusCode); - m_log.ErrorFormat("[Concierge] response from {0} status desc: {1}", uri, resp.StatusDescription); - m_log.ErrorFormat("[Concierge] response from {0} server: {1}", uri, resp.Server); + m_log.ErrorFormat("[Concierge] response from {0} status code: {1}", bs.Uri, resp.StatusCode); + m_log.ErrorFormat("[Concierge] response from {0} status desc: {1}", bs.Uri, resp.StatusDescription); + m_log.ErrorFormat("[Concierge] response from {0} server: {1}", bs.Uri, resp.Server); if (resp.ContentLength > 0) { StreamReader content = new StreamReader(resp.GetResponseStream()); - m_log.ErrorFormat("[Concierge] response from {0} content: {1}", uri, content.ReadToEnd()); + m_log.ErrorFormat("[Concierge] response from {0} content: {1}", bs.Uri, content.ReadToEnd()); content.Close(); } } -- cgit v1.1