Improve inventory preload tracking and reporting
Refactored inventory preload logic to track both folder and item counts, and updated related command and service methods to report these values. Changed folder loading to be asynchronous and recursive, improved reporting format, and fixed root folder naming in inventory contents command.
This commit is contained in:
parent
e14ba787d4
commit
93dbde2818
2 changed files with 52 additions and 34 deletions
|
|
@ -1092,11 +1092,11 @@ namespace SecondBotEvents.Commands
|
||||||
}
|
}
|
||||||
|
|
||||||
[About("Requests the number of folders preloaded")]
|
[About("Requests the number of folders preloaded")]
|
||||||
[ReturnHints("number of preloaded folders")]
|
[ReturnHints("folders:X,items:X as a string")]
|
||||||
[CmdTypeGet()]
|
[CmdTypeGet()]
|
||||||
public object InventoryPreloadFolderCount()
|
public object InventoryPreloadCount()
|
||||||
{
|
{
|
||||||
return BasicReply(master.DataStoreService.GetPreloadedFolderCount().ToString());
|
return BasicReply("folders:"+ master.DataStoreService.GetPreloadedFolderCount().ToString()+",items:"+master.DataStoreService.GetPreloadedItemCount().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1111,7 +1111,7 @@ namespace SecondBotEvents.Commands
|
||||||
[CmdTypeGet()]
|
[CmdTypeGet()]
|
||||||
public object InventoryContentsCatched()
|
public object InventoryContentsCatched()
|
||||||
{
|
{
|
||||||
InventoryNodeEntry root = LoadInventoryNode(GetClient().Inventory.Store.RootFolder.UUID,"root");
|
InventoryNodeEntry root = LoadInventoryNode(GetClient().Inventory.Store.RootFolder.UUID,"My Inventory");
|
||||||
return BasicReply(JsonConvert.SerializeObject(root));
|
return BasicReply(JsonConvert.SerializeObject(root));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -223,11 +223,13 @@ namespace SecondBotEvents.Services
|
||||||
return "Loading "+preloadingFolders.Count()+" inventory folders";
|
return "Loading "+preloadingFolders.Count()+" inventory folders";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sum = commandHistories.Count + KeyValueStoreLastUsed.Count + KeyValueStore.Count +
|
int sum = commandHistories.Count + KeyValueStoreLastUsed.Count + KeyValueStore.Count +
|
||||||
chatWindowsOwner.Count + chatWindowsIsGroup.Count + chatWindowsUnread.Count +
|
chatWindowsOwner.Count + chatWindowsIsGroup.Count + chatWindowsUnread.Count +
|
||||||
chatWindows.Count + localChatHistory.Count + groupRoles.Count +
|
chatWindows.Count + localChatHistory.Count + groupRoles.Count +
|
||||||
groupMembers.Count + groupsKey2Name.Count + avatarsName2Key.Count + avprops.Count;
|
groupMembers.Count + groupsKey2Name.Count + avatarsName2Key.Count + avprops.Count;
|
||||||
return sum.ToString();
|
string returndat = "Total entrys: "+sum.ToString()+", Preloaded inventory: "+preloadFolderCount.ToString()+" folders and "+preloadItemCount.ToString()+" items";
|
||||||
|
return returndat;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddCommandToHistory(bool status, string command, string[] args, string results=null)
|
public void AddCommandToHistory(bool status, string command, string[] args, string results=null)
|
||||||
|
|
@ -1017,21 +1019,26 @@ namespace SecondBotEvents.Services
|
||||||
if(myConfig.GetPrefetchInventory() == true)
|
if(myConfig.GetPrefetchInventory() == true)
|
||||||
{
|
{
|
||||||
preloadDone = false;
|
preloadDone = false;
|
||||||
Task.Run(() =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
preloadFolder("root", GetClient().Inventory.Store.RootFolder.UUID, myConfig.GetPrefetchInventoryDepth(), 0);
|
await preloadFolder("root", GetClient().Inventory.Store.RootFolder.UUID, myConfig.GetPrefetchInventoryDepth(), 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<string> preloadingFolders = [];
|
protected List<string> preloadingFolders = [];
|
||||||
protected bool preloadDone = true;
|
protected bool preloadDone = true;
|
||||||
public int preloadFolderCount = 0;
|
protected int preloadFolderCount = 0;
|
||||||
|
protected int preloadItemCount = 0;
|
||||||
|
|
||||||
public int GetPreloadedFolderCount()
|
public int GetPreloadedFolderCount()
|
||||||
{
|
{
|
||||||
return preloadFolderCount;
|
return preloadFolderCount;
|
||||||
}
|
}
|
||||||
|
public int GetPreloadedItemCount()
|
||||||
|
{
|
||||||
|
return preloadItemCount;
|
||||||
|
}
|
||||||
public bool preloadInventoryReady()
|
public bool preloadInventoryReady()
|
||||||
{
|
{
|
||||||
if(myConfig.GetPrefetchInventory() == false)
|
if(myConfig.GetPrefetchInventory() == false)
|
||||||
|
|
@ -1049,38 +1056,49 @@ namespace SecondBotEvents.Services
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async void preloadFolder(string foldername,UUID folder, int maxDepth, int currentDepth)
|
protected async Task preloadFolder(string foldername,UUID folder, int maxDepth, int currentDepth)
|
||||||
{
|
{
|
||||||
await Task.Run(async () =>
|
lock (preloadingFolders)
|
||||||
{
|
{
|
||||||
lock (preloadingFolders)
|
preloadingFolders.Add(folder.Guid.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Delay(_delayRandom.Next(500, 1251) * (currentDepth+1));
|
||||||
|
|
||||||
|
List<InventoryBase> foldercontents = GetClient().Inventory.FolderContents(
|
||||||
|
folder,
|
||||||
|
GetClient().Self.AgentID, true, true,
|
||||||
|
InventorySortOrder.ByDate, TimeSpan.FromSeconds(30), false);
|
||||||
|
|
||||||
|
List<Task> subFolderTasks = [];
|
||||||
|
|
||||||
|
foreach (InventoryBase item in foldercontents)
|
||||||
|
{
|
||||||
|
string entrytype = item.GetType().Name.Replace("Inventory", "");
|
||||||
|
if (entrytype != "Folder")
|
||||||
{
|
{
|
||||||
preloadingFolders.Add(folder.Guid.ToString());
|
Interlocked.Increment(ref preloadItemCount);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
await Task.Delay(_delayRandom.Next(500, 1251) * (currentDepth+1));
|
if ((currentDepth + 1) > maxDepth)
|
||||||
List<InventoryBase> foldercontents = GetClient().Inventory.FolderContents(
|
|
||||||
GetClient().Inventory.Store.RootFolder.UUID,
|
|
||||||
GetClient().Self.AgentID, true, true,
|
|
||||||
InventorySortOrder.ByName, TimeSpan.FromSeconds(30), false);
|
|
||||||
foreach (InventoryBase item in foldercontents)
|
|
||||||
{
|
{
|
||||||
string entrytype = item.GetType().Name.Replace("Inventory", "");
|
continue;
|
||||||
if (entrytype != "Folder")
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ((currentDepth + 1) > maxDepth)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
preloadFolder(item.Name, item.UUID, maxDepth, currentDepth + 1);
|
|
||||||
}
|
}
|
||||||
lock (preloadingFolders)
|
// Start loading subfolder but don't wait for it yet
|
||||||
{
|
subFolderTasks.Add(preloadFolder(item.Name, item.UUID, maxDepth, currentDepth + 1));
|
||||||
preloadFolderCount++;
|
}
|
||||||
preloadingFolders.Remove(folder.Guid.ToString());
|
|
||||||
}
|
// Wait for all subfolder tasks to complete
|
||||||
});
|
if (subFolderTasks.Count > 0)
|
||||||
|
{
|
||||||
|
await Task.WhenAll(subFolderTasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (preloadingFolders)
|
||||||
|
{
|
||||||
|
preloadFolderCount++;
|
||||||
|
preloadingFolders.Remove(folder.Guid.ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly string[] hard_blocked_agents = ["secondlife", "second life"];
|
readonly string[] hard_blocked_agents = ["secondlife", "second life"];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue