public void Batch(Action <IStorageActionsAccessor> action) { if (current.Value != null) { action(current.Value); return; } disposerLock.EnterReadLock(); try { if (disposed) { Trace.WriteLine("TransactionalStorage.Batch was called after it was disposed, call was ignored."); return; // this may happen if someone is calling us from the finalizer thread, so we can't even throw on that } Interlocked.Exchange(ref lastUsageTime, DateTime.Now.ToBinary()); using (tableStroage.BeginTransaction()) { var storageActionsAccessor = new StorageActionsAccessor(tableStroage, uuidGenerator, DocumentCodecs); current.Value = storageActionsAccessor; action(current.Value); tableStroage.Commit(); storageActionsAccessor.InvokeOnCommit(); onCommit(); } } finally { disposerLock.ExitReadLock(); current.Value = null; } }
private void ExecuteBatch(Action <IStorageActionsAccessor> action) { Interlocked.Exchange(ref lastUsageTime, SystemTime.UtcNow.ToBinary()); using (tableStroage.BeginTransaction()) { var storageActionsAccessor = new StorageActionsAccessor(tableStroage, uuidGenerator, DocumentCodecs, documentCacher); current.Value = storageActionsAccessor; action(current.Value); storageActionsAccessor.SaveAllTasks(); tableStroage.Commit(); storageActionsAccessor.InvokeOnCommit(); } }
public void CanOpenAfterCompaction() { var memoryPersistentSource = new MemoryPersistentSource(); var tableStorage = new TableStorage(memoryPersistentSource); tableStorage.Initialize(); tableStorage.BeginTransaction(); tableStorage.Documents.Put(new RavenJObject { { "key", "1" }, { "etag", Guid.NewGuid().ToByteArray() }, { "modified", SystemTime.UtcNow }, { "id", 1 }, { "entityName", "test" } }, new byte[512]); tableStorage.Documents.Put(new RavenJObject { { "key", "2" }, { "etag", Guid.NewGuid().ToByteArray() }, { "modified", SystemTime.UtcNow }, { "id", 1 }, { "entityName", "test" } }, new byte[512]); tableStorage.Commit(); tableStorage.BeginTransaction(); tableStorage.Documents.Remove(new RavenJObject { { "key", "1" } }); tableStorage.Commit(); tableStorage.Compact(); var remoteManagedStorageState = memoryPersistentSource.CreateRemoteAppDomainState(); new TableStorage(new MemoryPersistentSource(remoteManagedStorageState.Log)).Initialize(); }
private StorageActionsAccessor ExecuteBatch(Action <IStorageActionsAccessor> action) { Interlocked.Exchange(ref lastUsageTime, SystemTime.UtcNow.ToBinary()); using (tableStorage.BeginTransaction()) { var storageActionsAccessor = new StorageActionsAccessor(tableStorage, uuidGenerator, DocumentCodecs, documentCacher); if (disableBatchNesting.Value == null) { current.Value = storageActionsAccessor; } action(storageActionsAccessor); storageActionsAccessor.SaveAllTasks(); tableStorage.Commit(); return(storageActionsAccessor); } }
public void Batch(Action <IStorageActionsAccessor> action) { if (disposerLock.IsReadLockHeld) // we are currently in a nested Batch call { if (current.Value != null) // check again, just to be sure { action(current.Value); return; } } disposerLock.EnterReadLock(); try { if (disposed) { Trace.WriteLine("TransactionalStorage.Batch was called after it was disposed, call was ignored."); return; // this may happen if someone is calling us from the finalizer thread, so we can't even throw on that } Interlocked.Exchange(ref lastUsageTime, SystemTime.Now.ToBinary()); using (tableStroage.BeginTransaction()) { var storageActionsAccessor = new StorageActionsAccessor(tableStroage, uuidGenerator, DocumentCodecs, documentCacher); current.Value = storageActionsAccessor; action(current.Value); storageActionsAccessor.SaveAllTasks(); tableStroage.Commit(); storageActionsAccessor.InvokeOnCommit(); } } finally { disposerLock.ExitReadLock(); if (disposed == false) { current.Value = null; } } onCommit(); // call user code after we exit the lock }