From b803d5ab9b6aae1316314efcbbb80e3f1ab6322a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 09:44:04 -0700 Subject: Make sure to close the file streams on the FlotsamCache, even if something fails. --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs') diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 817e0d4..1dc40bc 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -323,13 +323,13 @@ namespace Flotsam.RegionModules.AssetCache string filename = GetFileName(id); if (File.Exists(filename)) { + FileStream stream = null; try { - FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); + stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryFormatter bformatter = new BinaryFormatter(); asset = (AssetBase)bformatter.Deserialize(stream); - stream.Close(); UpdateMemoryCache(id, asset); @@ -349,6 +349,11 @@ namespace Flotsam.RegionModules.AssetCache { LogException(e); } + finally + { + if (stream != null) + stream.Close(); + } } @@ -493,6 +498,7 @@ namespace Flotsam.RegionModules.AssetCache private void WriteFileCache(string filename, AssetBase asset) { + Stream stream = null; try { // Make sure the target cache directory exists @@ -505,10 +511,9 @@ namespace Flotsam.RegionModules.AssetCache // Write file first to a temp name, so that it doesn't look // like it's already cached while it's still writing. string tempname = Path.Combine(directory, Path.GetRandomFileName()); - Stream stream = File.Open(tempname, FileMode.Create); + stream = File.Open(tempname, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, asset); - stream.Close(); // Now that it's written, rename it so that it can be found. File.Move(tempname, filename); @@ -522,6 +527,9 @@ namespace Flotsam.RegionModules.AssetCache } finally { + if (stream != null) + stream.Close(); + // Even if the write fails with an exception, we need to make sure // that we release the lock on that file, otherwise it'll never get // cached -- cgit v1.1 From fe9cca64dea714583c09854a90f2c13fecb12d29 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Oct 2009 09:56:54 -0700 Subject: Stream needs to be closed before the file can be moved... --- OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs') diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 1dc40bc..c0bb70c 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -499,21 +499,22 @@ namespace Flotsam.RegionModules.AssetCache private void WriteFileCache(string filename, AssetBase asset) { Stream stream = null; + // Make sure the target cache directory exists + string directory = Path.GetDirectoryName(filename); + // Write file first to a temp name, so that it doesn't look + // like it's already cached while it's still writing. + string tempname = Path.Combine(directory, Path.GetRandomFileName()); try { - // Make sure the target cache directory exists - string directory = Path.GetDirectoryName(filename); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } - // Write file first to a temp name, so that it doesn't look - // like it's already cached while it's still writing. - string tempname = Path.Combine(directory, Path.GetRandomFileName()); stream = File.Open(tempname, FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, asset); + stream.Close(); // Now that it's written, rename it so that it can be found. File.Move(tempname, filename); -- cgit v1.1