Umbraco-CMS: Exception in BPlusTree

See #4992, one that issue was fixed, the following happened:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. 
Parameter name: length
 at CSharpTest.Net.IO.TransactedCompoundFile.Write(UInt32 handle, Byte[] bytes, Int32 offset, Int32 length)
 at CSharpTest.Net.Storage.BTreeFileStoreV2.Update[T](IStorageHandle handleIn, ISerializer`1 serializer, T node)
 at CSharpTest.Net.Collections.BPlusTree`2.StorageCache.OnItemRemoved(KeyValuePair`2 item)
 at CSharpTest.Net.Collections.LurchTable`2.TryDequeue(Predicate`1 predicate, KeyValuePair`2& value)
 at CSharpTest.Net.Collections.BPlusTree`2.StorageCache.Flush()
 at CSharpTest.Net.Collections.BPlusTree`2.StorageCache.Commit()
 at CSharpTest.Net.Collections.BPlusTree`2.CommitChanges(Boolean requiresLock)
 at Umbraco.Web.PublishedCache.NuCache.ContentStore.Release(WriteLockInfo lockInfo, Boolean commit)
 at Umbraco.Web.PublishedCache.NuCache.ContentStore.Set(ContentNodeKit kit)
 at Umbraco.Web.PublishedCache.NuCache.PublishedSnapshotService.NotifyLocked(IEnumerable`1 payloads, Boolean& draftChanged, Boolean& publishedChanged)
 at Umbraco.Web.PublishedCache.NuCache.PublishedSnapshotService.Notify(JsonPayload[] payloads, Boolean& draftChanged, Boolean& publishedChanged)
 at Umbraco.Web.Cache.ContentCacheRefresher.Refresh(JsonPayload[] payloads)
 at Umbraco.Core.Sync.ServerMessengerBase.DeliverLocal[TPayload](ICacheRefresher refresher, TPayload[] payload)
 at Umbraco.Core.Sync.ServerMessengerBase.Deliver[TPayload](ICacheRefresher refresher, TPayload[] payload)
 at Umbraco.Core.Sync.ServerMessengerBase.PerformRefresh[TPayload](ICacheRefresher refresher, TPayload[] payload)
 at Umbraco.Web.Cache.DistributedCache.RefreshByPayload[TPayload](Guid refresherGuid, IEnumerable`1 payloads)
 at Umbraco.Web.Cache.DistributedCacheExtensions.RefreshContentCache(DistributedCache dc, TreeChange`1[] changes)
 at Umbraco.Web.Cache.DistributedCacheBinder.ContentService_TreeChanged(IContentService sender, EventArgs args)
 at Umbraco.Core.Events.EventDefinition`2.RaiseEvent()
 at Umbraco.Core.Events.QueuingEventDispatcher.ScopeExitCompleted()
 at Umbraco.Core.Events.QueuingEventDispatcherBase.ScopeExit(Boolean completed)
 at Umbraco.Core.Scoping.Scope.<>c__DisplayClass72_0.<RobustExit>b__1()
 at Umbraco.Core.Scoping.Scope.TryFinally(Int32 index, Action[] actions)
 at Umbraco.Core.Scoping.Scope.TryFinally(Int32 index, Action[] actions)
 at Umbraco.Core.Scoping.Scope.RobustExit(Boolean completed, Boolean onException)
 at Umbraco.Core.Scoping.Scope.DisposeLastScope()
 at Umbraco.Core.Scoping.Scope.Dispose()
 at Umbraco.Core.Services.Implement.ContentService.SaveAndPublish(IContent content, String culture, Int32 userId, Boolean raiseEvents)
 at cmdportal.com.Controllers.ContentController.ImportArticle(Object objarticle) 
 in C:\CMDSVN\Websites\Controllers\ContentController.cs:line 1459

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 25 (13 by maintainers)

Most upvoted comments

Many thanks for testing! Next steps:

  • this solution is going to be merged into the next release, with a comment to indicate that the cache must be rebuilt whenever the block size is changed
  • I’ll create a longer-term issue to deal with it in a friendlier way - as you wrote, this should be automatic

Turns out the file storage we are using has a block size that can be configured. I have created PR #5111 which adds a new app setting:

<add key="Umbraco.Web.PublishedCache.NuCache.BTree.BlockSize" value="4096" />

The default value is 4096 but you can use greater values - you have to use powers of two, lower than or equal to 65536 - so 8192, 16384, 32768 or 65536.

Don’t know if you are comfortable building from a PR and testing? Want to try with differerent values and see if a value is ok for you? Bearing in mind that I’d go with the smallest value that fits.

OK, I am just amazed by your detective work 😉 I have been hijacked on other topics and am somewhat ashamed I cannot answer to you faster. Anyways: going to try to repro later tonight with a content body of size > 541K chars - if I can repro, well then, will try to figure out what’s going on.