diff options
Diffstat (limited to 'OpenSim')
4 files changed, 56 insertions, 28 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 12c9dcf..18728c6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | |||
@@ -60,6 +60,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
60 | protected UuidGatherer m_assetGatherer; | 60 | protected UuidGatherer m_assetGatherer; |
61 | 61 | ||
62 | /// <value> | 62 | /// <value> |
63 | /// ID of this request | ||
64 | /// </value> | ||
65 | protected Guid m_id; | ||
66 | |||
67 | /// <value> | ||
63 | /// Used to collect the uuids of the assets that we need to save into the archive | 68 | /// Used to collect the uuids of the assets that we need to save into the archive |
64 | /// </value> | 69 | /// </value> |
65 | protected Dictionary<UUID, int> m_assetUuids = new Dictionary<UUID, int>(); | 70 | protected Dictionary<UUID, int> m_assetUuids = new Dictionary<UUID, int>(); |
@@ -78,8 +83,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
78 | /// Constructor | 83 | /// Constructor |
79 | /// </summary> | 84 | /// </summary> |
80 | public InventoryArchiveWriteRequest( | 85 | public InventoryArchiveWriteRequest( |
81 | InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, string savePath) | 86 | Guid id, InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, string savePath) |
82 | : this( | 87 | : this( |
88 | id, | ||
83 | module, | 89 | module, |
84 | userInfo, | 90 | userInfo, |
85 | invPath, | 91 | invPath, |
@@ -91,8 +97,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
91 | /// Constructor | 97 | /// Constructor |
92 | /// </summary> | 98 | /// </summary> |
93 | public InventoryArchiveWriteRequest( | 99 | public InventoryArchiveWriteRequest( |
94 | InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, Stream saveStream) | 100 | Guid id, InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, Stream saveStream) |
95 | { | 101 | { |
102 | m_id = id; | ||
96 | m_module = module; | 103 | m_module = module; |
97 | m_userInfo = userInfo; | 104 | m_userInfo = userInfo; |
98 | m_invPath = invPath; | 105 | m_invPath = invPath; |
@@ -116,7 +123,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
116 | succeeded = false; | 123 | succeeded = false; |
117 | } | 124 | } |
118 | 125 | ||
119 | m_module.TriggerInventoryArchiveSaved(succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); | 126 | m_module.TriggerInventoryArchiveSaved( |
127 | m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); | ||
120 | } | 128 | } |
121 | 129 | ||
122 | protected void SaveInvItem(InventoryItemBase inventoryItem, string path) | 130 | protected void SaveInvItem(InventoryItemBase inventoryItem, string path) |
@@ -272,7 +280,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
272 | // We couldn't find the path indicated | 280 | // We couldn't find the path indicated |
273 | m_saveStream.Close(); | 281 | m_saveStream.Close(); |
274 | m_module.TriggerInventoryArchiveSaved( | 282 | m_module.TriggerInventoryArchiveSaved( |
275 | false, m_userInfo, m_invPath, m_saveStream, | 283 | m_id, false, m_userInfo, m_invPath, m_saveStream, |
276 | new Exception(string.Format("Could not find inventory entry at path {0}", m_invPath))); | 284 | new Exception(string.Format("Could not find inventory entry at path {0}", m_invPath))); |
277 | return; | 285 | return; |
278 | } | 286 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index c495e02..55d7997 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -57,7 +57,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
57 | /// <summary> | 57 | /// <summary> |
58 | /// The file to load and save inventory if no filename has been specified | 58 | /// The file to load and save inventory if no filename has been specified |
59 | /// </summary> | 59 | /// </summary> |
60 | protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory_iar.tar.gz"; | 60 | protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory_iar.tar.gz"; |
61 | |||
62 | /// <value> | ||
63 | /// Pending save completions initiated from the console | ||
64 | /// </value> | ||
65 | protected List<Guid> m_pendingConsoleSaves = new List<Guid>(); | ||
61 | 66 | ||
62 | /// <value> | 67 | /// <value> |
63 | /// All scenes that this module knows about | 68 | /// All scenes that this module knows about |
@@ -106,32 +111,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
106 | /// Trigger the inventory archive saved event. | 111 | /// Trigger the inventory archive saved event. |
107 | /// </summary> | 112 | /// </summary> |
108 | protected internal void TriggerInventoryArchiveSaved( | 113 | protected internal void TriggerInventoryArchiveSaved( |
109 | bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException) | 114 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, |
115 | Exception reportedException) | ||
110 | { | 116 | { |
111 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; | 117 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; |
112 | if (handlerInventoryArchiveSaved != null) | 118 | if (handlerInventoryArchiveSaved != null) |
113 | handlerInventoryArchiveSaved(succeeded, userInfo, invPath, saveStream, reportedException); | 119 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); |
114 | } | 120 | } |
115 | 121 | ||
116 | public void ArchiveInventory(string firstName, string lastName, string invPath, Stream saveStream) | 122 | public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream) |
117 | { | 123 | { |
118 | if (m_scenes.Count > 0) | 124 | if (m_scenes.Count > 0) |
119 | { | 125 | { |
120 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); | 126 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); |
121 | 127 | ||
122 | if (userInfo != null) | 128 | if (userInfo != null) |
123 | new InventoryArchiveWriteRequest(this, userInfo, invPath, saveStream).Execute(); | 129 | new InventoryArchiveWriteRequest(id, this, userInfo, invPath, saveStream).Execute(); |
124 | } | 130 | } |
125 | } | 131 | } |
126 | 132 | ||
127 | public void ArchiveInventory(string firstName, string lastName, string invPath, string savePath) | 133 | public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string savePath) |
128 | { | 134 | { |
129 | if (m_scenes.Count > 0) | 135 | if (m_scenes.Count > 0) |
130 | { | 136 | { |
131 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); | 137 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); |
132 | 138 | ||
133 | if (userInfo != null) | 139 | if (userInfo != null) |
134 | new InventoryArchiveWriteRequest(this, userInfo, invPath, savePath).Execute(); | 140 | new InventoryArchiveWriteRequest(id, this, userInfo, invPath, savePath).Execute(); |
135 | } | 141 | } |
136 | } | 142 | } |
137 | 143 | ||
@@ -215,13 +221,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
215 | m_log.InfoFormat( | 221 | m_log.InfoFormat( |
216 | "[INVENTORY ARCHIVER]: Saving archive {0} from inventory path {1} for {2} {3}", | 222 | "[INVENTORY ARCHIVER]: Saving archive {0} from inventory path {1} for {2} {3}", |
217 | savePath, invPath, firstName, lastName); | 223 | savePath, invPath, firstName, lastName); |
218 | 224 | ||
219 | ArchiveInventory(firstName, lastName, invPath, savePath); | 225 | Guid id = Guid.NewGuid(); |
220 | } | 226 | ArchiveInventory(id, firstName, lastName, invPath, savePath); |
227 | |||
228 | lock (m_pendingConsoleSaves) | ||
229 | m_pendingConsoleSaves.Add(id); | ||
230 | } | ||
221 | 231 | ||
222 | private void SaveInvConsoleCommandCompleted( | 232 | private void SaveInvConsoleCommandCompleted( |
223 | bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException) | 233 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, |
234 | Exception reportedException) | ||
224 | { | 235 | { |
236 | lock (m_pendingConsoleSaves) | ||
237 | { | ||
238 | if (m_pendingConsoleSaves.Contains(id)) | ||
239 | m_pendingConsoleSaves.Remove(id); | ||
240 | else | ||
241 | return; | ||
242 | } | ||
243 | |||
225 | if (succeeded) | 244 | if (succeeded) |
226 | { | 245 | { |
227 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0}", userInfo.UserProfile.Name); | 246 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0}", userInfo.UserProfile.Name); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index 066c5d3..a151c9d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs | |||
@@ -55,6 +55,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
55 | [TestFixture] | 55 | [TestFixture] |
56 | public class InventoryArchiverTests | 56 | public class InventoryArchiverTests |
57 | { | 57 | { |
58 | protected ManualResetEvent mre = new ManualResetEvent(false); | ||
59 | |||
58 | private void InventoryReceived(UUID userId) | 60 | private void InventoryReceived(UUID userId) |
59 | { | 61 | { |
60 | lock (this) | 62 | lock (this) |
@@ -64,12 +66,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
64 | } | 66 | } |
65 | 67 | ||
66 | private void SaveCompleted( | 68 | private void SaveCompleted( |
67 | bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException) | 69 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, |
70 | Exception reportedException) | ||
68 | { | 71 | { |
69 | lock (this) | 72 | mre.Set(); |
70 | { | ||
71 | Monitor.PulseAll(this); | ||
72 | } | ||
73 | } | 73 | } |
74 | 74 | ||
75 | /// <summary> | 75 | /// <summary> |
@@ -152,11 +152,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
152 | MemoryStream archiveWriteStream = new MemoryStream(); | 152 | MemoryStream archiveWriteStream = new MemoryStream(); |
153 | archiverModule.OnInventoryArchiveSaved += SaveCompleted; | 153 | archiverModule.OnInventoryArchiveSaved += SaveCompleted; |
154 | 154 | ||
155 | lock (this) | 155 | mre.Reset(); |
156 | { | 156 | archiverModule.ArchiveInventory( |
157 | archiverModule.ArchiveInventory(userFirstName, userLastName, "Objects", archiveWriteStream); | 157 | Guid.NewGuid(), userFirstName, userLastName, "Objects", archiveWriteStream); |
158 | Monitor.Wait(this, 60000); | 158 | mre.WaitOne(); |
159 | } | ||
160 | 159 | ||
161 | byte[] archive = archiveWriteStream.ToArray(); | 160 | byte[] archive = archiveWriteStream.ToArray(); |
162 | MemoryStream archiveReadStream = new MemoryStream(archive); | 161 | MemoryStream archiveReadStream = new MemoryStream(archive); |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index df6650f..457b5b8 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs | |||
@@ -34,13 +34,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
34 | /// <summary> | 34 | /// <summary> |
35 | /// Used for the OnInventoryArchiveSaved event. | 35 | /// Used for the OnInventoryArchiveSaved event. |
36 | /// </summary> | 36 | /// </summary> |
37 | /// <param name="id">Request id</param> | ||
37 | /// <param name="succeeded">true if the save succeeded, false otherwise</param> | 38 | /// <param name="succeeded">true if the save succeeded, false otherwise</param> |
38 | /// <param name="userInfo">The user for whom the save was conducted</param> | 39 | /// <param name="userInfo">The user for whom the save was conducted</param> |
39 | /// <param name="invPath">The inventory path saved</param> | 40 | /// <param name="invPath">The inventory path saved</param> |
40 | /// <param name="savePath">The stream to which the archive was saved</param> | 41 | /// <param name="savePath">The stream to which the archive was saved</param> |
41 | /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> | 42 | /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> |
42 | public delegate void InventoryArchiveSaved( | 43 | public delegate void InventoryArchiveSaved( |
43 | bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException); | 44 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException); |
44 | 45 | ||
45 | public interface IInventoryArchiverModule | 46 | public interface IInventoryArchiverModule |
46 | { | 47 | { |
@@ -61,10 +62,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
61 | /// <summary> | 62 | /// <summary> |
62 | /// Archive a user's inventory folder to the given stream | 63 | /// Archive a user's inventory folder to the given stream |
63 | /// </summary> | 64 | /// </summary> |
65 | /// <param name="id">ID representing this request. This will later be returned in the save event</param> | ||
64 | /// <param name="firstName"></param> | 66 | /// <param name="firstName"></param> |
65 | /// <param name="lastName"></param> | 67 | /// <param name="lastName"></param> |
66 | /// <param name="invPath">The inventory path from which the inventory should be saved.</param> | 68 | /// <param name="invPath">The inventory path from which the inventory should be saved.</param> |
67 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> | 69 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> |
68 | void ArchiveInventory(string firstName, string lastName, string invPath, Stream saveStream); | 70 | void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream); |
69 | } | 71 | } |
70 | } | 72 | } |