aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
authorJustin Clarke Casey2009-03-13 20:46:53 +0000
committerJustin Clarke Casey2009-03-13 20:46:53 +0000
commitc04e7cdf2b8f95534dafe7faedb29e1ff1af36c8 (patch)
treefc5a72b39ba72eee84afba4dc9ff315acbb0096f /OpenSim/Region/CoreModules
parent* Remove asset cache size and texture stat reports from ASSET STATS since the... (diff)
downloadopensim-SC-c04e7cdf2b8f95534dafe7faedb29e1ff1af36c8.zip
opensim-SC-c04e7cdf2b8f95534dafe7faedb29e1ff1af36c8.tar.gz
opensim-SC-c04e7cdf2b8f95534dafe7faedb29e1ff1af36c8.tar.bz2
opensim-SC-c04e7cdf2b8f95534dafe7faedb29e1ff1af36c8.tar.xz
* Support loading empty folders in an iar
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs168
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs11
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs8
3 files changed, 102 insertions, 85 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index d794f00..4ad9974 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -200,11 +200,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
200 TarArchiveReader.TarEntryType entryType; 200 TarArchiveReader.TarEntryType entryType;
201 while ((data = archive.ReadEntry(out filePath, out entryType)) != null) 201 while ((data = archive.ReadEntry(out filePath, out entryType)) != null)
202 { 202 {
203 if (entryType == TarArchiveReader.TarEntryType.TYPE_DIRECTORY) 203 if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
204 {
205 m_log.WarnFormat("[INVENTORY ARCHIVER]: Ignoring directory entry {0}", filePath);
206 }
207 else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
208 { 204 {
209 if (LoadAsset(filePath, data)) 205 if (LoadAsset(filePath, data))
210 successfulAssetRestores++; 206 successfulAssetRestores++;
@@ -212,24 +208,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
212 failedAssetRestores++; 208 failedAssetRestores++;
213 } 209 }
214 else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH)) 210 else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH))
215 { 211 {
216 InventoryItemBase item = LoadInvItem(m_asciiEncoding.GetString(data)); 212 string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length);
217
218 if (item != null)
219 {
220 // Don't use the item ID that's in the file
221 item.ID = UUID.Random();
222
223 item.Creator = m_userInfo.UserProfile.ID;
224 item.Owner = m_userInfo.UserProfile.ID;
225 213
226 string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); 214 // Remove the file portion if we aren't already dealing with a directory path
215 if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
227 fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); 216 fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1);
228 string originalFsPath = fsPath; 217
218 string originalFsPath = fsPath;
229 219
230 m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); 220 m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath);
231 221
232 InventoryFolderImpl foundFolder = null; 222 InventoryFolderImpl foundFolder = null;
223
224 // XXX: Nasty way of dealing with a path that has no directory component
225 if (fsPath.Length > 0)
226 {
233 while (null == foundFolder && fsPath.Length > 0) 227 while (null == foundFolder && fsPath.Length > 0)
234 { 228 {
235 if (foldersCreated.ContainsKey(fsPath)) 229 if (foldersCreated.ContainsKey(fsPath))
@@ -256,81 +250,99 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
256 } 250 }
257 } 251 }
258 } 252 }
253 }
254 else
255 {
256 foundFolder = rootDestinationFolder;
257 }
259 258
260 string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); 259 string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length);
261 string[] rawDirsToCreate 260 string[] rawDirsToCreate
262 = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 261 = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
263 int i = 0; 262 int i = 0;
264 263
265 while (i < rawDirsToCreate.Length) 264 while (i < rawDirsToCreate.Length)
266 { 265 {
267 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); 266 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]);
268 267
269 int identicalNameIdentifierIndex 268 int identicalNameIdentifierIndex
270 = rawDirsToCreate[i].LastIndexOf( 269 = rawDirsToCreate[i].LastIndexOf(
271 ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); 270 ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR);
272 string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); 271 string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex);
273 272
274 UUID newFolderId = UUID.Random(); 273 UUID newFolderId = UUID.Random();
275 m_userInfo.CreateFolder( 274 m_userInfo.CreateFolder(
276 folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); 275 folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
277 foundFolder = foundFolder.GetChildFolder(newFolderId); 276 foundFolder = foundFolder.GetChildFolder(newFolderId);
278 277
279 // Record that we have now created this folder 278 // Record that we have now created this folder
280 fsPath += rawDirsToCreate[i] + "/"; 279 fsPath += rawDirsToCreate[i] + "/";
281 m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); 280 m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath);
282 foldersCreated[fsPath] = foundFolder; 281 foldersCreated[fsPath] = foundFolder;
283 282
284 if (0 == i) 283 if (0 == i)
285 nodesLoaded.Add(foundFolder); 284 nodesLoaded.Add(foundFolder);
286 285
287 i++; 286 i++;
288 } 287 }
289 288
290 /* 289 /*
291 string[] rawFolders = filePath.Split(new char[] { '/' }); 290 string[] rawFolders = filePath.Split(new char[] { '/' });
292 291
293 // Find the folders that do exist along the path given 292 // Find the folders that do exist along the path given
294 int i = 0; 293 int i = 0;
295 bool noFolder = false; 294 bool noFolder = false;
296 InventoryFolderImpl foundFolder = rootDestinationFolder; 295 InventoryFolderImpl foundFolder = rootDestinationFolder;
297 while (!noFolder && i < rawFolders.Length) 296 while (!noFolder && i < rawFolders.Length)
297 {
298 InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]);
299 if (null != folder)
298 { 300 {
299 InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]); 301 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name);
300 if (null != folder) 302 foundFolder = folder;
301 { 303 i++;
302 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name);
303 foundFolder = folder;
304 i++;
305 }
306 else
307 {
308 noFolder = true;
309 }
310 } 304 }
311 305 else
312 // Create any folders that did not previously exist
313 while (i < rawFolders.Length)
314 { 306 {
315 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]); 307 noFolder = true;
316
317 UUID newFolderId = UUID.Random();
318 m_userInfo.CreateFolder(
319 rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
320 foundFolder = foundFolder.GetChildFolder(newFolderId);
321 } 308 }
322 */ 309 }
323 310
324 // Reset folder ID to the one in which we want to load it 311 // Create any folders that did not previously exist
325 item.Folder = foundFolder.ID; 312 while (i < rawFolders.Length)
313 {
314 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]);
326 315
327 m_userInfo.AddItem(item); 316 UUID newFolderId = UUID.Random();
328 successfulItemRestores++; 317 m_userInfo.CreateFolder(
318 rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
319 foundFolder = foundFolder.GetChildFolder(newFolderId);
320 }
321 */
329 322
330 // If we're loading an item directly into the given destination folder then we need to record 323 if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
331 // it separately from any loaded root folders 324 {
332 if (rootDestinationFolder == foundFolder) 325 InventoryItemBase item = LoadInvItem(m_asciiEncoding.GetString(data));
333 nodesLoaded.Add(item); 326
327 if (item != null)
328 {
329 // Don't use the item ID that's in the file
330 item.ID = UUID.Random();
331
332 item.Creator = m_userInfo.UserProfile.ID;
333 item.Owner = m_userInfo.UserProfile.ID;
334
335 // Reset folder ID to the one in which we want to load it
336 item.Folder = foundFolder.ID;
337
338 m_userInfo.AddItem(item);
339 successfulItemRestores++;
340
341 // If we're loading an item directly into the given destination folder then we need to record
342 // it separately from any loaded root folders
343 if (rootDestinationFolder == foundFolder)
344 nodesLoaded.Add(item);
345 }
334 } 346 }
335 } 347 }
336 } 348 }
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
index 076fbce..0a0bb4c 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
@@ -83,6 +83,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
83 83
84 protected internal void Execute() 84 protected internal void Execute()
85 { 85 {
86 m_log.DebugFormat("[ARCHIVER]: AssetsRequest executed looking for {0} assets", m_repliesRequired);
87
86 // We can stop here if there are no assets to fetch 88 // We can stop here if there are no assets to fetch
87 if (m_repliesRequired == 0) 89 if (m_repliesRequired == 0)
88 m_assetsRequestCallback(m_assets, m_notFoundAssetUuids); 90 m_assetsRequestCallback(m_assets, m_notFoundAssetUuids);
@@ -100,6 +102,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
100 /// <param name="asset"></param> 102 /// <param name="asset"></param>
101 public void AssetRequestCallback(UUID assetID, AssetBase asset) 103 public void AssetRequestCallback(UUID assetID, AssetBase asset)
102 { 104 {
105 //m_log.DebugFormat("[ARCHIVER]: Received callback for asset {0}", assetID);
106
103 if (asset != null) 107 if (asset != null)
104 { 108 {
105 m_assetCache.ExpireAsset(assetID); 109 m_assetCache.ExpireAsset(assetID);
@@ -110,11 +114,12 @@ namespace OpenSim.Region.CoreModules.World.Archiver
110 m_notFoundAssetUuids.Add(assetID); 114 m_notFoundAssetUuids.Add(assetID);
111 } 115 }
112 116
113 //m_log.DebugFormat(
114 // "[ARCHIVER]: Received {0} assets and notification of {1} missing assets", m_assets.Count, m_notFoundAssetUuids.Count);
115
116 if (m_assets.Count + m_notFoundAssetUuids.Count == m_repliesRequired) 117 if (m_assets.Count + m_notFoundAssetUuids.Count == m_repliesRequired)
117 { 118 {
119 m_log.DebugFormat(
120 "[ARCHIVER]: Successfully received {0} assets and notification of {1} missing assets",
121 m_assets.Count, m_notFoundAssetUuids.Count);
122
118 // We want to stop using the asset cache thread asap as we now need to do the actual work of producing the archive 123 // We want to stop using the asset cache thread asap as we now need to do the actual work of producing the archive
119 Thread newThread = new Thread(PerformAssetsRequestCallback); 124 Thread newThread = new Thread(PerformAssetsRequestCallback);
120 newThread.Name = "OpenSimulator archiving thread post assets receipt"; 125 newThread.Name = "OpenSimulator archiving thread post assets receipt";
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
index 7aafaee..f6d0347 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
@@ -222,6 +222,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
222 object1PartLoaded.RotationOffset, Is.EqualTo(rotationOffset), "object1 rotation offset not equal"); 222 object1PartLoaded.RotationOffset, Is.EqualTo(rotationOffset), "object1 rotation offset not equal");
223 Assert.That( 223 Assert.That(
224 object1PartLoaded.OffsetPosition, Is.EqualTo(offsetPosition), "object1 offset position not equal"); 224 object1PartLoaded.OffsetPosition, Is.EqualTo(offsetPosition), "object1 offset position not equal");
225
226 // Temporary
227 Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod());
225 } 228 }
226 229
227 /// <summary> 230 /// <summary>
@@ -304,10 +307,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
304 Assert.That(object2PartMerged, Is.Not.Null, "object2 was not present after merge"); 307 Assert.That(object2PartMerged, Is.Not.Null, "object2 was not present after merge");
305 Assert.That(object2PartMerged.Name, Is.EqualTo(part2Name), "object2 names not identical after merge"); 308 Assert.That(object2PartMerged.Name, Is.EqualTo(part2Name), "object2 names not identical after merge");
306 Assert.That(object2PartMerged.GroupPosition, Is.EqualTo(part2GroupPosition), "object2 group position not equal after merge"); 309 Assert.That(object2PartMerged.GroupPosition, Is.EqualTo(part2GroupPosition), "object2 group position not equal after merge");
307 } 310 }
308
309 // Temporary
310 Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod());
311 } 311 }
312 } 312 }
313} 313}