aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Cache
diff options
context:
space:
mode:
authorJustin Clarke Casey2008-03-29 22:18:44 +0000
committerJustin Clarke Casey2008-03-29 22:18:44 +0000
commit875211b262ecda2eced68b217221dead20cbdb6b (patch)
treee84ecb6149076e71ce6d9fedeea5f0c49ca46d93 /OpenSim/Framework/Communications/Cache
parent* Updating ODE Libraries to release / dNODEBUG (diff)
downloadopensim-SC_OLD-875211b262ecda2eced68b217221dead20cbdb6b.zip
opensim-SC_OLD-875211b262ecda2eced68b217221dead20cbdb6b.tar.gz
opensim-SC_OLD-875211b262ecda2eced68b217221dead20cbdb6b.tar.bz2
opensim-SC_OLD-875211b262ecda2eced68b217221dead20cbdb6b.tar.xz
* Various 1.19.0.5 grid inventory request fixes. These will only take affect once the region and the grid servers have upgraded to this revision
* You may also need to clear your cache before seeing any effect. * These fixes may or may not affect inventory on the RC client. * These fixes should make non-root folders work better, stop inventory failure on first login, allow trash to be emptied and make texture picker in object edit view work properly * Fixes are 1) make initial root folder request wait for async inventory delivery, 2) deliver all folders in the initial login skeleton, not just the root child ones and 3) deal with situations where we receive child folders from the inventory service before their parent is received.
Diffstat (limited to 'OpenSim/Framework/Communications/Cache')
-rw-r--r--OpenSim/Framework/Communications/Cache/CachedUserInfo.cs128
-rw-r--r--OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs35
2 files changed, 140 insertions, 23 deletions
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
index 59e5b6e..f2dd2bf 100644
--- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
+++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
@@ -25,6 +25,9 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System;
29using System.Collections.Generic;
30
28using libsecondlife; 31using libsecondlife;
29 32
30namespace OpenSim.Framework.Communications.Cache 33namespace OpenSim.Framework.Communications.Cache
@@ -35,50 +38,135 @@ namespace OpenSim.Framework.Communications.Cache
35 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 38 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
36 39
37 private readonly CommunicationsManager m_parentCommsManager; 40 private readonly CommunicationsManager m_parentCommsManager;
38 // Fields 41
42 // FIXME: These need to be hidden behind accessors
39 public InventoryFolderImpl RootFolder = null; 43 public InventoryFolderImpl RootFolder = null;
40 public UserProfileData UserProfile = null; 44 public UserProfileData UserProfile = null;
45
46 /// <summary>
47 /// Stores received folders for which we have not yet received the parents.
48 /// </summary></param>
49 private IDictionary<LLUUID, IList<InventoryFolderImpl>> pendingCategorizationFolders
50 = new Dictionary<LLUUID, IList<InventoryFolderImpl>>();
41 51
42 public CachedUserInfo(CommunicationsManager commsManager) 52 public CachedUserInfo(CommunicationsManager commsManager)
43 { 53 {
44 m_parentCommsManager = commsManager; 54 m_parentCommsManager = commsManager;
45 } 55 }
46 56
47 // Methods 57 /// <summary>
48 public void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo) 58 /// Store a folder pending categorization when its parent is received.
59 /// </summary>
60 /// <param name="folder"></param>
61 private void AddPendingFolder(InventoryFolderImpl folder)
49 { 62 {
50 //m_log.DebugFormat("[INVENTORY CACHE]: Received folder {0} {1} for user {2}", folderInfo.name, folderInfo.folderID, userID); 63 LLUUID parentFolderId = folder.parentID;
51 64
52 if (userID == UserProfile.UUID) 65 if (pendingCategorizationFolders.ContainsKey(parentFolderId))
66 {
67 pendingCategorizationFolders[parentFolderId].Add(folder);
68 }
69 else
70 {
71 IList<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
72 folders.Add(folder);
73
74 pendingCategorizationFolders[parentFolderId] = folders;
75 }
76 }
77
78 /// <summary>
79 /// Add any pending folders which are children of parent
80 /// </summary>
81 /// <param name="parentId">
82 /// A <see cref="LLUUID"/>
83 /// </param>
84 private void ResolvePendingFolders(InventoryFolderImpl parent)
85 {
86 if (pendingCategorizationFolders.ContainsKey(parent.folderID))
53 { 87 {
54 if (RootFolder == null) 88 foreach (InventoryFolderImpl folder in pendingCategorizationFolders[parent.folderID])
55 { 89 {
56 if (folderInfo.parentID == LLUUID.Zero) 90// m_log.DebugFormat(
91// "[INVENTORY CACHE]: Resolving pending received folder {0} {1} into {2} {3}",
92// folder.name, folder.folderID, parent.name, parent.folderID);
93
94 if (!parent.SubFolders.ContainsKey(folder.folderID))
57 { 95 {
58 RootFolder = folderInfo; 96 parent.SubFolders.Add(folder.folderID, folder);
59 } 97 }
60 } 98 }
61 else if (RootFolder.folderID == folderInfo.parentID) 99 }
100 }
101
102 /// <summary>
103 /// Callback invoked when a folder is received from an async request to the inventory service.
104 /// </summary>
105 /// <param name="userID"></param>
106 /// <param name="folderInfo"></param>
107 public void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo)
108 {
109 // FIXME: Exceptions thrown upwards never appear on the console. Could fix further up if these
110 // are simply being swallowed
111 try
112 {
113// m_log.DebugFormat(
114// "[INVENTORY CACHE]: Received folder {0} {1} for user {2}",
115// folderInfo.name, folderInfo.folderID, userID);
116
117 if (userID == UserProfile.UUID)
62 { 118 {
63 if (!RootFolder.SubFolders.ContainsKey(folderInfo.folderID)) 119 if (RootFolder == null)
64 { 120 {
65 RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo); 121 if (folderInfo.parentID == LLUUID.Zero)
122 {
123 RootFolder = folderInfo;
124 }
66 } 125 }
67 } 126 else if (RootFolder.folderID == folderInfo.parentID)
68 else
69 {
70 InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.parentID);
71 if (folder != null)
72 { 127 {
73 if (!folder.SubFolders.ContainsKey(folderInfo.folderID)) 128 if (!RootFolder.SubFolders.ContainsKey(folderInfo.folderID))
74 { 129 {
75 folder.SubFolders.Add(folderInfo.folderID, folderInfo); 130 RootFolder.SubFolders.Add(folderInfo.folderID, folderInfo);
76 } 131 }
132 else
133 {
134 AddPendingFolder(folderInfo);
135 }
77 } 136 }
137 else
138 {
139 InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.parentID);
140 if (folder != null)
141 {
142 if (!folder.SubFolders.ContainsKey(folderInfo.folderID))
143 {
144 folder.SubFolders.Add(folderInfo.folderID, folderInfo);
145 }
146 }
147 else
148 {
149 AddPendingFolder(folderInfo);
150 }
151 }
152
153 ResolvePendingFolders(folderInfo);
78 } 154 }
79 } 155 }
156 catch (Exception e)
157 {
158 m_log.ErrorFormat("[INVENTORY CACHE] {0}", e);
159 }
80 } 160 }
81 161
162 /// <summary>
163 /// Callback invoked when an item is received from an async request to the inventory service.
164 ///
165 /// FIXME: We're assuming here that items are always received after all the folders have been
166 /// received.
167 /// </summary>
168 /// <param name="userID"></param>
169 /// <param name="folderInfo"></param>
82 public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) 170 public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo)
83 { 171 {
84 if ((userID == UserProfile.UUID) && (RootFolder != null)) 172 if ((userID == UserProfile.UUID) && (RootFolder != null))
diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
index 67022c7..c3f51da 100644
--- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
+++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs
@@ -27,7 +27,10 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Threading;
31
30using libsecondlife; 32using libsecondlife;
33
31using OpenSim.Framework.Console; 34using OpenSim.Framework.Console;
32 35
33namespace OpenSim.Framework.Communications.Cache 36namespace OpenSim.Framework.Communications.Cache
@@ -65,9 +68,7 @@ namespace OpenSim.Framework.Communications.Cache
65 68
66 if (userInfo.UserProfile != null) 69 if (userInfo.UserProfile != null)
67 { 70 {
68 // The request itself will occur when the agent finishes logging on to the region 71 // The inventory will be populated when the user actually enters the scene
69 // so there's no need to do it here.
70 //RequestInventoryForUser(userID, userInfo);
71 m_userProfiles.Add(userID, userInfo); 72 m_userProfiles.Add(userID, userInfo);
72 } 73 }
73 else 74 else
@@ -219,10 +220,34 @@ namespace OpenSim.Framework.Communications.Cache
219 CachedUserInfo userProfile; 220 CachedUserInfo userProfile;
220 if (m_userProfiles.TryGetValue(remoteClient.AgentId, out userProfile)) 221 if (m_userProfiles.TryGetValue(remoteClient.AgentId, out userProfile))
221 { 222 {
223 // XXX: When a client crosses into a scene, their entire inventory is fetched
224 // asynchronously. However, if the client is logging on and does not have a cached root
225 // folder, then the root folder request usually comes in *before* the async completes, leading to
226 // inventory failure.
227 //
228 // This is a crude way of dealing with that by retrying the lookup.
229 if (userProfile.RootFolder == null)
230 {
231 int attempts = 5;
232 while (attempts-- > 0)
233 {
234 Thread.Sleep(3000);
235
236 if (userProfile.RootFolder != null)
237 {
238 break;
239 }
240 }
241 }
242
222 if (userProfile.RootFolder != null) 243 if (userProfile.RootFolder != null)
223 { 244 {
224 if (userProfile.RootFolder.folderID == folderID) 245 if (userProfile.RootFolder.folderID == folderID)
225 { 246 {
247// m_log.DebugFormat(
248// "[AGENT INVENTORY]: Found root folder {0} for client {1}",
249// folderID, remoteClient.AgentId);
250
226 remoteClient.SendInventoryFolderDetails( 251 remoteClient.SendInventoryFolderDetails(
227 remoteClient.AgentId, folderID, userProfile.RootFolder.RequestListOfItems(), 252 remoteClient.AgentId, folderID, userProfile.RootFolder.RequestListOfItems(),
228 userProfile.RootFolder.RequestListOfFolders(), 253 userProfile.RootFolder.RequestListOfFolders(),
@@ -234,6 +259,10 @@ namespace OpenSim.Framework.Communications.Cache
234 { 259 {
235 if ((fold = userProfile.RootFolder.HasSubFolder(folderID)) != null) 260 if ((fold = userProfile.RootFolder.HasSubFolder(folderID)) != null)
236 { 261 {
262// m_log.DebugFormat(
263// "[AGENT INVENTORY]: Found folder {0} for client {1}",
264// folderID, remoteClient.AgentId);
265
237 remoteClient.SendInventoryFolderDetails( 266 remoteClient.SendInventoryFolderDetails(
238 remoteClient.AgentId, folderID, fold.RequestListOfItems(), 267 remoteClient.AgentId, folderID, fold.RequestListOfItems(),
239 fold.RequestListOfFolders(), fetchFolders, fetchItems); 268 fold.RequestListOfFolders(), fetchFolders, fetchItems);