diff options
author | Oren Hurvitz | 2012-07-16 10:30:38 +0300 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-08-03 01:12:46 +0100 |
commit | 0588f27d1886970e44765166714f24114d399fce (patch) | |
tree | 8c3845815dce535cdca25616bc0a7502935f119d | |
parent | Save membership fee to the database when a group is created. (diff) | |
download | opensim-SC-0588f27d1886970e44765166714f24114d399fce.zip opensim-SC-0588f27d1886970e44765166714f24114d399fce.tar.gz opensim-SC-0588f27d1886970e44765166714f24114d399fce.tar.bz2 opensim-SC-0588f27d1886970e44765166714f24114d399fce.tar.xz |
Fixed a rare bug that caused Save OAR to fail because it thought it had timed-out
The bug manifested as follows: a large world was saved. All the assets were found. But for some unknown reason, the timeout timer was restarted. So after 1 minute it closed the Archive Writer, because it didn't receive any more assets during that minute. That caused the OAR to become corrupted because ArchiveWriteRequestExecution.Save() was still running.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index 55110dc..a073cb9 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | |||
@@ -154,6 +154,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
154 | 154 | ||
155 | protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) | 155 | protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) |
156 | { | 156 | { |
157 | bool close = true; | ||
158 | |||
157 | try | 159 | try |
158 | { | 160 | { |
159 | lock (this) | 161 | lock (this) |
@@ -161,7 +163,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
161 | // Take care of the possibilty that this thread started but was paused just outside the lock before | 163 | // Take care of the possibilty that this thread started but was paused just outside the lock before |
162 | // the final request came in (assuming that such a thing is possible) | 164 | // the final request came in (assuming that such a thing is possible) |
163 | if (m_requestState == RequestState.Completed) | 165 | if (m_requestState == RequestState.Completed) |
166 | { | ||
167 | close = false; | ||
164 | return; | 168 | return; |
169 | } | ||
165 | 170 | ||
166 | m_requestState = RequestState.Aborted; | 171 | m_requestState = RequestState.Aborted; |
167 | } | 172 | } |
@@ -208,7 +213,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
208 | } | 213 | } |
209 | finally | 214 | finally |
210 | { | 215 | { |
211 | m_assetsArchiver.ForceClose(); | 216 | if (close) |
217 | m_assetsArchiver.ForceClose(); | ||
212 | } | 218 | } |
213 | } | 219 | } |
214 | 220 | ||
@@ -242,11 +248,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
242 | 248 | ||
243 | m_requestCallbackTimer.Stop(); | 249 | m_requestCallbackTimer.Stop(); |
244 | 250 | ||
245 | if (m_requestState == RequestState.Aborted) | 251 | if ((m_requestState == RequestState.Aborted) || (m_requestState == RequestState.Completed)) |
246 | { | 252 | { |
247 | m_log.WarnFormat( | 253 | m_log.WarnFormat( |
248 | "[ARCHIVER]: Received information about asset {0} after archive save abortion. Ignoring.", | 254 | "[ARCHIVER]: Received information about asset {0} while in state {1}. Ignoring.", |
249 | id); | 255 | id, m_requestState); |
250 | 256 | ||
251 | return; | 257 | return; |
252 | } | 258 | } |
@@ -268,7 +274,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
268 | m_notFoundAssetUuids.Add(new UUID(id)); | 274 | m_notFoundAssetUuids.Add(new UUID(id)); |
269 | } | 275 | } |
270 | 276 | ||
271 | if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count == m_repliesRequired) | 277 | if (m_foundAssetUuids.Count + m_notFoundAssetUuids.Count >= m_repliesRequired) |
272 | { | 278 | { |
273 | m_requestState = RequestState.Completed; | 279 | m_requestState = RequestState.Completed; |
274 | 280 | ||