Log how many scripts are candidates for starting and how many are actually started.

Adds DebugLevel infrastructure to XEngine though currently commented out and unused.
0.7.3-extended
Justin Clark-Casey (justincc) 2012-06-20 00:10:19 +01:00
parent 9779ceded5
commit 499b778391
5 changed files with 176 additions and 75 deletions

View File

@ -81,7 +81,12 @@ namespace OpenSim.Region.Framework.Interfaces
/// <summary> /// <summary>
/// Start all the scripts contained in this entity's inventory /// Start all the scripts contained in this entity's inventory
/// </summary> /// </summary>
void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); /// <param name="startParam"></param>
/// <param name="postOnRez"></param>
/// <param name="engine"></param>
/// <param name="stateSource"></param>
/// <returns>Number of scripts started.</returns>
int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
ArrayList GetScriptErrors(UUID itemID); ArrayList GetScriptErrors(UUID itemID);
void ResumeScripts(); void ResumeScripts();
@ -102,7 +107,11 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name="postOnRez"></param> /// <param name="postOnRez"></param>
/// <param name="engine"></param> /// <param name="engine"></param>
/// <param name="stateSource"></param> /// <param name="stateSource"></param>
void CreateScriptInstance( /// <returns>
/// true if the script instance was valid for starting, false otherwise. This does not guarantee
/// that the script was actually started, just that the script was valid (i.e. its asset data could be found, etc.)
/// </returns>
bool CreateScriptInstance(
TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource); TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource);
/// <summary> /// <summary>
@ -113,7 +122,11 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name="postOnRez"></param> /// <param name="postOnRez"></param>
/// <param name="engine"></param> /// <param name="engine"></param>
/// <param name="stateSource"></param> /// <param name="stateSource"></param>
void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); /// <returns>
/// true if the script instance was valid for starting, false otherwise. This does not guarantee
/// that the script was actually started, just that the script was valid (i.e. its asset data could be found, etc.)
/// </returns>
bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource);
/// <summary> /// <summary>
/// Stop a script which is in this prim's inventory. /// Stop a script which is in this prim's inventory.

View File

@ -59,19 +59,32 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary> /// <summary>
/// Creates all the scripts in the scene which should be started. /// Creates all the scripts in the scene which should be started.
/// </summary> /// </summary>
public void CreateScriptInstances() /// <returns>
/// Number of scripts that were valid for starting. This does not guarantee that all these scripts
/// were actually started, but just that the start could be attempt (e.g. the asset data for the script could be found)
/// </returns>
public int CreateScriptInstances()
{ {
m_log.Info("[PRIM INVENTORY]: Creating scripts in scene"); m_log.InfoFormat("[SCENE]: Initializing script instances in {0}", RegionInfo.RegionName);
int scriptsValidForStarting = 0;
EntityBase[] entities = Entities.GetEntities(); EntityBase[] entities = Entities.GetEntities();
foreach (EntityBase group in entities) foreach (EntityBase group in entities)
{ {
if (group is SceneObjectGroup) if (group is SceneObjectGroup)
{ {
((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); scriptsValidForStarting
+= ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
((SceneObjectGroup) group).ResumeScripts(); ((SceneObjectGroup) group).ResumeScripts();
} }
} }
m_log.InfoFormat(
"[SCENE]: Initialized {0} script instances in {1}",
scriptsValidForStarting, RegionInfo.RegionName);
return scriptsValidForStarting;
} }
/// <summary> /// <summary>
@ -79,7 +92,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void StartScripts() public void StartScripts()
{ {
m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); m_log.InfoFormat("[SCENE]: Starting scripts in {0}, please wait.", RegionInfo.RegionName);
IScriptModule[] engines = RequestModuleInterfaces<IScriptModule>(); IScriptModule[] engines = RequestModuleInterfaces<IScriptModule>();

View File

@ -54,16 +54,28 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary> /// <summary>
/// Start the scripts contained in all the prims in this group. /// Start the scripts contained in all the prims in this group.
/// </summary> /// </summary>
public void CreateScriptInstances(int startParam, bool postOnRez, /// <param name="startParam"></param>
string engine, int stateSource) /// <param name="postOnRez"></param>
/// <param name="engine"></param>
/// <param name="stateSource"></param>
/// <returns>
/// Number of scripts that were valid for starting. This does not guarantee that all these scripts
/// were actually started, but just that the start could be attempt (e.g. the asset data for the script could be found)
/// </returns>
public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{ {
int scriptsStarted = 0;
// Don't start scripts if they're turned off in the region! // Don't start scripts if they're turned off in the region!
if (!m_scene.RegionInfo.RegionSettings.DisableScripts) if (!m_scene.RegionInfo.RegionSettings.DisableScripts)
{ {
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++) for (int i = 0; i < parts.Length; i++)
parts[i].Inventory.CreateScriptInstances(startParam, postOnRez, engine, stateSource); scriptsStarted
+= parts[i].Inventory.CreateScriptInstances(startParam, postOnRez, engine, stateSource);
} }
return scriptsStarted;
} }
/// <summary> /// <summary>

View File

@ -217,14 +217,17 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
/// <summary> public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
/// Start all the scripts contained in this prim's inventory
/// </summary>
public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{ {
List<TaskInventoryItem> scripts = GetInventoryScripts(); int scriptsValidForStarting = 0;
List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts) foreach (TaskInventoryItem item in scripts)
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); if (CreateScriptInstance(item, startParam, postOnRez, engine, stateSource))
scriptsValidForStarting++;
return scriptsValidForStarting;
} }
public ArrayList GetScriptErrors(UUID itemID) public ArrayList GetScriptErrors(UUID itemID)
@ -255,7 +258,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </param> /// </param>
public void RemoveScriptInstances(bool sceneObjectBeingDeleted) public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
{ {
List<TaskInventoryItem> scripts = GetInventoryScripts(); List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts) foreach (TaskInventoryItem item in scripts)
RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
} }
@ -264,61 +267,65 @@ namespace OpenSim.Region.Framework.Scenes
/// Start a script which is in this prim's inventory. /// Start a script which is in this prim's inventory.
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="item"></param>
/// <returns></returns> /// <returns>true if the script instance was created, false otherwise</returns>
public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) public bool CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource)
{ {
// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", // m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}",
// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); // item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
return; return false;
m_part.AddFlag(PrimFlags.Scripted); m_part.AddFlag(PrimFlags.Scripted);
if (!m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) if (m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts)
return false;
if (stateSource == 2 && // Prim crossing
m_part.ParentGroup.Scene.m_trustBinaries)
{ {
if (stateSource == 2 && // Prim crossing lock (m_items)
m_part.ParentGroup.Scene.m_trustBinaries)
{ {
lock (m_items) m_items[item.ItemID].PermsMask = 0;
{ m_items[item.ItemID].PermsGranter = UUID.Zero;
m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero;
}
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return;
} }
AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
if (null == asset) m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
{ m_part.ParentGroup.AddActiveScriptCount(1);
m_log.ErrorFormat( m_part.ScheduleFullUpdate();
"[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", return true;
item.Name, item.ItemID, m_part.AbsolutePosition, }
m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
}
else
{
if (m_part.ParentGroup.m_savedScriptState != null)
item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID);
lock (m_items) AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
{ if (null == asset)
m_items[item.ItemID].OldItemID = item.OldItemID; {
m_items[item.ItemID].PermsMask = 0; m_log.ErrorFormat(
m_items[item.ItemID].PermsGranter = UUID.Zero; "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
} item.Name, item.ItemID, m_part.AbsolutePosition,
m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
string script = Utils.BytesToString(asset.Data); return false;
m_part.ParentGroup.Scene.EventManager.TriggerRezScript( }
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); else
m_part.ParentGroup.AddActiveScriptCount(1); {
m_part.ScheduleFullUpdate(); if (m_part.ParentGroup.m_savedScriptState != null)
item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID);
lock (m_items)
{
m_items[item.ItemID].OldItemID = item.OldItemID;
m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero;
} }
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return true;
} }
} }
@ -384,22 +391,22 @@ namespace OpenSim.Region.Framework.Scenes
return stateID; return stateID;
} }
/// <summary> public bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
/// Start a script which is in this prim's inventory.
/// </summary>
/// <param name="itemId">
/// A <see cref="UUID"/>
/// </param>
public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{ {
TaskInventoryItem item = GetInventoryItem(itemId); TaskInventoryItem item = GetInventoryItem(itemId);
if (item != null) if (item != null)
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); {
return CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
}
else else
{
m_log.ErrorFormat( m_log.ErrorFormat(
"[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
itemId, m_part.Name, m_part.UUID, itemId, m_part.Name, m_part.UUID,
m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
return false;
}
} }
/// <summary> /// <summary>
@ -1119,14 +1126,14 @@ namespace OpenSim.Region.Framework.Scenes
return ret; return ret;
} }
public List<TaskInventoryItem> GetInventoryScripts() public List<TaskInventoryItem> GetInventoryItems(InventoryType type)
{ {
List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
lock (m_items) lock (m_items)
{ {
foreach (TaskInventoryItem item in m_items.Values) foreach (TaskInventoryItem item in m_items.Values)
if (item.InvType == (int)InventoryType.LSL) if (item.InvType == (int)type)
ret.Add(item); ret.Add(item);
} }
@ -1145,7 +1152,7 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0) // No engine at all if (engines.Length == 0) // No engine at all
return ret; return ret;
List<TaskInventoryItem> scripts = GetInventoryScripts(); List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts) foreach (TaskInventoryItem item in scripts)
{ {
@ -1173,7 +1180,7 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0) if (engines.Length == 0)
return; return;
List<TaskInventoryItem> scripts = GetInventoryScripts(); List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts) foreach (TaskInventoryItem item in scripts)
{ {

View File

@ -62,6 +62,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Control the printing of certain debug messages.
/// </summary>
/// <remarks>
/// If DebugLevel >= 1, then we log every time that a script is started.
/// </remarks>
// public int DebugLevel { get; set; }
private SmartThreadPool m_ThreadPool; private SmartThreadPool m_ThreadPool;
private int m_MaxScriptQueue; private int m_MaxScriptQueue;
private Scene m_Scene; private Scene m_Scene;
@ -216,9 +224,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
AppDomain.CurrentDomain.AssemblyResolve += AppDomain.CurrentDomain.AssemblyResolve +=
OnAssemblyResolve; OnAssemblyResolve;
m_log.InfoFormat("[XEngine] Initializing scripts in region {0}",
scene.RegionInfo.RegionName);
m_Scene = scene; m_Scene = scene;
m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName);
m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2);
m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100);
@ -321,8 +328,41 @@ namespace OpenSim.Region.ScriptEngine.XEngine
"Starts all stopped scripts." "Starts all stopped scripts."
+ "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.", + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.",
(module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
// MainConsole.Instance.Commands.AddCommand(
// "Debug", false, "debug xengine", "debug xengine [<level>]",
// "Turn on detailed xengine debugging.",
// "If level <= 0, then no extra logging is done.\n"
// + "If level >= 1, then we log every time that a script is started.",
// HandleDebugLevelCommand);
} }
/// <summary>
/// Change debug level
/// </summary>
/// <param name="module"></param>
/// <param name="args"></param>
// private void HandleDebugLevelCommand(string module, string[] args)
// {
// if (args.Length == 3)
// {
// int newDebug;
// if (int.TryParse(args[2], out newDebug))
// {
// DebugLevel = newDebug;
// MainConsole.Instance.OutputFormat("Debug level set to {0}", newDebug);
// }
// }
// else if (args.Length == 2)
// {
// MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel);
// }
// else
// {
// MainConsole.Instance.Output("Usage: debug xengine 0..1");
// }
// }
/// <summary> /// <summary>
/// Parse the raw item id into a script instance from the command params if it's present. /// Parse the raw item id into a script instance from the command params if it's present.
/// </summary> /// </summary>
@ -825,8 +865,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
} }
object[] o; object[] o;
int scriptsStarted = 0;
while (m_CompileQueue.Dequeue(out o)) while (m_CompileQueue.Dequeue(out o))
DoOnRezScript(o); {
if (DoOnRezScript(o))
{
scriptsStarted++;
// if (scriptsStarted % 50 == 0)
// m_log.DebugFormat(
// "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
}
}
m_log.DebugFormat(
"[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
// NOTE: Despite having a lockless queue, this lock is required // NOTE: Despite having a lockless queue, this lock is required
// to make sure there is never no compile thread while there // to make sure there is never no compile thread while there
@ -1067,6 +1122,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
item.Name, startParam, postOnRez, item.Name, startParam, postOnRez,
stateSource, m_MaxScriptQueue); stateSource, m_MaxScriptQueue);
// if (DebugLevel >= 1)
m_log.DebugFormat( m_log.DebugFormat(
"[XEngine] Loaded script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}", "[XEngine] Loaded script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID, part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,