aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Servers
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Servers')
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs14
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs86
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs4
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs145
-rw-r--r--OpenSim/Framework/Servers/ServerBase.cs4
-rw-r--r--OpenSim/Framework/Servers/Tests/OSHttpTests.cs4
-rw-r--r--OpenSim/Framework/Servers/VersionInfo.cs6
7 files changed, 179 insertions, 84 deletions
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 4ab6908..bfd67c7 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -130,7 +130,17 @@ namespace OpenSim.Framework.Servers
130 /// Performs initialisation of the scene, such as loading configuration from disk. 130 /// Performs initialisation of the scene, such as loading configuration from disk.
131 /// </summary> 131 /// </summary>
132 public virtual void Startup() 132 public virtual void Startup()
133 { 133 {
134 m_log.Info("[STARTUP]: Beginning startup processing");
135
136 m_log.Info("[STARTUP]: Careminster version: " + m_version + Environment.NewLine);
137 // clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and
138 // the clr version number doesn't match the project version number under Mono.
139 //m_log.Info("[STARTUP]: Virtual machine runtime version: " + Environment.Version + Environment.NewLine);
140 m_log.InfoFormat(
141 "[STARTUP]: Operating system version: {0}, .NET platform {1}, {2}-bit\n",
142 Environment.OSVersion, Environment.OSVersion.Platform, Util.Is64BitProcess() ? "64" : "32");
143
134 StartupSpecific(); 144 StartupSpecific();
135 145
136 TimeSpan timeTaken = DateTime.Now - m_startuptime; 146 TimeSpan timeTaken = DateTime.Now - m_startuptime;
@@ -159,4 +169,4 @@ namespace OpenSim.Framework.Servers
159 } 169 }
160 } 170 }
161 } 171 }
162} \ No newline at end of file 172}
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index c4e569d..f4b4156 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -401,6 +401,7 @@ namespace OpenSim.Framework.Servers.HttpServer
401 StreamReader reader = new StreamReader(requestStream, encoding); 401 StreamReader reader = new StreamReader(requestStream, encoding);
402 402
403 string requestBody = reader.ReadToEnd(); 403 string requestBody = reader.ReadToEnd();
404 reader.Close();
404 405
405 Hashtable keysvals = new Hashtable(); 406 Hashtable keysvals = new Hashtable();
406 Hashtable headervals = new Hashtable(); 407 Hashtable headervals = new Hashtable();
@@ -740,7 +741,7 @@ namespace OpenSim.Framework.Servers.HttpServer
740 // Every month or so this will wrap and give bad numbers, not really a problem 741 // Every month or so this will wrap and give bad numbers, not really a problem
741 // since its just for reporting 742 // since its just for reporting
742 int tickdiff = requestEndTick - requestStartTick; 743 int tickdiff = requestEndTick - requestStartTick;
743 if (tickdiff > 3000 && requestHandler != null && requestHandler.Name != "GetTexture") 744 if (tickdiff > 3000 && (requestHandler == null || requestHandler.Name == null || requestHandler.Name != "GetTexture"))
744 { 745 {
745 m_log.InfoFormat( 746 m_log.InfoFormat(
746 "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms", 747 "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms",
@@ -1661,10 +1662,40 @@ namespace OpenSim.Framework.Servers.HttpServer
1661 1662
1662 internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) 1663 internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response)
1663 { 1664 {
1664 //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response"); 1665 int responsecode;
1665 int responsecode = (int)responsedata["int_response_code"]; 1666 string responseString = String.Empty;
1666 string responseString = (string)responsedata["str_response_string"]; 1667 byte[] responseData = null;
1667 string contentType = (string)responsedata["content_type"]; 1668 string contentType;
1669
1670 if (responsedata == null)
1671 {
1672 responsecode = 500;
1673 responseString = "No response could be obtained";
1674 contentType = "text/plain";
1675 responsedata = new Hashtable();
1676 }
1677 else
1678 {
1679 try
1680 {
1681 //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response");
1682 responsecode = (int)responsedata["int_response_code"];
1683 if (responsedata["bin_response_data"] != null)
1684 responseData = (byte[])responsedata["bin_response_data"];
1685 else
1686 responseString = (string)responsedata["str_response_string"];
1687 contentType = (string)responsedata["content_type"];
1688 if (responseString == null)
1689 responseString = String.Empty;
1690 }
1691 catch
1692 {
1693 responsecode = 500;
1694 responseString = "No response could be obtained";
1695 contentType = "text/plain";
1696 responsedata = new Hashtable();
1697 }
1698 }
1668 1699
1669 if (responsedata.ContainsKey("error_status_text")) 1700 if (responsedata.ContainsKey("error_status_text"))
1670 { 1701 {
@@ -1709,25 +1740,40 @@ namespace OpenSim.Framework.Servers.HttpServer
1709 1740
1710 response.AddHeader("Content-Type", contentType); 1741 response.AddHeader("Content-Type", contentType);
1711 1742
1743 if (responsedata.ContainsKey("headers"))
1744 {
1745 Hashtable headerdata = (Hashtable)responsedata["headers"];
1746
1747 foreach (string header in headerdata.Keys)
1748 response.AddHeader(header, (string)headerdata[header]);
1749 }
1750
1712 byte[] buffer; 1751 byte[] buffer;
1713 1752
1714 if (!(contentType.Contains("image") 1753 if (responseData != null)
1715 || contentType.Contains("x-shockwave-flash")
1716 || contentType.Contains("application/x-oar")
1717 || contentType.Contains("application/vnd.ll.mesh")))
1718 { 1754 {
1719 // Text 1755 buffer = responseData;
1720 buffer = Encoding.UTF8.GetBytes(responseString);
1721 } 1756 }
1722 else 1757 else
1723 { 1758 {
1724 // Binary! 1759 if (!(contentType.Contains("image")
1725 buffer = Convert.FromBase64String(responseString); 1760 || contentType.Contains("x-shockwave-flash")
1726 } 1761 || contentType.Contains("application/x-oar")
1762 || contentType.Contains("application/vnd.ll.mesh")))
1763 {
1764 // Text
1765 buffer = Encoding.UTF8.GetBytes(responseString);
1766 }
1767 else
1768 {
1769 // Binary!
1770 buffer = Convert.FromBase64String(responseString);
1771 }
1727 1772
1728 response.SendChunked = false; 1773 response.SendChunked = false;
1729 response.ContentLength64 = buffer.Length; 1774 response.ContentLength64 = buffer.Length;
1730 response.ContentEncoding = Encoding.UTF8; 1775 response.ContentEncoding = Encoding.UTF8;
1776 }
1731 1777
1732 return buffer; 1778 return buffer;
1733 } 1779 }
@@ -1808,7 +1854,7 @@ namespace OpenSim.Framework.Servers.HttpServer
1808 m_httpListener2.Start(64); 1854 m_httpListener2.Start(64);
1809 1855
1810 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events 1856 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events
1811 m_PollServiceManager = new PollServiceRequestManager(this, 3, 25000); 1857 m_PollServiceManager = new PollServiceRequestManager(this, 4, 25000);
1812 m_PollServiceManager.Start(); 1858 m_PollServiceManager.Start();
1813 HTTPDRunning = true; 1859 HTTPDRunning = true;
1814 1860
@@ -1858,7 +1904,9 @@ namespace OpenSim.Framework.Servers.HttpServer
1858 1904
1859 public void httpServerException(object source, Exception exception) 1905 public void httpServerException(object source, Exception exception)
1860 { 1906 {
1861 m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); 1907 if (source.ToString() == "HttpServer.HttpListener" && exception.ToString().StartsWith("Mono.Security.Protocol.Tls.TlsException"))
1908 return;
1909 m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString());
1862 /* 1910 /*
1863 if (HTTPDRunning)// && NotSocketErrors > 5) 1911 if (HTTPDRunning)// && NotSocketErrors > 5)
1864 { 1912 {
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
index 9477100..3fd3bf7 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
@@ -52,7 +52,9 @@ namespace OpenSim.Framework.Servers.HttpServer
52 { 52 {
53 LongPoll = 0, 53 LongPoll = 0,
54 LslHttp = 1, 54 LslHttp = 1,
55 Inventory = 2 55 Inventory = 2,
56 Texture = 3,
57 Mesh = 4
56 } 58 }
57 59
58 public string Url { get; set; } 60 public string Url { get; set; }
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index 6ab05d0..44f7045 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -47,19 +47,18 @@ namespace OpenSim.Framework.Servers.HttpServer
47 private readonly BaseHttpServer m_server; 47 private readonly BaseHttpServer m_server;
48 48
49 private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); 49 private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>();
50 private static List<PollServiceHttpRequest> m_longPollRequests = new List<PollServiceHttpRequest>(); 50 private static Queue<PollServiceHttpRequest> m_slowRequests = new Queue<PollServiceHttpRequest>();
51 private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>();
51 52
52 private uint m_WorkerThreadCount = 0; 53 private uint m_WorkerThreadCount = 0;
53 private Thread[] m_workerThreads; 54 private Thread[] m_workerThreads;
54 private Thread m_longPollThread; 55 private Thread m_retrysThread;
55 56
56 private bool m_running = true; 57 private bool m_running = true;
57 private int slowCount = 0; 58 private int slowCount = 0;
58 59
59 private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2); 60 private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2);
60 61
61// private int m_timeout = 1000; // increase timeout 250; now use the event one
62
63 public PollServiceRequestManager(BaseHttpServer pSrv, uint pWorkerThreadCount, int pTimeout) 62 public PollServiceRequestManager(BaseHttpServer pSrv, uint pWorkerThreadCount, int pTimeout)
64 { 63 {
65 m_server = pSrv; 64 m_server = pSrv;
@@ -83,9 +82,9 @@ namespace OpenSim.Framework.Servers.HttpServer
83 int.MaxValue); 82 int.MaxValue);
84 } 83 }
85 84
86 m_longPollThread = Watchdog.StartThread( 85 m_retrysThread = Watchdog.StartThread(
87 this.CheckLongPollThreads, 86 this.CheckRetries,
88 string.Format("LongPollServiceWatcherThread:{0}", m_server.Port), 87 string.Format("PollServiceWatcherThread:{0}", m_server.Port),
89 ThreadPriority.Normal, 88 ThreadPriority.Normal,
90 false, 89 false,
91 true, 90 true,
@@ -97,15 +96,8 @@ namespace OpenSim.Framework.Servers.HttpServer
97 { 96 {
98 if (m_running) 97 if (m_running)
99 { 98 {
100 // delay the enqueueing for 100ms. There's no need to have the event 99 lock (m_retryRequests)
101 // actively on the queue 100 m_retryRequests.Enqueue(req);
102 Timer t = new Timer(self => {
103 ((Timer)self).Dispose();
104 m_requests.Enqueue(req);
105 });
106
107 t.Change(100, Timeout.Infinite);
108
109 } 101 }
110 } 102 }
111 103
@@ -113,47 +105,39 @@ namespace OpenSim.Framework.Servers.HttpServer
113 { 105 {
114 if (m_running) 106 if (m_running)
115 { 107 {
116 if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) 108 if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.LongPoll)
117 { 109 {
118 lock (m_longPollRequests) 110 m_requests.Enqueue(req);
119 m_longPollRequests.Add(req);
120 } 111 }
121 else 112 else
122 m_requests.Enqueue(req); 113 {
114 lock (m_slowRequests)
115 m_slowRequests.Enqueue(req);
116 }
123 } 117 }
124 } 118 }
125 119
126 private void CheckLongPollThreads() 120 private void CheckRetries()
127 { 121 {
128 // The only purpose of this thread is to check the EQs for events.
129 // If there are events, that thread will be placed in the "ready-to-serve" queue, m_requests.
130 // If there are no events, that thread will be back to its "waiting" queue, m_longPollRequests.
131 // All other types of tasks (Inventory handlers, http-in, etc) don't have the long-poll nature,
132 // so if they aren't ready to be served by a worker thread (no events), they are placed
133 // directly back in the "ready-to-serve" queue by the worker thread.
134 while (m_running) 122 while (m_running)
135 { 123 {
136 Thread.Sleep(500); 124 Thread.Sleep(100); // let the world move .. back to faster rate
137 Watchdog.UpdateThread(); 125 Watchdog.UpdateThread();
138 126 lock (m_retryRequests)
139 List<PollServiceHttpRequest> not_ready = new List<PollServiceHttpRequest>();
140 lock (m_longPollRequests)
141 { 127 {
142 if (m_longPollRequests.Count > 0 && m_running) 128 while (m_retryRequests.Count > 0 && m_running)
143 { 129 m_requests.Enqueue(m_retryRequests.Dequeue());
144 List<PollServiceHttpRequest> ready = m_longPollRequests.FindAll(req => 130 }
145 (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id) || // there are events in this EQ 131 slowCount++;
146 (Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) // no events, but timeout 132 if (slowCount >= 10)
147 ); 133 {
148 134 slowCount = 0;
149 ready.ForEach(req =>
150 {
151 m_requests.Enqueue(req);
152 m_longPollRequests.Remove(req);
153 });
154 135
136 lock (m_slowRequests)
137 {
138 while (m_slowRequests.Count > 0 && m_running)
139 m_requests.Enqueue(m_slowRequests.Dequeue());
155 } 140 }
156
157 } 141 }
158 } 142 }
159 } 143 }
@@ -161,18 +145,30 @@ namespace OpenSim.Framework.Servers.HttpServer
161 public void Stop() 145 public void Stop()
162 { 146 {
163 m_running = false; 147 m_running = false;
164// m_timeout = -10000; // cause all to expire
165 Thread.Sleep(1000); // let the world move 148 Thread.Sleep(1000); // let the world move
166 149
167 foreach (Thread t in m_workerThreads) 150 foreach (Thread t in m_workerThreads)
168 Watchdog.AbortThread(t.ManagedThreadId); 151 Watchdog.AbortThread(t.ManagedThreadId);
169 152
153 try
154 {
155 foreach (PollServiceHttpRequest req in m_retryRequests)
156 {
157 DoHTTPGruntWork(m_server,req,
158 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
159 }
160 }
161 catch
162 {
163 }
164
170 PollServiceHttpRequest wreq; 165 PollServiceHttpRequest wreq;
166 m_retryRequests.Clear();
171 167
172 lock (m_longPollRequests) 168 lock (m_slowRequests)
173 { 169 {
174 if (m_longPollRequests.Count > 0 && m_running) 170 while (m_slowRequests.Count > 0 && m_running)
175 m_longPollRequests.ForEach(req => m_requests.Enqueue(req)); 171 m_requests.Enqueue(m_slowRequests.Dequeue());
176 } 172 }
177 173
178 while (m_requests.Count() > 0) 174 while (m_requests.Count() > 0)
@@ -180,15 +176,14 @@ namespace OpenSim.Framework.Servers.HttpServer
180 try 176 try
181 { 177 {
182 wreq = m_requests.Dequeue(0); 178 wreq = m_requests.Dequeue(0);
183 wreq.DoHTTPGruntWork( 179 DoHTTPGruntWork(m_server,wreq,
184 m_server, wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id)); 180 wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id));
185 } 181 }
186 catch 182 catch
187 { 183 {
188 } 184 }
189 } 185 }
190 186
191 m_longPollRequests.Clear();
192 m_requests.Clear(); 187 m_requests.Clear();
193 } 188 }
194 189
@@ -199,7 +194,6 @@ namespace OpenSim.Framework.Servers.HttpServer
199 while (m_running) 194 while (m_running)
200 { 195 {
201 PollServiceHttpRequest req = m_requests.Dequeue(5000); 196 PollServiceHttpRequest req = m_requests.Dequeue(5000);
202 //m_log.WarnFormat("[YYY]: Dequeued {0}", (req == null ? "null" : req.PollServiceArgs.Type.ToString()));
203 197
204 Watchdog.UpdateThread(); 198 Watchdog.UpdateThread();
205 if (req != null) 199 if (req != null)
@@ -217,7 +211,7 @@ namespace OpenSim.Framework.Servers.HttpServer
217 { 211 {
218 try 212 try
219 { 213 {
220 req.DoHTTPGruntWork(m_server, responsedata); 214 DoHTTPGruntWork(m_server, req, responsedata);
221 } 215 }
222 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 216 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
223 { 217 {
@@ -230,7 +224,7 @@ namespace OpenSim.Framework.Servers.HttpServer
230 { 224 {
231 try 225 try
232 { 226 {
233 req.DoHTTPGruntWork(m_server, responsedata); 227 DoHTTPGruntWork(m_server, req, responsedata);
234 } 228 }
235 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 229 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
236 { 230 {
@@ -245,8 +239,8 @@ namespace OpenSim.Framework.Servers.HttpServer
245 { 239 {
246 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) 240 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
247 { 241 {
248 req.DoHTTPGruntWork( 242 DoHTTPGruntWork(m_server, req,
249 m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); 243 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
250 } 244 }
251 else 245 else
252 { 246 {
@@ -261,5 +255,42 @@ namespace OpenSim.Framework.Servers.HttpServer
261 } 255 }
262 } 256 }
263 } 257 }
258
259 // DoHTTPGruntWork changed, not sending response
260 // do the same work around as core
261
262 internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata)
263 {
264 OSHttpResponse response
265 = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext);
266
267 byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
268
269 response.SendChunked = false;
270 response.ContentLength64 = buffer.Length;
271 response.ContentEncoding = Encoding.UTF8;
272
273 try
274 {
275 response.OutputStream.Write(buffer, 0, buffer.Length);
276 }
277 catch (Exception ex)
278 {
279 m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
280 }
281 finally
282 {
283 try
284 {
285 response.OutputStream.Flush();
286 response.Send();
287 }
288 catch (Exception e)
289 {
290 m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
291 }
292 }
293 }
264 } 294 }
265} \ No newline at end of file 295}
296
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index c258ff6..7108314 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -769,7 +769,7 @@ namespace OpenSim.Framework.Servers
769 } 769 }
770 } 770 }
771 771
772 protected string GetVersionText() 772 public string GetVersionText()
773 { 773 {
774 return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion); 774 return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion);
775 } 775 }
@@ -942,4 +942,4 @@ namespace OpenSim.Framework.Servers
942 /// </summary> 942 /// </summary>
943 protected virtual void ShutdownSpecific() {} 943 protected virtual void ShutdownSpecific() {}
944 } 944 }
945} \ No newline at end of file 945}
diff --git a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
index 5b912b4..deae45c 100644
--- a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
+++ b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
@@ -81,6 +81,10 @@ namespace OpenSim.Framework.Servers.Tests
81 /// </summary> 81 /// </summary>
82 public event EventHandler<RequestEventArgs> RequestReceived = delegate { }; 82 public event EventHandler<RequestEventArgs> RequestReceived = delegate { };
83 83
84 public bool CanSend { get { return true; } }
85 public string RemoteEndPoint { get { return ""; } }
86 public string RemoteEndPointAddress { get { return ""; } }
87 public string RemoteEndPointPort { get { return ""; } }
84 } 88 }
85 89
86 public class TestHttpRequest: IHttpRequest 90 public class TestHttpRequest: IHttpRequest
diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs
index 80568e0..737c14d 100644
--- a/OpenSim/Framework/Servers/VersionInfo.cs
+++ b/OpenSim/Framework/Servers/VersionInfo.cs
@@ -29,11 +29,11 @@ namespace OpenSim
29{ 29{
30 public class VersionInfo 30 public class VersionInfo
31 { 31 {
32 private const string VERSION_NUMBER = "0.7.6"; 32 private const string VERSION_NUMBER = "0.7.6CM";
33 private const Flavour VERSION_FLAVOUR = Flavour.Dev; 33 private const Flavour VERSION_FLAVOUR = Flavour.Dev;
34 34
35 public enum Flavour 35 public enum Flavour
36 { 36 {
37 Unknown, 37 Unknown,
38 Dev, 38 Dev,
39 RC1, 39 RC1,
@@ -50,7 +50,7 @@ namespace OpenSim
50 50
51 public static string GetVersionString(string versionNumber, Flavour flavour) 51 public static string GetVersionString(string versionNumber, Flavour flavour)
52 { 52 {
53 string versionString = "OpenSim " + versionNumber + " " + flavour; 53 string versionString = "Careminster " + versionNumber + " " + flavour;
54 return versionString.PadRight(VERSIONINFO_VERSION_LENGTH); 54 return versionString.PadRight(VERSIONINFO_VERSION_LENGTH);
55 } 55 }
56 56