Add ids to iar requests

Stop save iar test wrongly relying on thread pulsing (still disabled though)
remotes/origin/0.6.7-post-fixes
Justin Clark-Casey (justincc) 2009-09-04 21:10:56 +01:00
parent 4c560df8ac
commit 7ca61e0174
4 changed files with 56 additions and 28 deletions

View File

@ -59,6 +59,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
protected TarArchiveWriter m_archiveWriter;
protected UuidGatherer m_assetGatherer;
/// <value>
/// ID of this request
/// </value>
protected Guid m_id;
/// <value>
/// Used to collect the uuids of the assets that we need to save into the archive
/// </value>
@ -78,8 +83,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// Constructor
/// </summary>
public InventoryArchiveWriteRequest(
InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, string savePath)
Guid id, InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, string savePath)
: this(
id,
module,
userInfo,
invPath,
@ -91,8 +97,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// Constructor
/// </summary>
public InventoryArchiveWriteRequest(
InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, Stream saveStream)
Guid id, InventoryArchiverModule module, CachedUserInfo userInfo, string invPath, Stream saveStream)
{
m_id = id;
m_module = module;
m_userInfo = userInfo;
m_invPath = invPath;
@ -116,7 +123,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
succeeded = false;
}
m_module.TriggerInventoryArchiveSaved(succeeded, m_userInfo, m_invPath, m_saveStream, reportedException);
m_module.TriggerInventoryArchiveSaved(
m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException);
}
protected void SaveInvItem(InventoryItemBase inventoryItem, string path)
@ -272,7 +280,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
// We couldn't find the path indicated
m_saveStream.Close();
m_module.TriggerInventoryArchiveSaved(
false, m_userInfo, m_invPath, m_saveStream,
m_id, false, m_userInfo, m_invPath, m_saveStream,
new Exception(string.Format("Could not find inventory entry at path {0}", m_invPath)));
return;
}

View File

@ -59,6 +59,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// </summary>
protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory_iar.tar.gz";
/// <value>
/// Pending save completions initiated from the console
/// </value>
protected List<Guid> m_pendingConsoleSaves = new List<Guid>();
/// <value>
/// All scenes that this module knows about
/// </value>
@ -106,32 +111,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// Trigger the inventory archive saved event.
/// </summary>
protected internal void TriggerInventoryArchiveSaved(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream,
Exception reportedException)
{
InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved;
if (handlerInventoryArchiveSaved != null)
handlerInventoryArchiveSaved(succeeded, userInfo, invPath, saveStream, reportedException);
handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException);
}
public void ArchiveInventory(string firstName, string lastName, string invPath, Stream saveStream)
public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream)
{
if (m_scenes.Count > 0)
{
CachedUserInfo userInfo = GetUserInfo(firstName, lastName);
if (userInfo != null)
new InventoryArchiveWriteRequest(this, userInfo, invPath, saveStream).Execute();
new InventoryArchiveWriteRequest(id, this, userInfo, invPath, saveStream).Execute();
}
}
public void ArchiveInventory(string firstName, string lastName, string invPath, string savePath)
public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string savePath)
{
if (m_scenes.Count > 0)
{
CachedUserInfo userInfo = GetUserInfo(firstName, lastName);
if (userInfo != null)
new InventoryArchiveWriteRequest(this, userInfo, invPath, savePath).Execute();
new InventoryArchiveWriteRequest(id, this, userInfo, invPath, savePath).Execute();
}
}
@ -216,12 +222,25 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
"[INVENTORY ARCHIVER]: Saving archive {0} from inventory path {1} for {2} {3}",
savePath, invPath, firstName, lastName);
ArchiveInventory(firstName, lastName, invPath, savePath);
Guid id = Guid.NewGuid();
ArchiveInventory(id, firstName, lastName, invPath, savePath);
lock (m_pendingConsoleSaves)
m_pendingConsoleSaves.Add(id);
}
private void SaveInvConsoleCommandCompleted(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream,
Exception reportedException)
{
lock (m_pendingConsoleSaves)
{
if (m_pendingConsoleSaves.Contains(id))
m_pendingConsoleSaves.Remove(id);
else
return;
}
if (succeeded)
{
m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0}", userInfo.UserProfile.Name);

View File

@ -55,6 +55,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
[TestFixture]
public class InventoryArchiverTests
{
protected ManualResetEvent mre = new ManualResetEvent(false);
private void InventoryReceived(UUID userId)
{
lock (this)
@ -64,12 +66,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
}
private void SaveCompleted(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream,
Exception reportedException)
{
lock (this)
{
Monitor.PulseAll(this);
}
mre.Set();
}
/// <summary>
@ -152,11 +152,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
MemoryStream archiveWriteStream = new MemoryStream();
archiverModule.OnInventoryArchiveSaved += SaveCompleted;
lock (this)
{
archiverModule.ArchiveInventory(userFirstName, userLastName, "Objects", archiveWriteStream);
Monitor.Wait(this, 60000);
}
mre.Reset();
archiverModule.ArchiveInventory(
Guid.NewGuid(), userFirstName, userLastName, "Objects", archiveWriteStream);
mre.WaitOne();
byte[] archive = archiveWriteStream.ToArray();
MemoryStream archiveReadStream = new MemoryStream(archive);

View File

@ -34,13 +34,14 @@ namespace OpenSim.Region.Framework.Interfaces
/// <summary>
/// Used for the OnInventoryArchiveSaved event.
/// </summary>
/// <param name="id">Request id</param>
/// <param name="succeeded">true if the save succeeded, false otherwise</param>
/// <param name="userInfo">The user for whom the save was conducted</param>
/// <param name="invPath">The inventory path saved</param>
/// <param name="savePath">The stream to which the archive was saved</param>
/// <param name="reportedException">Contains the exception generated if the save did not succeed</param>
public delegate void InventoryArchiveSaved(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException);
Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException);
public interface IInventoryArchiverModule
{
@ -61,10 +62,11 @@ namespace OpenSim.Region.Framework.Interfaces
/// <summary>
/// Archive a user's inventory folder to the given stream
/// </summary>
/// <param name="id">ID representing this request. This will later be returned in the save event</param>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="invPath">The inventory path from which the inventory should be saved.</param>
/// <param name="saveStream">The stream to which the inventory archive will be saved</param>
void ArchiveInventory(string firstName, string lastName, string invPath, Stream saveStream);
void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream);
}
}