Completes: U4-3937 Ensure media is indexed across all servers in LB environment with Distributed Cache calls
for members
This commit is contained in:
@@ -1,25 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<trees>
|
||||
|
||||
<!--Content-->
|
||||
<add application="content" alias="content" title="Content" type="umbraco.loadContent, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" silent="true" sortOrder="0" />
|
||||
<add application="content" alias="contentRecycleBin" title="RecycleBin" type="umbraco.cms.presentation.Trees.ContentRecycleBin, umbraco" iconClosed="folder.gif" iconOpen="folder_o.gif" initialize="false" sortOrder="0" />
|
||||
|
||||
<!--Media-->
|
||||
<add application="media" alias="media" title="Media" type="umbraco.loadMedia, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="0" />
|
||||
<add application="media" alias="mediaRecycleBin" title="RecycleBin" type="umbraco.cms.presentation.Trees.MediaRecycleBin, umbraco" iconClosed="folder.gif" iconOpen="folder_o.gif" initialize="false" sortOrder="0" />
|
||||
|
||||
<!--Settings-->
|
||||
<add application="settings" alias="stylesheets" title="Stylesheets" type="umbraco.loadStylesheets, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="0" />
|
||||
<add application="settings" alias="stylesheetProperty" title="Stylesheet Property" type="umbraco.loadStylesheetProperty, umbraco" iconClosed="" iconOpen="" initialize="false" sortOrder="0" />
|
||||
<add application="settings" alias="templates" title="Templates" type="umbraco.loadTemplates, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="1" />
|
||||
<add application="settings" alias="partialViews" title="Partial Views" silent="false" initialize="true" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" type="Umbraco.Web.Trees.PartialViewsTree, umbraco" sortOrder="2" />
|
||||
<add application="settings" alias="scripts" title="Scripts" type="umbraco.loadScripts, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="3" />
|
||||
<add application="settings" alias="partialViews" title="Partial Views" silent="false" initialize="true" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" type="Umbraco.Web.Trees.PartialViewsTree, umbraco" sortOrder="2" />
|
||||
<add application="settings" alias="scripts" title="Scripts" type="umbraco.loadScripts, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="3" />
|
||||
<add application="settings" alias="dictionary" title="Dictionary" type="umbraco.loadDictionary, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" action="openDictionary()" sortOrder="4" />
|
||||
<add application="settings" alias="languages" title="Languages" type="umbraco.loadLanguages, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="5" />
|
||||
<add application="settings" alias="mediaTypes" title="Media Types" type="umbraco.loadMediaTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="6" />
|
||||
<add application="settings" alias="nodeTypes" title="Document Types" type="umbraco.loadNodeTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="7" />
|
||||
|
||||
<!--Developer-->
|
||||
<add application="developer" alias="datatype" title="Data Types" type="umbraco.loadDataTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="1" />
|
||||
<add application="developer" alias="macros" title="Macros" type="umbraco.loadMacros, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="2" />
|
||||
@@ -28,24 +24,19 @@
|
||||
<add application="developer" alias="relationTypes" title="Relation Types" type="umbraco.loadRelationTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="4" />
|
||||
<add application="developer" alias="python" title="Scripting Files" type="umbraco.loadPython, umbraco" iconClosed="folder.gif" iconOpen="folder_o.gif" sortOrder="4" />
|
||||
<add application="developer" alias="xslt" title="XSLT Files" type="umbraco.loadXslt, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="5" />
|
||||
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTree, umbraco" silent="false" initialize="true" sortOrder="6" title="Partial View Macro Files" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" />
|
||||
|
||||
<add application="developer" alias="partialViewMacros" type="Umbraco.Web.Trees.PartialViewMacrosTree, umbraco" silent="false" initialize="true" sortOrder="6" title="Partial View Macro Files" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" />
|
||||
<!--Users-->
|
||||
<add application="users" alias="users" title="Users" type="umbraco.loadUsers, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="0" />
|
||||
<add application="users" alias="userTypes" title="User Types" type="umbraco.cms.presentation.Trees.UserTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="1" />
|
||||
<add application="users" alias="userPermissions" title="User Permissions" type="umbraco.cms.presentation.Trees.UserPermissions, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="2" />
|
||||
|
||||
<!--Members-->
|
||||
<add application="member" alias="member" title="Members" type="umbraco.loadMembers, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="0" />
|
||||
<add application="member" alias="memberGroup" title="Member Groups" type="umbraco.loadMemberGroups, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="1" />
|
||||
<add application="member" alias="memberType" title="Member Types" type="umbraco.loadMemberTypes, umbraco" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="2" />
|
||||
|
||||
<!--Translation-->
|
||||
<add silent="false" initialize="true" sortOrder="1" alias="openTasks" application="translation" title="Tasks assigned to you" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" type="umbraco.loadOpenTasks, umbraco" action="" />
|
||||
<add silent="false" initialize="true" sortOrder="2" alias="yourTasks" application="translation" title="Tasks created by you" iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" type="umbraco.loadYourTasks, umbraco" action="" />
|
||||
|
||||
<!-- Custom -->
|
||||
<!--<add application="myApplication" alias="myTree" title="Me Tree" type="MyNamespace.myTree, MyAssembly"
|
||||
iconClosed=".sprTreeFolder" iconOpen=".sprTreeFolder_o" sortOrder="10" />-->
|
||||
|
||||
</trees>
|
||||
@@ -224,7 +224,7 @@
|
||||
</scheduledTasks>
|
||||
|
||||
<!-- distributed calls make umbraco use webservices to handle cache refreshing -->
|
||||
<distributedCall enable="false">
|
||||
<distributedCall enable="true">
|
||||
<!-- the id of the user who's making the calls -->
|
||||
<!-- needed for security, umbraco will automatically look up correct login and passwords -->
|
||||
<user>0</user>
|
||||
@@ -233,7 +233,7 @@
|
||||
<!-- you can also add optional attributes to force a protocol or port number (see #2) -->
|
||||
<!-- <server>127.0.0.1</server>-->
|
||||
<!-- <server forceProtocol="http|https" forcePortnumber="80|443">127.0.0.1</server>-->
|
||||
<server>umb1.dev</server>
|
||||
<!--<server>umb1.dev</server>-->
|
||||
<server forcePortnumber="6200">localhost</server>
|
||||
</servers>
|
||||
</distributedCall>
|
||||
|
||||
@@ -596,22 +596,22 @@ namespace Umbraco.Web.Cache
|
||||
#endregion
|
||||
|
||||
#region Media event handlers
|
||||
static void MediaServiceTrashing(IMediaService sender, Core.Events.MoveEventArgs<IMedia> e)
|
||||
static void MediaServiceTrashing(IMediaService sender, MoveEventArgs<IMedia> e)
|
||||
{
|
||||
DistributedCache.Instance.RemoveMediaCache(false, e.Entity);
|
||||
}
|
||||
|
||||
static void MediaServiceMoving(IMediaService sender, Core.Events.MoveEventArgs<IMedia> e)
|
||||
static void MediaServiceMoving(IMediaService sender, MoveEventArgs<IMedia> e)
|
||||
{
|
||||
DistributedCache.Instance.RefreshMediaCache(e.Entity);
|
||||
}
|
||||
|
||||
static void MediaServiceDeleting(IMediaService sender, Core.Events.DeleteEventArgs<IMedia> e)
|
||||
static void MediaServiceDeleting(IMediaService sender, DeleteEventArgs<IMedia> e)
|
||||
{
|
||||
DistributedCache.Instance.RemoveMediaCache(true, e.DeletedEntities.ToArray());
|
||||
}
|
||||
|
||||
static void MediaServiceSaved(IMediaService sender, Core.Events.SaveEventArgs<IMedia> e)
|
||||
static void MediaServiceSaved(IMediaService sender, SaveEventArgs<IMedia> e)
|
||||
{
|
||||
DistributedCache.Instance.RefreshMediaCache(e.SavedEntities.ToArray());
|
||||
}
|
||||
@@ -619,27 +619,21 @@ namespace Umbraco.Web.Cache
|
||||
|
||||
#region Member event handlers
|
||||
|
||||
static void MemberServiceDeleted(IMemberService sender, Core.Events.DeleteEventArgs<IMember> e)
|
||||
static void MemberServiceDeleted(IMemberService sender, DeleteEventArgs<IMember> e)
|
||||
{
|
||||
foreach (var m in e.DeletedEntities.ToArray())
|
||||
{
|
||||
DistributedCache.Instance.RemoveMemberCache(m.Id);
|
||||
}
|
||||
DistributedCache.Instance.RemoveMemberCache(e.DeletedEntities.ToArray());
|
||||
}
|
||||
|
||||
static void MemberServiceSaved(IMemberService sender, Core.Events.SaveEventArgs<IMember> e)
|
||||
static void MemberServiceSaved(IMemberService sender, SaveEventArgs<IMember> e)
|
||||
{
|
||||
foreach (var m in e.SavedEntities.ToArray())
|
||||
{
|
||||
DistributedCache.Instance.RefreshMemberCache(m.Id);
|
||||
}
|
||||
DistributedCache.Instance.RefreshMemberCache(e.SavedEntities.ToArray());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Member group event handlers
|
||||
|
||||
static void MemberGroupService_Deleted(IMemberGroupService sender, Core.Events.DeleteEventArgs<IMemberGroup> e)
|
||||
static void MemberGroupService_Deleted(IMemberGroupService sender, DeleteEventArgs<IMemberGroup> e)
|
||||
{
|
||||
foreach (var m in e.DeletedEntities.ToArray())
|
||||
{
|
||||
@@ -647,7 +641,7 @@ namespace Umbraco.Web.Cache
|
||||
}
|
||||
}
|
||||
|
||||
static void MemberGroupService_Saved(IMemberGroupService sender, Core.Events.SaveEventArgs<IMemberGroup> e)
|
||||
static void MemberGroupService_Saved(IMemberGroupService sender, SaveEventArgs<IMemberGroup> e)
|
||||
{
|
||||
foreach (var m in e.SavedEntities.ToArray())
|
||||
{
|
||||
|
||||
@@ -256,11 +256,33 @@ namespace Umbraco.Web.Cache
|
||||
#endregion
|
||||
|
||||
#region Member cache
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes the cache among servers for a member
|
||||
/// </summary>
|
||||
/// <param name="dc"></param>
|
||||
/// <param name="members"></param>
|
||||
public static void RefreshMemberCache(this DistributedCache dc, params IMember[] members)
|
||||
{
|
||||
dc.Refresh(new Guid(DistributedCache.MemberCacheRefresherId), x => x.Id, members);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the cache among servers for a member
|
||||
/// </summary>
|
||||
/// <param name="dc"></param>
|
||||
/// <param name="members"></param>
|
||||
public static void RemoveMemberCache(this DistributedCache dc, params IMember[] members)
|
||||
{
|
||||
dc.Remove(new Guid(DistributedCache.MemberCacheRefresherId), x => x.Id, members);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes the cache among servers for a member
|
||||
/// </summary>
|
||||
/// <param name="dc"></param>
|
||||
/// <param name="memberId"></param>
|
||||
[Obsolete("Use the RefreshMemberCache with strongly typed IMember objects instead")]
|
||||
public static void RefreshMemberCache(this DistributedCache dc, int memberId)
|
||||
{
|
||||
dc.Refresh(new Guid(DistributedCache.MemberCacheRefresherId), memberId);
|
||||
@@ -271,6 +293,7 @@ namespace Umbraco.Web.Cache
|
||||
/// </summary>
|
||||
/// <param name="dc"></param>
|
||||
/// <param name="memberId"></param>
|
||||
[Obsolete("Use the RemoveMemberCache with strongly typed IMember objects instead")]
|
||||
public static void RemoveMemberCache(this DistributedCache dc, int memberId)
|
||||
{
|
||||
dc.Remove(new Guid(DistributedCache.MemberCacheRefresherId), memberId);
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Umbraco.Web.Cache
|
||||
/// <remarks>
|
||||
/// This is not intended to be used directly in your code and it should be sealed but due to legacy code we cannot seal it.
|
||||
/// </remarks>
|
||||
public class MemberCacheRefresher : CacheRefresherBase<MemberCacheRefresher>
|
||||
public class MemberCacheRefresher : TypedCacheRefresherBase<MemberCacheRefresher, IMember>
|
||||
{
|
||||
|
||||
protected override MemberCacheRefresher Instance
|
||||
@@ -44,6 +44,18 @@ namespace Umbraco.Web.Cache
|
||||
base.Remove(id);
|
||||
}
|
||||
|
||||
public override void Refresh(IMember instance)
|
||||
{
|
||||
ClearCache(instance.Id);
|
||||
base.Remove(instance);
|
||||
}
|
||||
|
||||
public override void Remove(IMember instance)
|
||||
{
|
||||
ClearCache(instance.Id);
|
||||
base.Remove(instance);
|
||||
}
|
||||
|
||||
private void ClearCache(int id)
|
||||
{
|
||||
ApplicationContext.Current.ApplicationCache.ClearPartialViewCache();
|
||||
|
||||
@@ -60,10 +60,8 @@ namespace Umbraco.Web.Search
|
||||
CacheRefresherBase<UnpublishedPageCacheRefresher>.CacheUpdated += UnpublishedPageCacheRefresherCacheUpdated;
|
||||
CacheRefresherBase<PageCacheRefresher>.CacheUpdated += PublishedPageCacheRefresherCacheUpdated;
|
||||
CacheRefresherBase<MediaCacheRefresher>.CacheUpdated += MediaCacheRefresherCacheUpdated;
|
||||
CacheRefresherBase<MemberCacheRefresher>.CacheUpdated += MemberCacheRefresherCacheUpdated;
|
||||
|
||||
Member.AfterSave += MemberAfterSave;
|
||||
Member.AfterDelete += MemberAfterDelete;
|
||||
|
||||
var contentIndexer = ExamineManager.Instance.IndexProviderCollection["InternalIndexer"] as UmbracoContentIndexer;
|
||||
if (contentIndexer != null)
|
||||
{
|
||||
@@ -76,11 +74,55 @@ namespace Umbraco.Web.Search
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
[SecuritySafeCritical]
|
||||
static void MemberCacheRefresherCacheUpdated(MemberCacheRefresher sender, CacheRefresherEventArgs e)
|
||||
{
|
||||
switch (e.MessageType)
|
||||
{
|
||||
case MessageType.RefreshById:
|
||||
var c1 = ApplicationContext.Current.Services.MemberService.GetById((int)e.MessageObject);
|
||||
if (c1 != null)
|
||||
{
|
||||
ReIndexForMember(c1);
|
||||
}
|
||||
break;
|
||||
case MessageType.RemoveById:
|
||||
|
||||
// This is triggered when the item is permanently deleted
|
||||
|
||||
DeleteIndexForEntity((int)e.MessageObject, false);
|
||||
break;
|
||||
case MessageType.RefreshByInstance:
|
||||
var c3 = e.MessageObject as IMember;
|
||||
if (c3 != null)
|
||||
{
|
||||
ReIndexForMember(c3);
|
||||
}
|
||||
break;
|
||||
case MessageType.RemoveByInstance:
|
||||
|
||||
// This is triggered when the item is permanently deleted
|
||||
|
||||
var c4 = e.MessageObject as IMember;
|
||||
if (c4 != null)
|
||||
{
|
||||
DeleteIndexForEntity(c4.Id, false);
|
||||
}
|
||||
break;
|
||||
case MessageType.RefreshAll:
|
||||
case MessageType.RefreshByJson:
|
||||
default:
|
||||
//We don't support these, these message types will not fire for unpublished content
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles index management for all media events - basically handling saving/copying/trashing/deleting
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
[SecuritySafeCritical]
|
||||
static void MediaCacheRefresherCacheUpdated(MediaCacheRefresher sender, CacheRefresherEventArgs e)
|
||||
{
|
||||
switch (e.MessageType)
|
||||
@@ -265,24 +307,13 @@ namespace Umbraco.Web.Search
|
||||
}
|
||||
|
||||
[SecuritySafeCritical]
|
||||
private static void MemberAfterSave(Member sender, SaveEventArgs e)
|
||||
private static void ReIndexForMember(IMember member)
|
||||
{
|
||||
//ensure that only the providers are flagged to listen execute
|
||||
var xml = ExamineXmlExtensions.ToXElement(sender.ToXml(new System.Xml.XmlDocument(), false));
|
||||
var providers = ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
.Where(x => x.EnableDefaultEventHandler);
|
||||
ExamineManager.Instance.ReIndexNode(xml, IndexTypes.Member, providers);
|
||||
}
|
||||
|
||||
[SecuritySafeCritical]
|
||||
private static void MemberAfterDelete(Member sender, DeleteEventArgs e)
|
||||
{
|
||||
var nodeId = sender.Id.ToString();
|
||||
|
||||
//ensure that only the providers are flagged to listen execute
|
||||
ExamineManager.Instance.DeleteFromIndex(nodeId,
|
||||
ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
ExamineManager.Instance.ReIndexNode(
|
||||
member.ToXml(), IndexTypes.Member,
|
||||
ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
//ensure that only the providers are flagged to listen execute
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -310,14 +341,14 @@ namespace Umbraco.Web.Search
|
||||
private static void ReIndexForMedia(IMedia sender, bool isMediaPublished)
|
||||
{
|
||||
ExamineManager.Instance.ReIndexNode(
|
||||
sender.ToXml(), "media",
|
||||
sender.ToXml(), IndexTypes.Media,
|
||||
ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
|
||||
//Index this item for all indexers if the media is not trashed, otherwise if the item is trashed
|
||||
// then only index this for indexers supporting unpublished media
|
||||
//Index this item for all indexers if the media is not trashed, otherwise if the item is trashed
|
||||
// then only index this for indexers supporting unpublished media
|
||||
|
||||
.Where(x => isMediaPublished || (x.SupportUnpublishedContent))
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
.Where(x => isMediaPublished || (x.SupportUnpublishedContent))
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -351,17 +382,17 @@ namespace Umbraco.Web.Search
|
||||
/// </param>
|
||||
[SecuritySafeCritical]
|
||||
private static void ReIndexForContent(IContent sender, bool isContentPublished)
|
||||
{
|
||||
ExamineManager.Instance.ReIndexNode(
|
||||
sender.ToXml(), "content",
|
||||
ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
{
|
||||
ExamineManager.Instance.ReIndexNode(
|
||||
sender.ToXml(), IndexTypes.Content,
|
||||
ExamineManager.Instance.IndexProviderCollection.OfType<BaseUmbracoIndexer>()
|
||||
|
||||
//Index this item for all indexers if the content is published, otherwise if the item is not published
|
||||
// then only index this for indexers supporting unpublished content
|
||||
//Index this item for all indexers if the content is published, otherwise if the item is not published
|
||||
// then only index this for indexers supporting unpublished content
|
||||
|
||||
.Where(x => isContentPublished || (x.SupportUnpublishedContent))
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
}
|
||||
.Where(x => isContentPublished || (x.SupportUnpublishedContent))
|
||||
.Where(x => x.EnableDefaultEventHandler));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a content node to XDocument
|
||||
|
||||
Reference in New Issue
Block a user