Merge remote-tracking branch 'origin/dev-v7' into temp8
# Conflicts: # src/SolutionInfo.cs # src/Umbraco.Core/Configuration/GlobalSettings.cs # src/Umbraco.Core/Configuration/UmbracoConfig.cs # src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs # src/Umbraco.Core/Configuration/UmbracoSettings/IContentSection.cs # src/Umbraco.Core/Models/IContentTypeBase.cs # src/Umbraco.Core/Persistence/DatabaseSchemaHelper.cs # src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs # src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs # src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs # src/Umbraco.Core/Services/ContentService.cs # src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs # src/Umbraco.Tests/packages.config # src/Umbraco.Web.UI.Client/bower.json # src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js # src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js # src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js # src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js # src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js # src/Umbraco.Web.UI.Client/src/less/belle.less # src/Umbraco.Web.UI.Client/src/less/buttons.less # src/Umbraco.Web.UI.Client/src/less/components/umb-tabs.less # src/Umbraco.Web.UI.Client/src/less/forms.less # src/Umbraco.Web.UI.Client/src/less/hacks.less # src/Umbraco.Web.UI.Client/src/less/modals.less # src/Umbraco.Web.UI.Client/src/less/panel.less # src/Umbraco.Web.UI.Client/src/views/common/dialogs/approvedcolorpicker.controller.js # src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js # src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js # src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.html # src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html # src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardvideos.html # src/Umbraco.Web.UI.Client/src/views/documenttypes/edit.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.html # src/Umbraco.Web.UI.Client/src/views/users/user.html # src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html # src/Umbraco.Web.UI/Umbraco/Views/Preview/Index.cshtml # src/Umbraco.Web.UI/Umbraco/config/lang/da.xml # src/Umbraco.Web.UI/Umbraco/dialogs/protectPage.aspx # src/Umbraco.Web.UI/Umbraco/dialogs/rollBack.aspx # src/Umbraco.Web.UI/config/EmbeddedMedia.Release.config # src/Umbraco.Web.UI/config/EmbeddedMedia.config # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web.UI/umbraco/dialogs/sort.aspx # src/Umbraco.Web.UI/umbraco_client/Dialogs/PublishDialog.js # src/Umbraco.Web.UI/web.Template.config # src/Umbraco.Web/Editors/ContentController.cs # src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/DatabaseSchemaValidationHealthCheck.cs # src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs # src/Umbraco.Web/Models/Trees/TreeNodeExtensions.cs # src/Umbraco.Web/PropertyEditors/ColorListPreValueEditor.cs # src/Umbraco.Web/PropertyEditors/EmailAddressPropertyEditor.cs # src/Umbraco.Web/PropertyEditors/ImageCropperPropertyValueEditor.cs # src/Umbraco.Web/PropertyEditors/TrueFalsePropertyEditor.cs # src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlPublishedContent.cs # src/Umbraco.Web/Routing/ContentFinderByUrlAlias.cs # src/Umbraco.Web/Templates/TemplateUtilities.cs # src/Umbraco.Web/UmbracoHelper.cs # src/Umbraco.Web/WebServices/SaveFileController.cs # src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs # src/Umbraco.Web/umbraco.presentation/umbraco/controls/dualSelectBox.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dashboard/FeedProxy.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/rollBack.aspx # src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/rollBack.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/settings/stylesheet/editstylesheet.aspx.cs
This commit is contained in:
@@ -34,6 +34,8 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
private readonly ICacheProvider _cacheProvider; // at snapshot/request level (see PublishedContentCache)
|
||||
private readonly PublishedContentTypeCache _contentTypeCache;
|
||||
|
||||
private readonly object _initializeLock = new object();
|
||||
|
||||
private bool _nodeInitialized;
|
||||
private bool _parentInitialized;
|
||||
private bool _childrenInitialized;
|
||||
@@ -66,15 +68,14 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
if (_childrenInitialized == false) InitializeChildren();
|
||||
EnsureNodeInitialized(andChildren: true);
|
||||
return _children;
|
||||
}
|
||||
}
|
||||
|
||||
public override IPublishedProperty GetProperty(string alias)
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
IPublishedProperty property;
|
||||
return _properties.TryGetValue(alias, out property) ? property : null;
|
||||
}
|
||||
@@ -85,8 +86,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
if (_parentInitialized == false) InitializeParent();
|
||||
EnsureNodeInitialized(andParent: true);
|
||||
return _parent;
|
||||
}
|
||||
}
|
||||
@@ -95,7 +95,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _id;
|
||||
}
|
||||
}
|
||||
@@ -104,7 +104,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _key;
|
||||
}
|
||||
}
|
||||
@@ -113,7 +113,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _template;
|
||||
}
|
||||
}
|
||||
@@ -122,7 +122,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _sortOrder;
|
||||
}
|
||||
}
|
||||
@@ -131,7 +131,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _name;
|
||||
}
|
||||
}
|
||||
@@ -144,7 +144,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _writerName;
|
||||
}
|
||||
}
|
||||
@@ -153,7 +153,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _creatorName;
|
||||
}
|
||||
}
|
||||
@@ -162,7 +162,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _writerId;
|
||||
}
|
||||
}
|
||||
@@ -171,7 +171,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _creatorId;
|
||||
}
|
||||
}
|
||||
@@ -180,7 +180,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _path;
|
||||
}
|
||||
}
|
||||
@@ -189,7 +189,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _createDate;
|
||||
}
|
||||
}
|
||||
@@ -198,7 +198,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _updateDate;
|
||||
}
|
||||
}
|
||||
@@ -207,7 +207,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _urlName;
|
||||
}
|
||||
}
|
||||
@@ -216,7 +216,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _level;
|
||||
}
|
||||
}
|
||||
@@ -225,7 +225,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _isDraft;
|
||||
}
|
||||
}
|
||||
@@ -234,7 +234,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _properties.Values;
|
||||
}
|
||||
}
|
||||
@@ -243,7 +243,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
EnsureNodeInitialized();
|
||||
return _contentType;
|
||||
}
|
||||
}
|
||||
@@ -256,10 +256,27 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
if (parent.Attributes?.GetNamedItem("isDoc") != null)
|
||||
_parent = Get(parent, _isPreviewing, _cacheProvider, _contentTypeCache);
|
||||
|
||||
// warn: this is not thread-safe...
|
||||
_parentInitialized = true;
|
||||
}
|
||||
|
||||
private void EnsureNodeInitialized(bool andChildren = false, bool andParent = false)
|
||||
{
|
||||
// In *theory* XmlPublishedContent are a per-request thing, and so should not
|
||||
// end up being involved into multi-threaded situations - however, it's been
|
||||
// reported that some users ended up seeing 100% CPU due to infinite loops in
|
||||
// the properties dictionary in InitializeNode, which would indicate that the
|
||||
// dictionary *is* indeed involved in some multi-threaded operation. No idea
|
||||
// what users are doing that cause this, but let's be friendly and use a true
|
||||
// lock around initialization.
|
||||
|
||||
lock (_initializeLock)
|
||||
{
|
||||
if (_nodeInitialized == false) InitializeNode();
|
||||
if (andChildren && _childrenInitialized == false) InitializeChildren();
|
||||
if (andParent && _parentInitialized == false) InitializeParent();
|
||||
}
|
||||
}
|
||||
|
||||
private void InitializeNode()
|
||||
{
|
||||
InitializeNode(this, _xmlNode, _isPreviewing,
|
||||
@@ -268,10 +285,10 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
out _createDate, out _updateDate, out _level, out _isDraft, out _contentType, out _properties,
|
||||
_contentTypeCache.Get);
|
||||
|
||||
// warn: this is not thread-safe...
|
||||
_nodeInitialized = true;
|
||||
}
|
||||
|
||||
// internal for some benchmarks
|
||||
internal static void InitializeNode(XmlPublishedContent node, XmlNode xmlNode, bool isPreviewing,
|
||||
out int id, out Guid key, out int template, out int sortOrder, out string name, out string writerName, out string urlName,
|
||||
out string creatorName, out int creatorId, out int writerId, out string docTypeAlias, out int docTypeId, out string path,
|
||||
@@ -398,7 +415,6 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache
|
||||
.OrderBy(x => x.SortOrder)
|
||||
.ToList();
|
||||
|
||||
// warn: this is not thread-safe
|
||||
_childrenInitialized = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user