I am getting a sharing violation exception on the journal file in the database directory when I try to write to a collection when there are more than one collection. I have two collections that are singletons derived from a Database class which has a static instance Session
.
//Database.cs
public abstract class Database<ITEMTYPE>
{
static volatile Session session;
static object _SessionLock = new Object ();
protected Session _session{
get{
if (session == null) {
lock (_SessionLock) {
if (session == null) {
string path = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
#if __IOS__
// we need to put in /Library/ on iOS5.1 to meet Apple's iCloud terms
path = Path.Combine (path, "..", "Library"); // Library folder instead
#endif
//Create database path if it doesnt exist
path = Path.Combine (path, "Data");
System.IO.Directory.CreateDirectory (path);
session = new Session (new MarcelloDB.netfx.Platform (),path);
}
}
}
lock (_SessionLock) {
return session;
}
}
}
protected Collection<T, TID> InitalizeCollection <T, TID> (Func<T, TID> idFunct)
{
lock(_SessionLock) {
return _session [$"{_collectionName}.data"].Collection<T, TID> (_collectionName, idFunct);
}
}
}
//ConversationsCollection.cs
public class ConversationsCollection : Database<Conversation>
{
Collection<Conversation, string> _Collection {
get {
lock (_collectionLock) {
return InitalizeCollection<Conversation, string> (p => p.Id);
}
}
}
#region Singleton Constructor/Initilizer
ConversationsCollection ()
{
}
static volatile ConversationsCollection instance;
static object _ThisLock = new Object ();
public static ConversationsCollection Instance {
get {
if (instance == null) {
lock (_ThisLock) {
if (instance == null)
instance = new ConversationsCollection ();
}
}
lock (_ThisLock) {
return instance;
}
}
}
public override void Upsert (Conversation item)
{
lock (_collectionLock){
_Collection.Persist (item);
CollectionChanged (this, new DataCollectionChangedEventArgs<Conversation> (DataCollectionChangedEventArgsActions.Upsert, item));
}
}
}
System.IO.IOException: Sharing violation on path /Users/toddhenderson/Library/Developer/CoreSimulator/Devices/F73FB783-9ABC-40CC-AB18-78C90213D6C6/data/Containers/Data/Application/515A85C1-6A8D-4022-B3A6-F44471A60029/Library/Data/journal
at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x0026d] in /Library/Frameworks/Xamarin.iOS.framework/Versions/9.8.0.323/src/mono/mcs/class/corlib/System.IO/FileStream.cs:257
at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean isAsync, Boolean anonymous) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/9.8.0.323/src/mono/mcs/class/corlib/System.IO/FileStream.cs:157
at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/9.8.0.323/src/mono/mcs/class/corlib/System.IO/FileStream.cs:92
at MarcelloDB.netfx.Storage.FileStorageStream..ctor (System.String filePath) [0x00008] in <filename unknown>:0
at MarcelloDB.netfx.Storage.FileStorageStreamProvider.GetStream (System.String streamName) [0x00025] in <filename unknown>:0
at MarcelloDB.Storage.StreamActors.StreamActor.GetStream () [0x00012] in <filename unknown>:0
at MarcelloDB.Storage.StreamActors.Reader.Read (Int64 address, Int32 length) [0x00001] in <filename unknown>:0
at MarcelloDB.Transactions.Journal.LoadJournal () [0x00007] in <filename unknown>:0
at MarcelloDB.Transactions.Journal.Apply () [0x00001] in <filename unknown>:0
at MarcelloDB.Session.EnsureTransaction () [0x00018] in <filename unknown>:0
at MarcelloDB.Session.Transaction (System.Action action) [0x0001b] in <filename unknown>:0
at MarcelloDB.Collections.Collection`2[T,TID].Transacted (System.Action action) [0x0001b] in <filename unknown>:0
at MarcelloDB.Collections.Collection`2[T,TID].Persist (MarcelloDB.Collections.T obj) [0x00015] in <filename unknown>:0
at VideoChat.Data.ConversationsCollection.Upsert (VideoChat.Models.Conversation item) [0x0003d] in /Users/toddhenderson/Projects/Xamarin/VideoChat/VideoChat/Data/ConversationsCollection.cs:68
at VideoChat.Pages.MessagesPage.SyncConversations () [0x00035] in /Users/toddhenderson/Projects/Xamarin/VideoChat/VideoChat/Pages/MessagesPage.xaml.cs:46
at VideoChat.Pages.MessagesPage.OnAppearing () [0x00002] in /Users/toddhenderson/Projects/Xamarin/VideoChat/VideoChat/Pages/MessagesPage.xaml.cs:24
at Xamarin.Forms.Page.SendAppearing () [0x00024] in <filename unknown>:0
at Xamarin.Forms.Page.SendAppearing () [0x00054] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.NavigationRenderer.ViewDidAppear (Boolean animated) [0x0001e] in <filename unknown>:0
at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at UIKit.UIApplication.Main (System.String[] args, IntPtr principal, IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3339/39ebb778/source/maccore/src/UIKit/UIApplication.cs:79
at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3339/39ebb778/source/maccore/src/UIKit/UIApplication.cs:63
at VideoChat.iOS.Application.Main (System.String[] args) [0x00014] in /Users/toddhenderson/Projects/Xamarin/VideoChat/iOS/Main.cs:23