Merge branch 'master' into careminster

avinationmerge
Melanie 2013-02-26 13:34:20 +00:00
commit 54ee95dd8e
19 changed files with 762 additions and 321 deletions

View File

@ -74,11 +74,8 @@ namespace OpenSim.Groups
{ {
IConfig groupsConfig = config.Configs["Groups"]; IConfig groupsConfig = config.Configs["Groups"];
string url = groupsConfig.GetString("GroupsServerURI", string.Empty); string url = groupsConfig.GetString("GroupsServerURI", string.Empty);
if (url == string.Empty) if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
{ throw new Exception(string.Format("[Groups.RemoteConnector]: Malformed groups server URL {0}. Fix it or disable the Groups feature.", url));
m_log.WarnFormat("[Groups.RemoteConnector]: Groups server URL not provided. Groups will not work.");
return;
}
m_GroupsService = new GroupsServiceRemoteConnector(url); m_GroupsService = new GroupsServiceRemoteConnector(url);
m_Scenes = new List<Scene>(); m_Scenes = new List<Scene>();
@ -273,7 +270,7 @@ namespace OpenSim.Groups
public bool AddGroupRole(string RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers, out string reason) public bool AddGroupRole(string RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers, out string reason)
{ {
string r = string.Empty; string r = string.Empty;
bool success = m_CacheWrapper.AddGroupRole(roleID, description, name, powers, title, delegate bool success = m_CacheWrapper.AddGroupRole(groupID, roleID, description, name, powers, title, delegate
{ {
return m_GroupsService.AddGroupRole(RequestingAgentID, groupID, roleID, name, description, title, powers, out r); return m_GroupsService.AddGroupRole(RequestingAgentID, groupID, roleID, name, description, title, powers, out r);
}); });

View File

@ -371,7 +371,7 @@ namespace OpenSim.Groups
Dictionary<string, object> result = new Dictionary<string, object>(); Dictionary<string, object> result = new Dictionary<string, object>();
if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID") || if (!request.ContainsKey("RequestingAgentID") || !request.ContainsKey("GroupID") || !request.ContainsKey("RoleID") ||
!request.ContainsKey("Name") || !request.ContainsKey("Descrption") || !request.ContainsKey("Title") || !request.ContainsKey("Name") || !request.ContainsKey("Description") || !request.ContainsKey("Title") ||
!request.ContainsKey("Powers") || !request.ContainsKey("OP")) !request.ContainsKey("Powers") || !request.ContainsKey("OP"))
NullResult(result, "Bad network data"); NullResult(result, "Bad network data");

View File

@ -393,7 +393,7 @@ namespace OpenSim.Groups
} }
} }
public bool AddGroupRole(UUID roleID, string description, string name, ulong powers, string title, BooleanDelegate d) public bool AddGroupRole(UUID groupID, UUID roleID, string description, string name, ulong powers, string title, BooleanDelegate d)
{ {
if (d()) if (d())
{ {
@ -406,8 +406,15 @@ namespace OpenSim.Groups
role.Title = title; role.Title = title;
lock (m_Cache) lock (m_Cache)
{
m_Cache.AddOrUpdate("role-" + roleID.ToString(), role, GROUPS_CACHE_TIMEOUT); m_Cache.AddOrUpdate("role-" + roleID.ToString(), role, GROUPS_CACHE_TIMEOUT);
// also remove this list
if (m_Cache.Contains("roles-" + groupID.ToString()))
m_Cache.Remove("roles-" + groupID.ToString());
}
return true; return true;
} }

View File

@ -785,10 +785,16 @@ namespace OpenSim.Groups
RoleData data = m_Database.RetrieveRole(groupID, roleID); RoleData data = m_Database.RetrieveRole(groupID, roleID);
if (add && data != null) // it already exists, can't create if (add && data != null) // it already exists, can't create
{
m_log.DebugFormat("[Groups]: Group {0} already exists. Can't create it again", groupID);
return false; return false;
}
if (!add && data == null) // it deosn't exist, can't update if (!add && data == null) // it deosn't exist, can't update
{
m_log.DebugFormat("[Groups]: Group {0} doesn't exist. Can't update it", groupID);
return false; return false;
}
if (add) if (add)
data = new RoleData(); data = new RoleData();

View File

@ -1,211 +1,228 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the * * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
namespace OpenSim.Framework.Monitoring namespace OpenSim.Framework.Monitoring
{ {
// Create a time histogram of events. The histogram is built in a wrap-around // Create a time histogram of events. The histogram is built in a wrap-around
// array of equally distributed buckets. // array of equally distributed buckets.
// For instance, a minute long histogram of second sized buckets would be: // For instance, a minute long histogram of second sized buckets would be:
// new EventHistogram(60, 1000) // new EventHistogram(60, 1000)
public class EventHistogram public class EventHistogram
{ {
private int m_timeBase; private int m_timeBase;
private int m_numBuckets; private int m_numBuckets;
private int m_bucketMilliseconds; private int m_bucketMilliseconds;
private int m_lastBucket; private int m_lastBucket;
private int m_totalHistogramMilliseconds; private int m_totalHistogramMilliseconds;
private long[] m_histogram; private long[] m_histogram;
private object histoLock = new object(); private object histoLock = new object();
public EventHistogram(int numberOfBuckets, int millisecondsPerBucket) public EventHistogram(int numberOfBuckets, int millisecondsPerBucket)
{ {
m_numBuckets = numberOfBuckets; m_numBuckets = numberOfBuckets;
m_bucketMilliseconds = millisecondsPerBucket; m_bucketMilliseconds = millisecondsPerBucket;
m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds; m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds;
m_histogram = new long[m_numBuckets]; m_histogram = new long[m_numBuckets];
Zero(); Zero();
m_lastBucket = 0; m_lastBucket = 0;
m_timeBase = Util.EnvironmentTickCount(); m_timeBase = Util.EnvironmentTickCount();
} }
public void Event() public void Event()
{ {
this.Event(1); this.Event(1);
} }
// Record an event at time 'now' in the histogram. // Record an event at time 'now' in the histogram.
public void Event(int cnt) public void Event(int cnt)
{ {
lock (histoLock) lock (histoLock)
{ {
// The time as displaced from the base of the histogram // The time as displaced from the base of the histogram
int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase); int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase);
// If more than the total time of the histogram, we just start over // If more than the total time of the histogram, we just start over
if (bucketTime > m_totalHistogramMilliseconds) if (bucketTime > m_totalHistogramMilliseconds)
{ {
Zero(); Zero();
m_lastBucket = 0; m_lastBucket = 0;
m_timeBase = Util.EnvironmentTickCount(); m_timeBase = Util.EnvironmentTickCount();
} }
else else
{ {
// To which bucket should we add this event? // To which bucket should we add this event?
int bucket = bucketTime / m_bucketMilliseconds; int bucket = bucketTime / m_bucketMilliseconds;
// Advance m_lastBucket to the new bucket. Zero any buckets skipped over. // Advance m_lastBucket to the new bucket. Zero any buckets skipped over.
while (bucket != m_lastBucket) while (bucket != m_lastBucket)
{ {
// Zero from just after the last bucket to the new bucket or the end // Zero from just after the last bucket to the new bucket or the end
for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++) for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++)
{ {
m_histogram[jj] = 0; m_histogram[jj] = 0;
} }
m_lastBucket = bucket; m_lastBucket = bucket;
// If the new bucket is off the end, wrap around to the beginning // If the new bucket is off the end, wrap around to the beginning
if (bucket > m_numBuckets) if (bucket > m_numBuckets)
{ {
bucket -= m_numBuckets; bucket -= m_numBuckets;
m_lastBucket = 0; m_lastBucket = 0;
m_histogram[m_lastBucket] = 0; m_histogram[m_lastBucket] = 0;
m_timeBase += m_totalHistogramMilliseconds; m_timeBase += m_totalHistogramMilliseconds;
} }
} }
} }
m_histogram[m_lastBucket] += cnt; m_histogram[m_lastBucket] += cnt;
} }
} }
// Get a copy of the current histogram // Get a copy of the current histogram
public long[] GetHistogram() public long[] GetHistogram()
{ {
long[] ret = new long[m_numBuckets]; long[] ret = new long[m_numBuckets];
lock (histoLock) lock (histoLock)
{ {
int indx = m_lastBucket + 1; int indx = m_lastBucket + 1;
for (int ii = 0; ii < m_numBuckets; ii++, indx++) for (int ii = 0; ii < m_numBuckets; ii++, indx++)
{ {
if (indx >= m_numBuckets) if (indx >= m_numBuckets)
indx = 0; indx = 0;
ret[ii] = m_histogram[indx]; ret[ii] = m_histogram[indx];
} }
} }
return ret; return ret;
} }
// Get a copy of the current histogram public OSDMap GetHistogramAsOSDMap()
public OSDArray GetHistogramAsOSDArray() {
{ OSDMap ret = new OSDMap();
OSDArray ret = new OSDArray(m_numBuckets);
lock (histoLock) ret.Add("Buckets", OSD.FromInteger(m_numBuckets));
{ ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds));
int indx = m_lastBucket + 1; ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds));
for (int ii = 0; ii < m_numBuckets; ii++, indx++)
{ // Compute a number for the first bucket in the histogram.
if (indx >= m_numBuckets) // This will allow readers to know how this histogram relates to any previously read histogram.
indx = 0; int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1;
ret[ii] = OSD.FromLong(m_histogram[indx]); ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum));
}
} ret.Add("Values", GetHistogramAsOSDArray());
return ret;
} return ret;
}
// Zero out the histogram // Get a copy of the current histogram
public void Zero() public OSDArray GetHistogramAsOSDArray()
{ {
lock (histoLock) OSDArray ret = new OSDArray(m_numBuckets);
{ lock (histoLock)
for (int ii = 0; ii < m_numBuckets; ii++) {
m_histogram[ii] = 0; int indx = m_lastBucket + 1;
} for (int ii = 0; ii < m_numBuckets; ii++, indx++)
} {
} if (indx >= m_numBuckets)
indx = 0;
// A statistic that wraps a counter. ret[ii] = OSD.FromLong(m_histogram[indx]);
// Built this way mostly so histograms and history can be created. }
public class CounterStat : Stat }
{ return ret;
private SortedDictionary<string, EventHistogram> m_histograms; }
private object counterLock = new object();
// Zero out the histogram
public CounterStat( public void Zero()
string shortName, {
string name, lock (histoLock)
string description, {
string unitName, for (int ii = 0; ii < m_numBuckets; ii++)
string category, m_histogram[ii] = 0;
string container, }
StatVerbosity verbosity) }
: base(shortName, name, description, unitName, category, container, StatType.Push, null, verbosity) }
{
m_histograms = new SortedDictionary<string, EventHistogram>(); // A statistic that wraps a counter.
} // Built this way mostly so histograms and history can be created.
public class CounterStat : Stat
// Histograms are presumably added at intialization time and the list does not change thereafter. {
// Thus no locking of the histogram list. private SortedDictionary<string, EventHistogram> m_histograms;
public void AddHistogram(string histoName, EventHistogram histo) private object counterLock = new object();
{
m_histograms.Add(histoName, histo); public CounterStat(
} string shortName,
string name,
public delegate void ProcessHistogram(string name, EventHistogram histo); string description,
public void ForEachHistogram(ProcessHistogram process) string unitName,
{ string category,
foreach (KeyValuePair<string, EventHistogram> kvp in m_histograms) string container,
{ StatVerbosity verbosity)
process(kvp.Key, kvp.Value); : base(shortName, name, description, unitName, category, container, StatType.Push, null, verbosity)
} {
} m_histograms = new SortedDictionary<string, EventHistogram>();
}
public void Event()
{ // Histograms are presumably added at intialization time and the list does not change thereafter.
this.Event(1); // Thus no locking of the histogram list.
} public void AddHistogram(string histoName, EventHistogram histo)
{
// Count the underlying counter. m_histograms.Add(histoName, histo);
public void Event(int cnt) }
{
lock (counterLock) public delegate void ProcessHistogram(string name, EventHistogram histo);
{ public void ForEachHistogram(ProcessHistogram process)
base.Value += cnt; {
foreach (KeyValuePair<string, EventHistogram> kvp in m_histograms)
foreach (EventHistogram histo in m_histograms.Values) {
{ process(kvp.Key, kvp.Value);
histo.Event(cnt); }
} }
}
} public void Event()
} {
} this.Event(1);
}
// Count the underlying counter.
public void Event(int cnt)
{
lock (counterLock)
{
base.Value += cnt;
foreach (EventHistogram histo in m_histograms.Values)
{
histo.Event(cnt);
}
}
}
}
}

View File

@ -211,7 +211,7 @@ namespace OpenSim.Framework.Monitoring
public virtual string ToConsoleString() public virtual string ToConsoleString()
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}.{1}.{2} : {3}{4}", Category, Container, ShortName, Value, UnitName); sb.AppendFormat("{0}.{1}.{2} : {3} {4}", Category, Container, ShortName, Value, UnitName);
AppendMeasuresOfInterest(sb); AppendMeasuresOfInterest(sb);

View File

@ -85,6 +85,7 @@ namespace OpenSim.Framework.Monitoring
if (cmd.Length > 2) if (cmd.Length > 2)
{ {
var categoryName = cmd[2]; var categoryName = cmd[2];
var containerName = cmd.Length > 3 ? cmd[3] : String.Empty;
if (categoryName == AllSubCommand) if (categoryName == AllSubCommand)
{ {
@ -108,7 +109,20 @@ namespace OpenSim.Framework.Monitoring
} }
else else
{ {
OutputCategoryStatsToConsole(con, category); if (String.IsNullOrEmpty(containerName))
OutputCategoryStatsToConsole(con, category);
else
{
SortedDictionary<string, Stat> container;
if (category.TryGetValue(containerName, out container))
{
OutputContainerStatsToConsole(con, container);
}
else
{
con.OutputFormat("No such container {0} in category {1}", containerName, categoryName);
}
}
} }
} }
} }
@ -124,10 +138,15 @@ namespace OpenSim.Framework.Monitoring
{ {
foreach (var container in category.Values) foreach (var container in category.Values)
{ {
foreach (Stat stat in container.Values) OutputContainerStatsToConsole(con, container);
{ }
con.Output(stat.ToConsoleString()); }
}
private static void OutputContainerStatsToConsole( ICommandConsole con, SortedDictionary<string, Stat> container)
{
foreach (Stat stat in container.Values)
{
con.Output(stat.ToConsoleString());
} }
} }

View File

@ -929,7 +929,25 @@ namespace OpenSim.Framework
/// <returns></returns> /// <returns></returns>
public static T GetConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections) public static T GetConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections)
{ {
object val = default(T); return GetConfigVarFromSections<T>(config, varname, sections, default(T));
}
/// <summary>
/// Gets the value of a configuration variable by looking into
/// multiple sections in order. The latter sections overwrite
/// any values previously found.
/// </summary>
/// <remarks>
/// If no value is found then the given default value is returned
/// </remarks>
/// <typeparam name="T">Type of the variable</typeparam>
/// <param name="config">The configuration object</param>
/// <param name="varname">The configuration variable</param>
/// <param name="sections">Ordered sequence of sections to look at</param>
/// <param name="val">Default value</param>
/// <returns></returns>
public static T GetConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections, object val)
{
foreach (string section in sections) foreach (string section in sections)
{ {
IConfig cnf = config.Configs[section]; IConfig cnf = config.Configs[section];
@ -937,11 +955,7 @@ namespace OpenSim.Framework
continue; continue;
if (typeof(T) == typeof(String)) if (typeof(T) == typeof(String))
{
if (val == null) // no null strings, please
val = string.Empty;
val = cnf.GetString(varname, (string)val); val = cnf.GetString(varname, (string)val);
}
else if (typeof(T) == typeof(Boolean)) else if (typeof(T) == typeof(Boolean))
val = cnf.GetBoolean(varname, (bool)val); val = cnf.GetBoolean(varname, (bool)val);
else if (typeof(T) == typeof(Int32)) else if (typeof(T) == typeof(Int32))
@ -949,8 +963,9 @@ namespace OpenSim.Framework
else if (typeof(T) == typeof(float)) else if (typeof(T) == typeof(float))
val = cnf.GetFloat(varname, (int)val); val = cnf.GetFloat(varname, (int)val);
else else
m_log.WarnFormat("[UTIL]: Unhandled type {0}", typeof(T)); m_log.ErrorFormat("[UTIL]: Unhandled type {0}", typeof(T));
} }
return (T)val; return (T)val;
} }

View File

@ -33,6 +33,7 @@ using log4net;
using Nini.Config; using Nini.Config;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Monitoring;
using OpenSim.Framework.Servers; using OpenSim.Framework.Servers;
using OpenSim.Region.CoreModules.Framework.Monitoring.Alerts; using OpenSim.Region.CoreModules.Framework.Monitoring.Alerts;
using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors; using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors;
@ -100,6 +101,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring
"/monitorstats/" + Uri.EscapeDataString(m_scene.RegionInfo.RegionName), StatsPage); "/monitorstats/" + Uri.EscapeDataString(m_scene.RegionInfo.RegionName), StatsPage);
AddMonitors(); AddMonitors();
RegisterStatsManagerRegionStatistics();
} }
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
@ -109,6 +111,9 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring
MainServer.Instance.RemoveHTTPHandler("GET", "/monitorstats/" + m_scene.RegionInfo.RegionID); MainServer.Instance.RemoveHTTPHandler("GET", "/monitorstats/" + m_scene.RegionInfo.RegionID);
MainServer.Instance.RemoveHTTPHandler("GET", "/monitorstats/" + Uri.EscapeDataString(m_scene.RegionInfo.RegionName)); MainServer.Instance.RemoveHTTPHandler("GET", "/monitorstats/" + Uri.EscapeDataString(m_scene.RegionInfo.RegionName));
UnRegisterStatsManagerRegionStatistics();
m_scene = null; m_scene = null;
} }
@ -399,6 +404,47 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring
{ {
m_log.Error("[Monitor] " + reporter.Name + " for " + m_scene.RegionInfo.RegionName + " reports " + reason + " (Fatal: " + fatal + ")"); m_log.Error("[Monitor] " + reporter.Name + " for " + m_scene.RegionInfo.RegionName + " reports " + reason + " (Fatal: " + fatal + ")");
} }
private List<Stat> registeredStats = new List<Stat>();
private void MakeStat(string pName, string pUnitName, Action<Stat> act)
{
Stat tempStat = new Stat(pName, pName, pName, pUnitName, "scene", m_scene.RegionInfo.RegionName, StatType.Pull, act, StatVerbosity.Info);
StatsManager.RegisterStat(tempStat);
registeredStats.Add(tempStat);
}
private void RegisterStatsManagerRegionStatistics()
{
string regionName = m_scene.RegionInfo.RegionName;
MakeStat("RootAgents", "avatars", (s) => { s.Value = m_scene.SceneGraph.GetRootAgentCount(); });
MakeStat("ChildAgents", "avatars", (s) => { s.Value = m_scene.SceneGraph.GetChildAgentCount(); });
MakeStat("TotalPrims", "objects", (s) => { s.Value = m_scene.SceneGraph.GetTotalObjectsCount(); });
MakeStat("ActivePrims", "objects", (s) => { s.Value = m_scene.SceneGraph.GetActiveObjectsCount(); });
MakeStat("ActiveScripts", "scripts", (s) => { s.Value = m_scene.SceneGraph.GetActiveScriptsCount(); });
MakeStat("TimeDilation", "sec/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[0]; });
MakeStat("SimFPS", "fps", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[1]; });
MakeStat("PhysicsFPS", "fps", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[2]; });
MakeStat("AgentUpdates", "updates/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[3]; });
MakeStat("FrameTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[8]; });
MakeStat("NetTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[9]; });
MakeStat("OtherTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[12]; });
MakeStat("PhysicsTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[10]; });
MakeStat("AgentTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[16]; });
MakeStat("ImageTime", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[11]; });
MakeStat("ScriptLines", "lines/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[20]; });
MakeStat("SimSpareMS", "ms/sec", (s) => { s.Value = m_scene.StatsReporter.LastReportedSimStats[21]; });
}
private void UnRegisterStatsManagerRegionStatistics()
{
foreach (Stat stat in registeredStats)
{
StatsManager.DeregisterStat(stat);
stat.Dispose();
}
registeredStats.Clear();
}
} }
} }

View File

@ -52,8 +52,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
public override void Initialise(IConfigSource config) public override void Initialise(IConfigSource config)
{ {
IConfig startupConfig = config.Configs["Startup"]; if (Util.GetConfigVarFromSections<string>(
if (startupConfig.GetString("WorldMapModule", "WorldMap") == "HGWorldMap") config, "WorldMapModule", new string[] { "Map", "Startup" }, "WorldMap") == "HGWorldMap")
m_Enabled = true; m_Enabled = true;
} }

View File

@ -80,17 +80,14 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
bool generateMaptiles = true; bool generateMaptiles = true;
Bitmap mapbmp; Bitmap mapbmp;
try string[] configSections = new string[] { "Map", "Startup" };
{
IConfig startupConfig = m_config.Configs["Startup"]; drawPrimVolume
drawPrimVolume = startupConfig.GetBoolean("DrawPrimOnMapTile", drawPrimVolume); = Util.GetConfigVarFromSections<bool>(m_config, "DrawPrimOnMapTile", configSections, drawPrimVolume);
textureTerrain = startupConfig.GetBoolean("TextureOnMapTile", textureTerrain); textureTerrain
generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", generateMaptiles); = Util.GetConfigVarFromSections<bool>(m_config, "TextureOnMapTile", configSections, textureTerrain);
} generateMaptiles
catch = Util.GetConfigVarFromSections<bool>(m_config, "GenerateMaptiles", configSections, generateMaptiles);
{
m_log.Warn("[MAPTILE]: Failed to load StartupConfig");
}
if (generateMaptiles) if (generateMaptiles)
{ {
@ -148,9 +145,8 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
{ {
m_config = source; m_config = source;
IConfig startupConfig = m_config.Configs["Startup"]; if (Util.GetConfigVarFromSections<string>(
if (startupConfig.GetString("MapImageModule", "MapImageModule") != m_config, "MapImageModule", new string[] { "Startup", "Map" }, "MapImageModule") != "MapImageModule")
"MapImageModule")
return; return;
m_Enabled = true; m_Enabled = true;

View File

@ -74,8 +74,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
{ {
m_config = source; m_config = source;
IConfig startupConfig = m_config.Configs["Startup"]; if (Util.GetConfigVarFromSections<string>(
if (startupConfig.GetString("MapImageModule", "MapImageModule") != "Warp3DImageModule") m_config, "MapImageModule", new string[] { "Startup", "Map" }, "MapImageModule") != "Warp3DImageModule")
return; return;
m_Enabled = true; m_Enabled = true;
@ -157,16 +157,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
bool drawPrimVolume = true; bool drawPrimVolume = true;
bool textureTerrain = true; bool textureTerrain = true;
try string[] configSections = new string[] { "Map", "Startup" };
{
IConfig startupConfig = m_config.Configs["Startup"]; drawPrimVolume
drawPrimVolume = startupConfig.GetBoolean("DrawPrimOnMapTile", drawPrimVolume); = Util.GetConfigVarFromSections<bool>(m_config, "DrawPrimOnMapTile", configSections, drawPrimVolume);
textureTerrain = startupConfig.GetBoolean("TextureOnMapTile", textureTerrain); textureTerrain
} = Util.GetConfigVarFromSections<bool>(m_config, "TextureOnMapTile", configSections, textureTerrain);
catch
{
m_log.Warn("[WARP 3D IMAGE MODULE]: Failed to load StartupConfig");
}
m_colors.Clear(); m_colors.Clear();

View File

@ -89,11 +89,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
#region INonSharedRegionModule Members #region INonSharedRegionModule Members
public virtual void Initialise (IConfigSource config) public virtual void Initialise (IConfigSource config)
{ {
IConfig startupConfig = config.Configs["Startup"]; string[] configSections = new string[] { "Map", "Startup" };
if (startupConfig.GetString("WorldMapModule", "WorldMap") == "WorldMap")
if (Util.GetConfigVarFromSections<string>(
config, "WorldMapModule", configSections, "WorldMap") == "WorldMap")
m_Enabled = true; m_Enabled = true;
blacklistTimeout = startupConfig.GetInt("BlacklistTimeout", 10*60) * 1000; blacklistTimeout
= Util.GetConfigVarFromSections<int>(config, "BlacklistTimeout", configSections, 10 * 60) * 1000;
} }
public virtual void AddRegion (Scene scene) public virtual void AddRegion (Scene scene)

View File

@ -921,7 +921,11 @@ namespace OpenSim.Region.Framework.Scenes
m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion); m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false); CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
m_generateMaptiles = startupConfig.GetBoolean("GenerateMaptiles", true); string[] possibleMapConfigSections = new string[] { "Map", "Startup" };
m_generateMaptiles
= Util.GetConfigVarFromSections<bool>(config, "GenerateMaptiles", possibleMapConfigSections, true);
if (m_generateMaptiles) if (m_generateMaptiles)
{ {
int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0); int maptileRefresh = startupConfig.GetInt("MaptileRefresh", 0);
@ -935,7 +939,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
string tile = startupConfig.GetString("MaptileStaticUUID", UUID.Zero.ToString()); string tile
= Util.GetConfigVarFromSections<string>(
config, "MaptileStaticUUID", possibleMapConfigSections, UUID.Zero.ToString());
UUID tileID; UUID tileID;
if (tile != UUID.Zero.ToString() && UUID.TryParse(tile, out tileID)) if (tile != UUID.Zero.ToString() && UUID.TryParse(tile, out tileID))

View File

@ -0,0 +1,328 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.Console;
using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenMetaverse.StructuredData;
namespace OpenSim.Region.OptionalModules.Framework.Monitoring
{
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ServerStatistics")]
public class ServerStats : ISharedRegionModule
{
private readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private readonly string LogHeader = "[SERVER STATS]";
public bool Enabled = false;
private static Dictionary<string, Stat> RegisteredStats = new Dictionary<string, Stat>();
public readonly string CategoryServer = "server";
public readonly string ContainerProcessor = "processor";
public readonly string ContainerMemory = "memory";
public readonly string ContainerNetwork = "network";
public readonly string ContainerProcess = "process";
public string NetworkInterfaceTypes = "Ethernet";
readonly int performanceCounterSampleInterval = 500;
int lastperformanceCounterSampleTime = 0;
private class PerfCounterControl
{
public PerformanceCounter perfCounter;
public int lastFetch;
public string name;
public PerfCounterControl(PerformanceCounter pPc)
: this(pPc, String.Empty)
{
}
public PerfCounterControl(PerformanceCounter pPc, string pName)
{
perfCounter = pPc;
lastFetch = 0;
name = pName;
}
}
PerfCounterControl processorPercentPerfCounter = null;
#region ISharedRegionModule
// IRegionModuleBase.Name
public string Name { get { return "Server Stats"; } }
// IRegionModuleBase.ReplaceableInterface
public Type ReplaceableInterface { get { return null; } }
// IRegionModuleBase.Initialize
public void Initialise(IConfigSource source)
{
IConfig cfg = source.Configs["Monitoring"];
if (cfg != null)
Enabled = cfg.GetBoolean("ServerStatsEnabled", true);
if (Enabled)
{
NetworkInterfaceTypes = cfg.GetString("NetworkInterfaceTypes", "Ethernet");
}
}
// IRegionModuleBase.Close
public void Close()
{
if (RegisteredStats.Count > 0)
{
foreach (Stat stat in RegisteredStats.Values)
{
StatsManager.DeregisterStat(stat);
stat.Dispose();
}
RegisteredStats.Clear();
}
}
// IRegionModuleBase.AddRegion
public void AddRegion(Scene scene)
{
}
// IRegionModuleBase.RemoveRegion
public void RemoveRegion(Scene scene)
{
}
// IRegionModuleBase.RegionLoaded
public void RegionLoaded(Scene scene)
{
}
// ISharedRegionModule.PostInitialize
public void PostInitialise()
{
if (RegisteredStats.Count == 0)
{
RegisterServerStats();
}
}
#endregion ISharedRegionModule
private void MakeStat(string pName, string pUnit, string pContainer, Action<Stat> act)
{
Stat stat = new Stat(pName, pName, "", pUnit, CategoryServer, pContainer, StatType.Pull, act, StatVerbosity.Info);
StatsManager.RegisterStat(stat);
RegisteredStats.Add(pName, stat);
}
public void RegisterServerStats()
{
lastperformanceCounterSampleTime = Util.EnvironmentTickCount();
PerformanceCounter tempPC;
Stat tempStat;
string tempName;
try
{
tempName = "CPUPercent";
tempPC = new PerformanceCounter("Processor", "% Processor Time", "_Total");
processorPercentPerfCounter = new PerfCounterControl(tempPC);
// A long time bug in mono is that CPU percent is reported as CPU percent idle. Windows reports CPU percent busy.
tempStat = new Stat(tempName, tempName, "", "percent", CategoryServer, ContainerProcessor,
StatType.Pull, (s) => { GetNextValue(s, processorPercentPerfCounter, Util.IsWindows() ? 1 : -1); },
StatVerbosity.Info);
StatsManager.RegisterStat(tempStat);
RegisteredStats.Add(tempName, tempStat);
MakeStat("TotalProcessorTime", "sec", ContainerProcessor,
(s) => { s.Value = Process.GetCurrentProcess().TotalProcessorTime.TotalSeconds; });
MakeStat("UserProcessorTime", "sec", ContainerProcessor,
(s) => { s.Value = Process.GetCurrentProcess().UserProcessorTime.TotalSeconds; });
MakeStat("PrivilegedProcessorTime", "sec", ContainerProcessor,
(s) => { s.Value = Process.GetCurrentProcess().PrivilegedProcessorTime.TotalSeconds; });
MakeStat("Threads", "threads", ContainerProcessor,
(s) => { s.Value = Process.GetCurrentProcess().Threads.Count; });
}
catch (Exception e)
{
m_log.ErrorFormat("{0} Exception creating 'Process': {1}", LogHeader, e);
}
try
{
List<string> okInterfaceTypes = new List<string>(NetworkInterfaceTypes.Split(','));
IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
if (nic.OperationalStatus != OperationalStatus.Up)
continue;
string nicInterfaceType = nic.NetworkInterfaceType.ToString();
if (!okInterfaceTypes.Contains(nicInterfaceType))
{
m_log.DebugFormat("{0} Not including stats for network interface '{1}' of type '{2}'. To include, add to [Monitoring]NetworkInterfaceTypes='Ethernet,Loopback'",
LogHeader, nic.Name, nicInterfaceType);
continue;
}
if (nic.Supports(NetworkInterfaceComponent.IPv4))
{
IPv4InterfaceStatistics nicStats = nic.GetIPv4Statistics();
if (nicStats != null)
{
MakeStat("BytesRcvd/" + nic.Name, "KB", ContainerNetwork,
(s) => { LookupNic(s, (ns) => { return ns.BytesReceived; }, 1024.0); });
MakeStat("BytesSent/" + nic.Name, "KB", ContainerNetwork,
(s) => { LookupNic(s, (ns) => { return ns.BytesSent; }, 1024.0); });
MakeStat("TotalBytes/" + nic.Name, "KB", ContainerNetwork,
(s) => { LookupNic(s, (ns) => { return ns.BytesSent + ns.BytesReceived; }, 1024.0); });
}
}
}
}
catch (Exception e)
{
m_log.ErrorFormat("{0} Exception creating 'Network Interface': {1}", LogHeader, e);
}
MakeStat("ProcessMemory", "MB", ContainerMemory,
(s) => { s.Value = Process.GetCurrentProcess().WorkingSet64 / 1024d / 1024d; });
MakeStat("ObjectMemory", "MB", ContainerMemory,
(s) => { s.Value = GC.GetTotalMemory(false) / 1024d / 1024d; });
MakeStat("LastMemoryChurn", "MB/sec", ContainerMemory,
(s) => { s.Value = Math.Round(MemoryWatchdog.LastMemoryChurn * 1000d / 1024d / 1024d, 3); });
MakeStat("AverageMemoryChurn", "MB/sec", ContainerMemory,
(s) => { s.Value = Math.Round(MemoryWatchdog.AverageMemoryChurn * 1000d / 1024d / 1024d, 3); });
}
// Notes on performance counters:
// "How To Read Performance Counters": http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx
// "How to get the CPU Usage in C#": http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c
// "Mono Performance Counters": http://www.mono-project.com/Mono_Performance_Counters
private delegate double PerfCounterNextValue();
private void GetNextValue(Stat stat, PerfCounterControl perfControl)
{
GetNextValue(stat, perfControl, 1.0);
}
private void GetNextValue(Stat stat, PerfCounterControl perfControl, double factor)
{
if (Util.EnvironmentTickCountSubtract(perfControl.lastFetch) > performanceCounterSampleInterval)
{
if (perfControl != null && perfControl.perfCounter != null)
{
try
{
// Kludge for factor to run double duty. If -1, subtract the value from one
if (factor == -1)
stat.Value = 1 - perfControl.perfCounter.NextValue();
else
stat.Value = perfControl.perfCounter.NextValue() / factor;
}
catch (Exception e)
{
m_log.ErrorFormat("{0} Exception on NextValue fetching {1}: {2}", LogHeader, stat.Name, e);
}
perfControl.lastFetch = Util.EnvironmentTickCount();
}
}
}
private delegate double GetIPv4StatValue(IPv4InterfaceStatistics interfaceStat);
private void LookupNic(Stat stat, GetIPv4StatValue getter, double factor)
{
// Get the one nic that has the name of this stat
IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces().Where(
(network) => network.Name == stat.Description);
try
{
foreach (NetworkInterface nic in nics)
{
IPv4InterfaceStatistics intrStats = nic.GetIPv4Statistics();
if (intrStats != null)
stat.Value = Math.Round(getter(intrStats) / factor, 3);
break;
}
}
catch
{
// There are times interfaces go away so we just won't update the stat for this
m_log.ErrorFormat("{0} Exception fetching stat on interface '{1}'", LogHeader, stat.Description);
}
}
}
public class ServerStatsAggregator : Stat
{
public ServerStatsAggregator(
string shortName,
string name,
string description,
string unitName,
string category,
string container
)
: base(
shortName,
name,
description,
unitName,
category,
container,
StatType.Push,
MeasuresOfInterest.None,
null,
StatVerbosity.Info)
{
}
public override string ToConsoleString()
{
StringBuilder sb = new StringBuilder();
return sb.ToString();
}
public override OSDMap ToOSDMap()
{
OSDMap ret = new OSDMap();
return ret;
}
}
}

View File

@ -204,7 +204,7 @@ public sealed class BSCharacter : BSPhysObject
// move. Thus, the velocity cannot be forced to zero. The problem is that small velocity // move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
// errors can creap in and the avatar will slowly float off in some direction. // errors can creap in and the avatar will slowly float off in some direction.
// So, the problem is that, when an avatar is standing, we cannot tell creaping error // So, the problem is that, when an avatar is standing, we cannot tell creaping error
// from real pushing.OMV.Vector3.Zero; // from real pushing.
// The code below keeps setting the velocity to zero hoping the world will keep pushing. // The code below keeps setting the velocity to zero hoping the world will keep pushing.
_velocityMotor.Step(timeStep); _velocityMotor.Step(timeStep);
@ -254,9 +254,11 @@ public sealed class BSCharacter : BSPhysObject
} }
// If falling, we keep the world's downward vector no matter what the other axis specify. // If falling, we keep the world's downward vector no matter what the other axis specify.
// The check for _velocity.Z < 0 makes jumping work (temporary upward force).
if (!Flying && !IsColliding) if (!Flying && !IsColliding)
{ {
stepVelocity.Z = _velocity.Z; if (_velocity.Z < 0)
stepVelocity.Z = _velocity.Z;
// DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity); // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
} }
@ -512,7 +514,7 @@ public sealed class BSCharacter : BSPhysObject
// just assign to "Position" because of potential call loops. // just assign to "Position" because of potential call loops.
PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate() PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
{ {
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
ForcePosition = _position; ForcePosition = _position;
}); });
ret = true; ret = true;
@ -572,7 +574,7 @@ public sealed class BSCharacter : BSPhysObject
m_targetVelocity = value; m_targetVelocity = value;
OMV.Vector3 targetVel = value; OMV.Vector3 targetVel = value;
if (_setAlwaysRun) if (_setAlwaysRun)
targetVel *= BSParam.AvatarAlwaysRunFactor; targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f);
PhysicsScene.TaintedObject("BSCharacter.setTargetVelocity", delegate() PhysicsScene.TaintedObject("BSCharacter.setTargetVelocity", delegate()
{ {

View File

@ -264,32 +264,6 @@
;; Default script engine to use. Currently, we only have XEngine ;; Default script engine to use. Currently, we only have XEngine
; DefaultScriptEngine = "XEngine" ; DefaultScriptEngine = "XEngine"
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
;; Map tile options. You can choose to generate normal maptiles or nominate an uploaded texture to
;; be the map tile using the MaptileStaticUUID parameter in this section or for individual regions in
;; the regions config file(s). If you do not want to upload map tiles at all, then you will need
;; to disable the MapImageServiceModule entirely.
; GenerateMaptiles = true
;# {MaptileRefresh} {GenerateMaptiles} {Maptile refresh period?} {} 0
;; If desired, a running region can update the map tiles periodically
;; to reflect building activity. This names no sense of you don't have
;; prims on maptiles. Value is in seconds.
; MaptileRefresh = 0
;# {MaptileStaticUUID} {} {Asset ID for static map texture} {} 00000000-0000-0000-0000-000000000000
;; If not generating maptiles, use this static texture asset ID
; MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
;# {TextureOnMapTile} {} {Use terrain textures for map tiles?} {true false} true
;; Use terrain texture for maptiles if true, use shaded green if false
; TextureOnMapTile = true
;# {DrawPrimOnMapTile} {} {Draw prim shapes on map tiles?} {true false} false
;; Draw objects on maptile. This step might take a long time if you've
;; got a large number of objects, so you can turn it off here if you'd like.
; DrawPrimOnMapTile = true
;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080 ;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080
;; Http proxy setting for llHTTPRequest and dynamic texture loading, if ;; Http proxy setting for llHTTPRequest and dynamic texture loading, if
;; required ;; required
@ -358,6 +332,35 @@
;; This is a default that can be overwritten in some sections. ;; This is a default that can be overwritten in some sections.
; GatekeeperURI = "http://127.0.0.1:9000" ; GatekeeperURI = "http://127.0.0.1:9000"
[Map]
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
;; Map tile options. You can choose to generate normal maptiles or nominate an uploaded texture to
;; be the map tile using the MaptileStaticUUID parameter in this section or for individual regions in
;; the regions config file(s). If you do not want to upload map tiles at all, then you will need
;; to disable the MapImageServiceModule entirely.
; GenerateMaptiles = true
;# {MaptileRefresh} {GenerateMaptiles} {Maptile refresh period?} {} 0
;; If desired, a running region can update the map tiles periodically
;; to reflect building activity. This names no sense of you don't have
;; prims on maptiles. Value is in seconds.
; MaptileRefresh = 0
;# {MaptileStaticUUID} {} {Asset ID for static map texture} {} 00000000-0000-0000-0000-000000000000
;; If not generating maptiles, use this static texture asset ID
; MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
;# {TextureOnMapTile} {} {Use terrain textures for map tiles?} {true false} true
;; Use terrain texture for maptiles if true, use shaded green if false
; TextureOnMapTile = true
;# {DrawPrimOnMapTile} {} {Draw prim shapes on map tiles?} {true false} false
;; Draw objects on maptile. This step might take a long time if you've
;; got a large number of objects, so you can turn it off here if you'd like.
; DrawPrimOnMapTile = true
[Estates] [Estates]
; If these values are commented out then the user will be asked for estate details when required (this is the normal case). ; If these values are commented out then the user will be asked for estate details when required (this is the normal case).
; If these values are uncommented then they will be used to create a default estate as necessary. ; If these values are uncommented then they will be used to create a default estate as necessary.

View File

@ -280,32 +280,6 @@
DefaultScriptEngine = "XEngine" DefaultScriptEngine = "XEngine"
; ##
; ## WORLD MAP
; ##
;WorldMapModule = "WorldMap"
;MapImageModule = "MapImageModule"
; World map blacklist timeout in seconds
;BlacklistTimeout = 600
; Set to false to not generate any maptiles
;GenerateMaptiles = true
; Refresh (in seconds) the map tile periodically
;MaptileRefresh = 0
; If not generating maptiles, use this static texture asset ID
;MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
; Draw objects on maptile. This step might take a long time if you've got a large number of
; objects, so you can turn it off here if you'd like.
DrawPrimOnMapTile = true
; Use terrain texture for maptiles if true, use shaded green if false
TextureOnMapTile = true
; ## ; ##
; ## EMAIL MODULE ; ## EMAIL MODULE
; ## ; ##
@ -343,6 +317,30 @@
UseTrashOnDelete = True UseTrashOnDelete = True
[Map]
;WorldMapModule = "WorldMap"
;MapImageModule = "MapImageModule"
; World map blacklist timeout in seconds
;BlacklistTimeout = 600
; Set to false to not generate any maptiles
;GenerateMaptiles = true
; Refresh (in seconds) the map tile periodically
;MaptileRefresh = 0
; If not generating maptiles, use this static texture asset ID
;MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
; Draw objects on maptile. This step might take a long time if you've got a large number of
; objects, so you can turn it off here if you'd like.
DrawPrimOnMapTile = true
; Use terrain texture for maptiles if true, use shaded green if false
TextureOnMapTile = true
[RegionReady] [RegionReady]
; Enable this module to get notified once all items and scripts in the region have been completely loaded and compiled ; Enable this module to get notified once all items and scripts in the region have been completely loaded and compiled
enabled = true enabled = true

View File

@ -333,6 +333,7 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
SRV_ProfileServerURI = "http://127.0.0.1:8002" SRV_ProfileServerURI = "http://127.0.0.1:8002"
SRV_FriendsServerURI = "http://127.0.0.1:8002" SRV_FriendsServerURI = "http://127.0.0.1:8002"
SRV_IMServerURI = "http://127.0.0.1:8002" SRV_IMServerURI = "http://127.0.0.1:8002"
SRV_GroupsServerURI = "http://127.0.0.1:8002"
;; Regular expressions for controlling which client versions are accepted/denied. ;; Regular expressions for controlling which client versions are accepted/denied.
;; An empty string means nothing is checked. ;; An empty string means nothing is checked.