diff options
author | Sean Dague | 2007-12-08 14:27:12 +0000 |
---|---|---|
committer | Sean Dague | 2007-12-08 14:27:12 +0000 |
commit | 0855066968e30a9965088c14234b2bc93daf0481 (patch) | |
tree | 9f2a0c9a520af4bfa53fd3aa1ae651f0130bd5bb | |
parent | set svn:eol-style (diff) | |
download | opensim-SC-0855066968e30a9965088c14234b2bc93daf0481.zip opensim-SC-0855066968e30a9965088c14234b2bc93daf0481.tar.gz opensim-SC-0855066968e30a9965088c14234b2bc93daf0481.tar.bz2 opensim-SC-0855066968e30a9965088c14234b2bc93daf0481.tar.xz |
This patch fixes mantis 105. Basically, it stops the index exception when
no root folder is found and it makes the user server wait longer for the
inventory server to do its work.
From Justin Casey (IBM)
-rw-r--r-- | OpenSim/Framework/Communications/InventoryServiceBase.cs | 15 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs | 16 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs | 26 | ||||
-rw-r--r-- | OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs | 27 | ||||
-rw-r--r-- | OpenSim/Framework/InventoryItemBase.cs | 4 | ||||
-rw-r--r-- | OpenSim/Grid/UserServer/UserLoginService.cs | 34 |
6 files changed, 75 insertions, 47 deletions
diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index 091d829..e86eaac 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs | |||
@@ -82,10 +82,12 @@ namespace OpenSim.Framework.Communications | |||
82 | /// <returns></returns> | 82 | /// <returns></returns> |
83 | public List<InventoryFolderBase> RequestFirstLevelFolders(LLUUID userID) | 83 | public List<InventoryFolderBase> RequestFirstLevelFolders(LLUUID userID) |
84 | { | 84 | { |
85 | List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>(); | 85 | List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>(); |
86 | InventoryFolderBase rootFolder = null; | ||
87 | |||
86 | foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins) | 88 | foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins) |
87 | { | 89 | { |
88 | InventoryFolderBase rootFolder = plugin.Value.getUserRootFolder(userID); | 90 | rootFolder = plugin.Value.getUserRootFolder(userID); |
89 | if (rootFolder != null) | 91 | if (rootFolder != null) |
90 | { | 92 | { |
91 | inventoryList = plugin.Value.getInventoryFolders(rootFolder.folderID); | 93 | inventoryList = plugin.Value.getInventoryFolders(rootFolder.folderID); |
@@ -93,6 +95,13 @@ namespace OpenSim.Framework.Communications | |||
93 | return inventoryList; | 95 | return inventoryList; |
94 | } | 96 | } |
95 | } | 97 | } |
98 | |||
99 | if (null == rootFolder) | ||
100 | { | ||
101 | MainLog.Instance.Warn( | ||
102 | "INVENTORY", "Could not find a root folder belonging to user with ID " + userID); | ||
103 | } | ||
104 | |||
96 | return inventoryList; | 105 | return inventoryList; |
97 | } | 106 | } |
98 | 107 | ||
@@ -235,4 +244,4 @@ namespace OpenSim.Framework.Communications | |||
235 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); | 244 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); |
236 | public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item); | 245 | public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item); |
237 | } | 246 | } |
238 | } \ No newline at end of file | 247 | } |
diff --git a/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs b/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs index 364e0f2..cd0470c 100644 --- a/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs +++ b/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs | |||
@@ -201,11 +201,7 @@ namespace OpenSim.Framework.Data.MSSQL | |||
201 | } | 201 | } |
202 | } | 202 | } |
203 | 203 | ||
204 | /// <summary> | 204 | // see InventoryItemBase.getUserRootFolder |
205 | /// Returns the users inventory root folder. | ||
206 | /// </summary> | ||
207 | /// <param name="user"></param> | ||
208 | /// <returns></returns> | ||
209 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 205 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
210 | { | 206 | { |
211 | try | 207 | try |
@@ -224,8 +220,14 @@ namespace OpenSim.Framework.Data.MSSQL | |||
224 | items.Add(readInventoryFolder(reader)); | 220 | items.Add(readInventoryFolder(reader)); |
225 | 221 | ||
226 | InventoryFolderBase rootFolder = null; | 222 | InventoryFolderBase rootFolder = null; |
223 | |||
224 | // There should only ever be one root folder for a user. However, if there's more | ||
225 | // than one we'll simply use the first one rather than failing. It would be even | ||
226 | // nicer to print some message to this effect, but this feels like it's too low a | ||
227 | // to put such a message out, and it's too minor right now to spare the time to | ||
228 | // suitably refactor. | ||
227 | if (items.Count > 0) { | 229 | if (items.Count > 0) { |
228 | rootFolder = items[0]; //should only be one folder with parent set to zero (the root one). | 230 | rootFolder = items[0]; |
229 | } | 231 | } |
230 | 232 | ||
231 | reader.Close(); | 233 | reader.Close(); |
@@ -694,4 +696,4 @@ namespace OpenSim.Framework.Data.MSSQL | |||
694 | } | 696 | } |
695 | } | 697 | } |
696 | } | 698 | } |
697 | } \ No newline at end of file | 699 | } |
diff --git a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs index 7c86e2c..4020cc1 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs | |||
@@ -211,11 +211,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
211 | } | 211 | } |
212 | } | 212 | } |
213 | 213 | ||
214 | /// <summary> | 214 | // see InventoryItemBase.getUserRootFolder |
215 | /// Returns the users inventory root folder. | ||
216 | /// </summary> | ||
217 | /// <param name="user"></param> | ||
218 | /// <returns></returns> | ||
219 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 215 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
220 | { | 216 | { |
221 | try | 217 | try |
@@ -234,9 +230,19 @@ namespace OpenSim.Framework.Data.MySQL | |||
234 | List<InventoryFolderBase> items = new List<InventoryFolderBase>(); | 230 | List<InventoryFolderBase> items = new List<InventoryFolderBase>(); |
235 | while (reader.Read()) | 231 | while (reader.Read()) |
236 | items.Add(readInventoryFolder(reader)); | 232 | items.Add(readInventoryFolder(reader)); |
233 | |||
234 | InventoryFolderBase rootFolder = null; | ||
235 | |||
236 | // There should only ever be one root folder for a user. However, if there's more | ||
237 | // than one we'll simply use the first one rather than failing. It would be even | ||
238 | // nicer to print some message to this effect, but this feels like it's too low a | ||
239 | // to put such a message out, and it's too minor right now to spare the time to | ||
240 | // suitably refactor. | ||
241 | if (items.Count > 0) | ||
242 | { | ||
243 | rootFolder = items[0]; | ||
244 | } | ||
237 | 245 | ||
238 | InventoryFolderBase rootFolder = items[0]; | ||
239 | //should only be one folder with parent set to zero (the root one). | ||
240 | reader.Close(); | 246 | reader.Close(); |
241 | result.Dispose(); | 247 | result.Dispose(); |
242 | 248 | ||
@@ -252,7 +258,9 @@ namespace OpenSim.Framework.Data.MySQL | |||
252 | } | 258 | } |
253 | 259 | ||
254 | /// <summary> | 260 | /// <summary> |
255 | /// Returns a list of folders in a users inventory contained within the specified folder | 261 | /// Return a list of folders in a users inventory contained within the specified folder. |
262 | /// This method is only used in tests - in normal operation the user always have one, | ||
263 | /// and only one, root folder. | ||
256 | /// </summary> | 264 | /// </summary> |
257 | /// <param name="parentID">The folder to search</param> | 265 | /// <param name="parentID">The folder to search</param> |
258 | /// <returns>A list of inventory folders</returns> | 266 | /// <returns>A list of inventory folders</returns> |
@@ -605,4 +613,4 @@ namespace OpenSim.Framework.Data.MySQL | |||
605 | } | 613 | } |
606 | } | 614 | } |
607 | } | 615 | } |
608 | } \ No newline at end of file | 616 | } |
diff --git a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs index 5e95878..94084a6 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs | |||
@@ -226,11 +226,7 @@ namespace OpenSim.Framework.Data.SQLite | |||
226 | return new List<InventoryFolderBase>(); | 226 | return new List<InventoryFolderBase>(); |
227 | } | 227 | } |
228 | 228 | ||
229 | /// <summary> | 229 | // see InventoryItemBase.getUserRootFolder |
230 | /// Returns the users inventory root folder. | ||
231 | /// </summary> | ||
232 | /// <param name="user">The UUID of the user who is having inventory being returned</param> | ||
233 | /// <returns>Root inventory folder</returns> | ||
234 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 230 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
235 | { | 231 | { |
236 | List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); | 232 | List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); |
@@ -242,22 +238,15 @@ namespace OpenSim.Framework.Data.SQLite | |||
242 | folders.Add(buildFolder(row)); | 238 | folders.Add(buildFolder(row)); |
243 | } | 239 | } |
244 | 240 | ||
245 | if (folders.Count == 1) | 241 | // There should only ever be one root folder for a user. However, if there's more |
242 | // than one we'll simply use the first one rather than failing. It would be even | ||
243 | // nicer to print some message to this effect, but this feels like it's too low a | ||
244 | // to put such a message out, and it's too minor right now to spare the time to | ||
245 | // suitably refactor. | ||
246 | if (folders.Count > 1) | ||
246 | { | 247 | { |
247 | //we found the root | ||
248 | //System.Console.WriteLine("found root inventory folder"); | ||
249 | return folders[0]; | 248 | return folders[0]; |
250 | } | 249 | } |
251 | else if (folders.Count > 1) | ||
252 | { | ||
253 | //err shouldn't be more than one root | ||
254 | //System.Console.WriteLine("found more than one root inventory folder"); | ||
255 | } | ||
256 | else if (folders.Count == 0) | ||
257 | { | ||
258 | // no root? | ||
259 | //System.Console.WriteLine("couldn't find root inventory folder"); | ||
260 | } | ||
261 | 250 | ||
262 | return null; | 251 | return null; |
263 | } | 252 | } |
@@ -608,4 +597,4 @@ namespace OpenSim.Framework.Data.SQLite | |||
608 | return true; | 597 | return true; |
609 | } | 598 | } |
610 | } | 599 | } |
611 | } \ No newline at end of file | 600 | } |
diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index 0ee30bb..b9a11c9 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs | |||
@@ -184,7 +184,7 @@ namespace OpenSim.Framework | |||
184 | /// Returns the users inventory root folder. | 184 | /// Returns the users inventory root folder. |
185 | /// </summary> | 185 | /// </summary> |
186 | /// <param name="user">The UUID of the user who is having inventory being returned</param> | 186 | /// <param name="user">The UUID of the user who is having inventory being returned</param> |
187 | /// <returns>Root inventory folder</returns> | 187 | /// <returns>Root inventory folder, null if no root inventory folder was found</returns> |
188 | InventoryFolderBase getUserRootFolder(LLUUID user); | 188 | InventoryFolderBase getUserRootFolder(LLUUID user); |
189 | 189 | ||
190 | /// <summary> | 190 | /// <summary> |
@@ -285,4 +285,4 @@ namespace OpenSim.Framework | |||
285 | 285 | ||
286 | [XmlElement(ElementName = "folder", IsNullable = true)] public SerializableFolder root; | 286 | [XmlElement(ElementName = "folder", IsNullable = true)] public SerializableFolder root; |
287 | } | 287 | } |
288 | } \ No newline at end of file | 288 | } |
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs index f404cce..fa5eac5 100644 --- a/OpenSim/Grid/UserServer/UserLoginService.cs +++ b/OpenSim/Grid/UserServer/UserLoginService.cs | |||
@@ -197,15 +197,32 @@ namespace OpenSim.Grid.UserServer | |||
197 | 197 | ||
198 | protected override InventoryData CreateInventoryData(LLUUID userID) | 198 | protected override InventoryData CreateInventoryData(LLUUID userID) |
199 | { | 199 | { |
200 | List<InventoryFolderBase> folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>("POST", m_config.InventoryUrl + "RootFolders/", userID); | 200 | List<InventoryFolderBase> folders |
201 | if (folders ==null | folders.Count == 0) | 201 | = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>( |
202 | "POST", m_config.InventoryUrl + "RootFolders/", userID); | ||
203 | |||
204 | // In theory, the user will only ever be missing a root folder in situations where a grid | ||
205 | // which didn't previously run a grid wide inventory server is being transitioned to one | ||
206 | // which does. | ||
207 | if (null == folders | folders.Count == 0) | ||
202 | { | 208 | { |
203 | RestObjectPoster.BeginPostObject<LLUUID>(m_config.InventoryUrl + "CreateInventory/", userID); | 209 | MainLog.Instance.Warn( |
204 | Thread.Sleep(1000); | 210 | "LOGIN", |
205 | folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>("POST", m_config.InventoryUrl + "RootFolders/", userID); | 211 | "A root inventory folder for user ID " + userID + " was not found. A new set" |
212 | + " of empty inventory folders is being created."); | ||
213 | |||
214 | RestObjectPoster.BeginPostObject<LLUUID>( | ||
215 | m_config.InventoryUrl + "CreateInventory/", userID); | ||
216 | |||
217 | // A big delay should be okay here since the recreation of the user's root folders should | ||
218 | // only ever happen once. We need to sleep to let the inventory server do its work - | ||
219 | // previously 1000ms has been found to be too short. | ||
220 | Thread.Sleep(10000); | ||
221 | folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>( | ||
222 | "POST", m_config.InventoryUrl + "RootFolders/", userID); | ||
206 | } | 223 | } |
207 | 224 | ||
208 | if(folders.Count >0) | 225 | if (folders.Count > 0) |
209 | { | 226 | { |
210 | LLUUID rootID = LLUUID.Zero; | 227 | LLUUID rootID = LLUUID.Zero; |
211 | ArrayList AgentInventoryArray = new ArrayList(); | 228 | ArrayList AgentInventoryArray = new ArrayList(); |
@@ -228,6 +245,9 @@ namespace OpenSim.Grid.UserServer | |||
228 | } | 245 | } |
229 | else | 246 | else |
230 | { | 247 | { |
248 | MainLog.Instance.Warn("LOGIN", "The root inventory folder could still not be retrieved" + | ||
249 | " for user ID " + userID); | ||
250 | |||
231 | AgentInventory userInventory = new AgentInventory(); | 251 | AgentInventory userInventory = new AgentInventory(); |
232 | userInventory.CreateRootFolder(userID, false); | 252 | userInventory.CreateRootFolder(userID, false); |
233 | 253 | ||
@@ -248,4 +268,4 @@ namespace OpenSim.Grid.UserServer | |||
248 | } | 268 | } |
249 | } | 269 | } |
250 | } | 270 | } |
251 | } \ No newline at end of file | 271 | } |