diff options
author | Justin Clarke Casey | 2009-06-01 16:00:46 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2009-06-01 16:00:46 +0000 |
commit | ecbeb5cea15e558b1df361dc90f1bf24bbc87152 (patch) | |
tree | 50dea4d3ea9b5ab3f71db0c03860de830c1674aa /OpenSim/Region/CoreModules/World | |
parent | Fixed AvatarCreationModule (I think) (diff) | |
download | opensim-SC_OLD-ecbeb5cea15e558b1df361dc90f1bf24bbc87152.zip opensim-SC_OLD-ecbeb5cea15e558b1df361dc90f1bf24bbc87152.tar.gz opensim-SC_OLD-ecbeb5cea15e558b1df361dc90f1bf24bbc87152.tar.bz2 opensim-SC_OLD-ecbeb5cea15e558b1df361dc90f1bf24bbc87152.tar.xz |
* Fix race condition in save oar
Diffstat (limited to 'OpenSim/Region/CoreModules/World')
3 files changed, 46 insertions, 28 deletions
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 7fe6d2e..74904e2 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -310,6 +310,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
310 | asset.Type = assetType; | 310 | asset.Type = assetType; |
311 | asset.Data = data; | 311 | asset.Data = data; |
312 | 312 | ||
313 | // We're relying on the asset service to do the sensible thing and not store the asset if it already | ||
314 | // exists. | ||
313 | m_scene.AssetService.Store(asset); | 315 | m_scene.AssetService.Store(asset); |
314 | 316 | ||
315 | /** | 317 | /** |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index 4819746..9fd9469 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs | |||
@@ -136,7 +136,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
136 | 136 | ||
137 | m_archiveWriter.Close(); | 137 | m_archiveWriter.Close(); |
138 | 138 | ||
139 | m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive for {0}", m_scene.RegionInfo.RegionName); | 139 | m_log.InfoFormat("[ARCHIVER]: Finished writing out OAR for {0}", m_scene.RegionInfo.RegionName); |
140 | 140 | ||
141 | m_scene.EventManager.TriggerOarFileSaved(m_requestId, String.Empty); | 141 | m_scene.EventManager.TriggerOarFileSaved(m_requestId, String.Empty); |
142 | } | 142 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index c673e18..129d6d3 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | |||
@@ -70,20 +70,20 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
70 | private int m_repliesRequired; | 70 | private int m_repliesRequired; |
71 | 71 | ||
72 | /// <value> | 72 | /// <value> |
73 | /// Asset cache used to request the assets | 73 | /// Asset service used to request the assets |
74 | /// </value> | 74 | /// </value> |
75 | protected IAssetService m_assetCache; | 75 | protected IAssetService m_assetService; |
76 | 76 | ||
77 | protected AssetsArchiver m_assetsArchiver; | 77 | protected AssetsArchiver m_assetsArchiver; |
78 | 78 | ||
79 | protected internal AssetsRequest( | 79 | protected internal AssetsRequest( |
80 | AssetsArchiver assetsArchiver, ICollection<UUID> uuids, | 80 | AssetsArchiver assetsArchiver, ICollection<UUID> uuids, |
81 | IAssetService assetCache, AssetsRequestCallback assetsRequestCallback) | 81 | IAssetService assetService, AssetsRequestCallback assetsRequestCallback) |
82 | { | 82 | { |
83 | m_assetsArchiver = assetsArchiver; | 83 | m_assetsArchiver = assetsArchiver; |
84 | m_uuids = uuids; | 84 | m_uuids = uuids; |
85 | m_assetsRequestCallback = assetsRequestCallback; | 85 | m_assetsRequestCallback = assetsRequestCallback; |
86 | m_assetCache = assetCache; | 86 | m_assetService = assetService; |
87 | m_repliesRequired = uuids.Count; | 87 | m_repliesRequired = uuids.Count; |
88 | } | 88 | } |
89 | 89 | ||
@@ -93,14 +93,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
93 | 93 | ||
94 | // We can stop here if there are no assets to fetch | 94 | // We can stop here if there are no assets to fetch |
95 | if (m_repliesRequired == 0) | 95 | if (m_repliesRequired == 0) |
96 | m_assetsRequestCallback(m_foundAssetUuids, m_notFoundAssetUuids); | 96 | PerformAssetsRequestCallback(); |
97 | 97 | ||
98 | foreach (UUID uuid in m_uuids) | 98 | foreach (UUID uuid in m_uuids) |
99 | { | 99 | { |
100 | m_assetCache.Get(uuid.ToString(), this, AssetRequestCallback); | 100 | m_assetService.Get(uuid.ToString(), this, AssetRequestCallback); |
101 | } | 101 | } |
102 | } | 102 | } |
103 | 103 | ||
104 | private bool done = false; | ||
104 | /// <summary> | 105 | /// <summary> |
105 | /// Called back by the asset cache when it has the asset | 106 | /// Called back by the asset cache when it has the asset |
106 | /// </summary> | 107 | /// </summary> |
@@ -108,29 +109,44 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
108 | /// <param name="asset"></param> | 109 | /// <param name="asset"></param> |
109 | public void AssetRequestCallback(string id, object sender, AssetBase asset) | 110 | public void AssetRequestCallback(string id, object sender, AssetBase asset) |
110 | { | 111 | { |
111 | //m_log.DebugFormat("[ARCHIVER]: Received callback for asset {0}", assetID); | 112 | try |
112 | |||
113 | if (asset != null) | ||
114 | { | ||
115 | m_foundAssetUuids.Add(asset.FullID); | ||
116 | m_assetsArchiver.WriteAsset(asset); | ||
117 | } | ||
118 | else | ||
119 | { | 113 | { |
120 | m_notFoundAssetUuids.Add(new UUID(id)); | 114 | lock (this) |
115 | { | ||
116 | //m_log.DebugFormat("[ARCHIVER]: Received callback for asset {0}", id); | ||
117 | |||
118 | if (asset != null) | ||
119 | { | ||
120 | m_foundAssetUuids.Add(asset.FullID); | ||
121 | m_assetsArchiver.WriteAsset(asset); | ||
122 | } | ||
123 | else | ||
124 | { | ||
125 | m_notFoundAssetUuids.Add(new UUID(id)); | ||
126 | } | ||
127 | |||
128 | if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count == m_repliesRequired) | ||
129 | { | ||
130 | if (done) | ||
131 | throw new Exception("AArgh"); | ||
132 | |||
133 | m_log.DebugFormat( | ||
134 | "[ARCHIVER]: Successfully added {0} assets ({1} assets missing)", | ||
135 | m_foundAssetUuids.Count, m_notFoundAssetUuids.Count); | ||
136 | |||
137 | done = true; | ||
138 | |||
139 | // We want to stop using the asset cache thread asap | ||
140 | // as we now need to do the work of producing the rest of the archive | ||
141 | Thread newThread = new Thread(PerformAssetsRequestCallback); | ||
142 | newThread.Name = "OpenSimulator archiving thread post assets receipt"; | ||
143 | newThread.Start(); | ||
144 | } | ||
145 | } | ||
121 | } | 146 | } |
122 | 147 | catch (Exception e) | |
123 | if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count == m_repliesRequired) | ||
124 | { | 148 | { |
125 | m_log.DebugFormat( | 149 | m_log.ErrorFormat("[ARCHIVER]: AssetRequestCallback failed with {0}", e); |
126 | "[ARCHIVER]: Successfully added {0} assets ({1} assets missing)", | ||
127 | m_foundAssetUuids.Count, m_notFoundAssetUuids.Count); | ||
128 | |||
129 | // We want to stop using the asset cache thread asap | ||
130 | // as we now need to do the work of producing the rest of the archive | ||
131 | Thread newThread = new Thread(PerformAssetsRequestCallback); | ||
132 | newThread.Name = "OpenSimulator archiving thread post assets receipt"; | ||
133 | newThread.Start(); | ||
134 | } | 150 | } |
135 | } | 151 | } |
136 | 152 | ||