diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs | 73 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs (renamed from OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs) | 46 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs | 15 |
4 files changed, 96 insertions, 40 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs new file mode 100644 index 0000000..4164cea --- /dev/null +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs | |||
@@ -0,0 +1,73 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | using libsecondlife; | ||
31 | using log4net; | ||
32 | using OpenSim.Framework; | ||
33 | |||
34 | namespace OpenSim.Region.Environment.Modules.World.Archiver | ||
35 | { | ||
36 | /// <summary> | ||
37 | /// Method called when all the necessary assets for an archive request have been received. | ||
38 | /// </summary> | ||
39 | public delegate void AssetsRequestCallback(IDictionary<LLUUID, AssetBase> assets); | ||
40 | |||
41 | /// <summary> | ||
42 | /// Execute the write of an archive once we have received all the necessary data | ||
43 | /// </summary> | ||
44 | public class ArchiveWriteRequestExecution | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | protected string m_savePath; | ||
49 | protected string m_serializedEntities; | ||
50 | |||
51 | public ArchiveWriteRequestExecution(string serializedEntities, string savePath) | ||
52 | { | ||
53 | m_serializedEntities = serializedEntities; | ||
54 | m_savePath = savePath; | ||
55 | } | ||
56 | |||
57 | protected internal void ReceivedAllAssets(IDictionary<LLUUID, AssetBase> assets) | ||
58 | { | ||
59 | m_log.DebugFormat("[ARCHIVER]: Received all {0} assets required", assets.Count); | ||
60 | |||
61 | TarArchiveWriter archive = new TarArchiveWriter(); | ||
62 | |||
63 | archive.AddFile(ArchiveConstants.PRIMS_PATH, m_serializedEntities); | ||
64 | |||
65 | AssetsArchiver assetsArchiver = new AssetsArchiver(assets); | ||
66 | assetsArchiver.Archive(archive); | ||
67 | |||
68 | archive.WriteTar(m_savePath); | ||
69 | |||
70 | m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath); | ||
71 | } | ||
72 | } | ||
73 | } | ||
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs index 1d7042c..a93e58d 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs | |||
@@ -40,31 +40,22 @@ using Nini.Config; | |||
40 | namespace OpenSim.Region.Environment.Modules.World.Archiver | 40 | namespace OpenSim.Region.Environment.Modules.World.Archiver |
41 | { | 41 | { |
42 | /// <summary> | 42 | /// <summary> |
43 | /// Method called when all the necessary assets for an archive request have been received. | 43 | /// Prepare to write out an archive. |
44 | /// </summary> | 44 | /// </summary> |
45 | public delegate void AssetsRequestCallback(IDictionary<LLUUID, AssetBase> assets); | 45 | public class ArchiveWriteRequestPreparation |
46 | |||
47 | /// <summary> | ||
48 | /// Handles an individual archive write request | ||
49 | /// </summary> | ||
50 | public class ArchiveWriteRequest | ||
51 | { | 46 | { |
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
53 | 48 | ||
54 | private Scene m_scene; | 49 | protected Scene m_scene; |
55 | private string m_savePath; | 50 | protected string m_savePath; |
56 | |||
57 | private string m_serializedEntities; | ||
58 | 51 | ||
59 | public ArchiveWriteRequest(Scene scene, string savePath) | 52 | public ArchiveWriteRequestPreparation(Scene scene, string savePath) |
60 | { | 53 | { |
61 | m_scene = scene; | 54 | m_scene = scene; |
62 | m_savePath = savePath; | 55 | m_savePath = savePath; |
63 | |||
64 | ArchiveRegion(); | ||
65 | } | 56 | } |
66 | 57 | ||
67 | protected void ArchiveRegion() | 58 | public void ArchiveRegion() |
68 | { | 59 | { |
69 | Dictionary<LLUUID, int> assetUuids = new Dictionary<LLUUID, int>(); | 60 | Dictionary<LLUUID, int> assetUuids = new Dictionary<LLUUID, int>(); |
70 | 61 | ||
@@ -108,36 +99,19 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
108 | } | 99 | } |
109 | } | 100 | } |
110 | 101 | ||
111 | m_serializedEntities = SerializeObjects(entities); | 102 | string serializedEntities = SerializeObjects(entities); |
112 | 103 | ||
113 | if (m_serializedEntities != null && m_serializedEntities.Length > 0) | 104 | if (serializedEntities != null && serializedEntities.Length > 0) |
114 | { | 105 | { |
115 | m_log.DebugFormat("[ARCHIVER]: Successfully got serialization for {0} entities", entities.Count); | 106 | m_log.DebugFormat("[ARCHIVER]: Successfully got serialization for {0} entities", entities.Count); |
116 | m_log.DebugFormat("[ARCHIVER]: Requiring save of {0} textures", assetUuids.Count); | 107 | m_log.DebugFormat("[ARCHIVER]: Requiring save of {0} textures", assetUuids.Count); |
117 | 108 | ||
118 | // Asynchronously request all the assets required to perform this archive operation | 109 | // Asynchronously request all the assets required to perform this archive operation |
119 | new AssetsRequest(ReceivedAllAssets, m_scene.AssetCache, assetUuids.Keys); | 110 | ArchiveWriteRequestExecution awre = new ArchiveWriteRequestExecution(serializedEntities, m_savePath); |
111 | new AssetsRequest(assetUuids.Keys, m_scene.AssetCache, awre.ReceivedAllAssets).Execute(); | ||
120 | } | 112 | } |
121 | } | 113 | } |
122 | 114 | ||
123 | protected internal void ReceivedAllAssets(IDictionary<LLUUID, AssetBase> assets) | ||
124 | { | ||
125 | m_log.DebugFormat("[ARCHIVER]: Received all {0} textures required", assets.Count); | ||
126 | |||
127 | // XXX: Shouldn't hijack the asset async callback thread like this - this is only temporary | ||
128 | |||
129 | TarArchiveWriter archive = new TarArchiveWriter(); | ||
130 | |||
131 | archive.AddFile(ArchiveConstants.PRIMS_PATH, m_serializedEntities); | ||
132 | |||
133 | AssetsArchiver assetsArchiver = new AssetsArchiver(assets); | ||
134 | assetsArchiver.Archive(archive); | ||
135 | |||
136 | archive.WriteTar(m_savePath); | ||
137 | |||
138 | m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath); | ||
139 | } | ||
140 | |||
141 | /// <summary> | 115 | /// <summary> |
142 | /// Get an xml representation of the given scene objects. | 116 | /// Get an xml representation of the given scene objects. |
143 | /// </summary> | 117 | /// </summary> |
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs index 0e3123e..ae3d333 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs | |||
@@ -72,7 +72,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
72 | 72 | ||
73 | public void ArchiveRegion(string savePath) | 73 | public void ArchiveRegion(string savePath) |
74 | { | 74 | { |
75 | new ArchiveWriteRequest(m_scene, savePath); | 75 | new ArchiveWriteRequestPreparation(m_scene, savePath).ArchiveRegion(); |
76 | } | 76 | } |
77 | 77 | ||
78 | public void DearchiveRegion(string loadPath) | 78 | public void DearchiveRegion(string loadPath) |
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs index 2021b70..f41be49 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs | |||
@@ -41,6 +41,11 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
41 | class AssetsRequest | 41 | class AssetsRequest |
42 | { | 42 | { |
43 | /// <summary> | 43 | /// <summary> |
44 | /// uuids to request | ||
45 | /// </summary> | ||
46 | protected ICollection<LLUUID> m_uuids; | ||
47 | |||
48 | /// <summary> | ||
44 | /// Callback used when all the assets requested have been received. | 49 | /// Callback used when all the assets requested have been received. |
45 | /// </summary> | 50 | /// </summary> |
46 | protected AssetsRequestCallback m_assetsRequestCallback; | 51 | protected AssetsRequestCallback m_assetsRequestCallback; |
@@ -60,17 +65,21 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
60 | /// </summary> | 65 | /// </summary> |
61 | protected AssetCache m_assetCache; | 66 | protected AssetCache m_assetCache; |
62 | 67 | ||
63 | protected internal AssetsRequest(AssetsRequestCallback assetsRequestCallback, AssetCache assetCache, ICollection<LLUUID> uuids) | 68 | protected internal AssetsRequest(ICollection<LLUUID> uuids, AssetCache assetCache, AssetsRequestCallback assetsRequestCallback) |
64 | { | 69 | { |
70 | m_uuids = uuids; | ||
65 | m_assetsRequestCallback = assetsRequestCallback; | 71 | m_assetsRequestCallback = assetsRequestCallback; |
66 | m_assetCache = assetCache; | 72 | m_assetCache = assetCache; |
67 | m_repliesRequired = uuids.Count; | 73 | m_repliesRequired = uuids.Count; |
68 | 74 | } | |
75 | |||
76 | protected internal void Execute() | ||
77 | { | ||
69 | // We can stop here if there are no assets to fetch | 78 | // We can stop here if there are no assets to fetch |
70 | if (m_repliesRequired == 0) | 79 | if (m_repliesRequired == 0) |
71 | m_assetsRequestCallback(m_assets); | 80 | m_assetsRequestCallback(m_assets); |
72 | 81 | ||
73 | foreach (LLUUID uuid in uuids) | 82 | foreach (LLUUID uuid in m_uuids) |
74 | { | 83 | { |
75 | m_assetCache.GetAsset(uuid, AssetRequestCallback, true); | 84 | m_assetCache.GetAsset(uuid, AssetRequestCallback, true); |
76 | } | 85 | } |