February 2013 SharePoint 2010 Hotfix


 

With April 2013 CU we are addressing this special issue and there is no need anymore to use the Critical on Demand hotfix provided in February 2013. Cumulative Updates are better tested than a COD.

 

·         Identifying the issue

·         Preparation to install the hotfix

·         Download the hotfix; Updated 10/Apr/2013

·         Installation of the hotfix

·         Post Installation steps

·         Our current recommendation to fix the issue without the hotfix

 

 

Identifying the issue:

 

Issue got introduced since August 2012 CU for SharePoint Server 2010.

 

After publishing a new page the site load times start to increase dramatically or page requests don’t finish loading at all. You will see the infamous “An expected error has occurred“-error or if the callstack is enabled and custom errors are turned off in the web.config (CallStack="true" / customErrors mode="Off") you will see a "Request timed out." error-message.

 

Errors you will see in the ULS log after a user has published a page and then tries to open the page / site containing the page:

 

System.Data.SqlClient.SqlException: Transaction (Process ID 76) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.   

 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)   

 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)   

 at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)   

 at System.Data.SqlClient.SqlDataReader.HasMoreRows()   

 at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)   

 at Microsoft.SharePoint.SPSqlClient.ExecuteQueryInternal(Boolean retryfordeadlock)   

 at Microsoft.SharePoint.SPSqlClient.ExecuteQuery(Boolean retryfordeadlock)

 

 

Unexpected query execution failure in navigation query, HResult -2146232060. Query text (if available): "BEGIN TRAN DECLARE @abort int SET @abort = 0 DECLARE @EidBase int,@EidHome int SET @EidBase = 0 SET @EidHome = NULL IF @abort = 0 BEGIN EXEC @abort = proc_GetWebNavStructNodeByIds ‘1CA27B52-5021-4CE1-AE8A-C553F62481C5′,’26F979ED-9769-4F91-B29C-CC45C798D393’,13730 SELECT @wssp0 = @abort END IF @abort <> 0 BEGIN ROLLBACK TRAN END ELSE BEGIN COMMIT TRAN END IF @abort = 0 BEGIN EXEC proc_UpdateDiskUsed ‘1CA27B52-5021-4CE1-AE8A-C553F62481C5’ END "

 

 

An unexpected error occurred while manipulating the navigational structure of this Web.

 

 

Leaving Monitored Scope (PortalSiteMapNode: Populating navigation children for web: /ABCDEF). Execution Time=66179.2079302278

 

PortalSiteMapProvider was unable to fetch children for node

at URL: /ABCDEF, message: An unexpected error occurred while manipulating the navigational structure of this Web., stack trace:  

 at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)   

 at Microsoft.SharePoint.Library.SPRequest.UpdateNavigationNode(String bstrUrl, Int32 lNodeId, DateTime dateParented, String bstrName, String bstrNodeUrl, Object& pvarProperties, String& pbstrDateModified)   

 at Microsoft.SharePoint.Navigation.SPNavigationNode.Update()   

 at Microsoft.SharePoint.Publishing.Navigation.SPNavigationSiteMapNode.UpdateSPNavigationNode(SPNavigationNode node, SPNavigationNode previous, String name, String url, String description, String target, String audience, Boolean forceCreate)   

 at Microsoft.SharePoint.Publishing.Navigation.SPNavigationSiteMapNode.UpgradeDraftSPNavigationNode(SPNavigationNode draftNode, SPNavigationNode previous)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalWebSiteMapNode.<>c__DisplayClass2.<UpdateNavigationNodes>b__0()   

 at Microsoft.Office.Server.Utilities.Security.SecurityUtilities.RunWithAllowUnsafeUpdates(SPWeb web, Action secureCode)   

 at Microsoft.SharePoint.Publishing.CmsSecurityUtilities.RunWithAllowUnsafeUpdates(SPWeb web, CodeToRun secureCode)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalWebSiteMapNode.PopulateNavigationChildrenInner(NodeTypes includedTypes)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalWebSiteMapNode.PopulateNavigationChildren(NodeTypes includedTypes)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapNode.GetNavigationChildren(NodeTypes includedTypes, NodeTypes includedHiddenTypes, Boolean trimmingEnabled, OrderingMethod ordering, AutomaticSortingMethod method, Boolean ascending, Int32 lcid)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapNode.GetNavigationChildren(NodeTypes includedTypes, NodeTypes includedHiddenTypes, OrderingMethod ordering, AutomaticSortingMethod method, Boolean ascending, Int32 lcid)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapNode.GetNavigationChildren(NodeTypes includedHiddenTypes)   

 at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider.GetChildNodes(PortalSiteMapNode node, NodeTypes includedHiddenTypes)

 

 

 

Preparation to install the hotfix:

Check the section “Our current recommendation to fix the issue without the hotfix” to remove unnecessary NavNodes.

  

 

Download the hotfix:

With our April 2013 CU it is now possible to fix this issue. All information about this cumulative update you can find here: http://blogs.msdn.com/b/joerg_sinemus/archive/2013/04/10/sharepoint-2010-and-april-2013-cu.aspx

 

More about the different hotfix packages you can find here: http://blogs.technet.com/b/office_sustained_engineering/archive/2008/07/01/office-hotfixes-to-be-delivered-on-a-defined-schedule-in-the-form-of-cumulative-updates.aspx

   

 

Installation of the hotfix:

As usual like all our cumulative updates we had in the past, see the linked April 2013 CU post.

 

Post Installation Steps:

In case you want to be sure that no additional NavNodes entries are in the database please run the PowerShell script described in the section “Our current recommendation to fix the issue without the hotfix”.

 

 

 

Our current recommendation to fix the issue without the hotfix:


SharePoint 2010 Navigation deadlock: Multiple concurrent requests to update navigation nodes end up in deadlock


– Steps before you install the hotfix

– Steps you need one time after the hotfix has been installed

In case you run into the “NavNodes” issue which is expected only on a Farm with heavy load and lot of changes when using publishing features. One idea is to let the Administrator know which Page creates the unnecessary NavNodes and the other idea is to run a PowerShell script to remove the unnecessary NavNodes.

Our recommendation is to run the PowerShell script one time before you install the hotfix in the farm and one time after the hotfix has been installed. In case you can wait for April 2013 CU you can also use these workarounds until that time.

1.     Regularly run a scheduled powershell script to automatically detect problematic pages (checks all pages on all sites/subsites of a web application) and automatically remove the duplicates 1-by-1 via Powershell using supported and publically SharePoint API.

Ø  DeleteDupNodes_Quicklaunch_and_TopNavigation.txt

=> This will log to a logfile as you can see in the sript… the logging is not perfect – for every node deletion one line in the logfile will be written – logfile will be huge…. This has optimization potential !!!

ð  Some customers report that the deletion of the duplicates just takes too long 30min to 120+min and cannot make use of this workaround and use the next one:

 

2.     Regularly run a scheduled powershell script to automatically detect navigation duplicates and send a mail via SMTP to the admins reporting the problematic pages

Ø  Sendmail_for_duplicates_quicklaunch_and_topnavigation.txt

ð  The admins then manually move the page to the recycle bin and restore them afterwards.

ð  Due to the site is already completely inaccessible you have to use SP Designer or the Manage Content and Structure wizard (sitemanager.aspx) which doesn’t load the navigation.

 

ð  The yellow marked parts have to be correctly set by the customer before running the script:

function sendMail

{

      param ([string]$problemPage)

     

      $emailFrom = "youraddress@yourdomain.com"

      $emailTo = "youraddress@yourdomain.com"

      if($global:navType -eq "TopNavigation")

      {

            $subject = "ALERT: Duplicate navigation-nodes in TopNavigation found!"

      }

      else

      {

            $subject = "ALERT: Duplicate navigation-nodes in Quicklaunch navigation found!"

      }    

      $body = "Problematic page: " + ($problemPage)

      $smtpServer = "YourSMTPServer"

      $smtp = new-object Net.Mail.SmtpClient($smtpServer)

      $smtp.Send($emailFrom, $emailTo, $subject, $body)

}

 

 

 

 


File: DeleteDupNodes_Quicklaunch_and_TopNavigation.txt

 

# THIS CODE-SAMPLE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED

# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR

# FITNESS FOR A PARTICULAR PURPOSE.

#

# This sample is not supported under any Microsoft standard support program or service.

# The script is provided AS IS without warranty of any kind. Microsoft further disclaims all

# implied warranties including, without limitation, any implied warranties of merchantability

# or of fitness for a particular purpose. The entire risk arising out of the use or performance

# of the sample and documentation remains with you. In no event shall Microsoft, its authors,

# or anyone else involved in the creation, production, or delivery of the script be liable for

# any damages whatsoever (including, without limitation, damages for loss of business profits,

# business interruption, loss of business information, or other pecuniary loss) arising out of

# the use of or inability to use the sample or documentation, even if Microsoft has been advised

# of the possibility of such damages.

################################################################################################

 

 

param

(

    $url = $(Read-Host -Prompt "SiteCollection Url")

)

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

 

$Logfile = "duplicates_log.txt"

 

Function LogWrite

{

   Param ([string]$logstring)

 

   Add-content $Logfile -value $logstring

}

 

 

function tryDeleteNode

{

    param

    (

        $node,$dictionary,$nodeCollection

    )

 

    $title = $node.Title

   

               

                    if(!$dictionary.ContainsKey($title))

                    {

                        $dictionary.Add($node.Title,$node.Url)

                    }

                    else

                    {

                        if($dictionary[$title] -eq $node.Url)

                        {

                            if($node.Children.Count -eq 0)

                            {

                                echo "       -> Deleting Duplicate Node: $title"

                                $nodeCollection.Delete($node)

                                $global:didDelete= $true

                                               $temp = (get-date).ToString() +";"+ ($site.Url) +";"+ ($title)

                                               echo "$temp"

                                               LogWrite $($temp)

 

                            }

                            else

                            {

                                echo "       -> Dupe Node $title has children, Skipping…"

                            }

                        }

                else

                        {

                    echo "       -> Duplicate title $title found, but mismatched link, Skipping…"

                        }

                    }

               

}

 

function deleteNodesRecurse

{

    $nodes = @{}

    foreach($node in $quickLaunch)

    {

        $childNodes = @{}

        foreach($child in $node.Children)

        {

            tryDeleteNode -node $child -dictionary $childNodes -nodeCollection $node.Children

        }

 

        tryDeleteNode -node $node -dictionary $nodes -nodeCollection $quickLaunch

    }

}

function deleteGlobalNodesRecurse

{

    $nodes = @{}

    foreach($node in $gnavNodes)

    {

        $childNodes = @{}

        foreach($child in $node.Children)

        {

            tryDeleteNode -node $child -dictionary $childNodes -nodeCollection $node.Children

        }

 

        tryDeleteNode -node $node -dictionary $nodes -nodeCollection $gnavNodes

    }

}

 

$sitecoll = Get-SPSite $url

write-host "SiteCollection: " $sitecoll.URL

foreach ($site in $sitecoll.AllWebs)

{

        write-host " -> Site: " $site.URL

                do

                {

                               $quickLaunch = $site.Navigation.QuickLaunch

                               $global:didDelete = $false

                               deleteNodesRecurse

                               $pub= [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($site)

                               $gnavNodes = $pub.Navigation.GlobalNavigationNodes;

                               deleteGlobalNodesRecurse

                }

                while($global:didDelete)

                $site.Dispose()

}

$sitecoll.Dispose()

 

 

 

 


File: Sendmail_for_duplicates_quicklaunch_and_topnavigation.txt

 

# THIS CODE-SAMPLE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED

# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR

# FITNESS FOR A PARTICULAR PURPOSE.

#

# This sample is not supported under any Microsoft standard support program or service.

# The script is provided AS IS without warranty of any kind. Microsoft further disclaims all

# implied warranties including, without limitation, any implied warranties of merchantability

# or of fitness for a particular purpose. The entire risk arising out of the use or performance

# of the sample and documentation remains with you. In no event shall Microsoft, its authors,

# or anyone else involved in the creation, production, or delivery of the script be liable for

# any damages whatsoever (including, without limitation, damages for loss of business profits,

# business interruption, loss of business information, or other pecuniary loss) arising out of

# the use of or inability to use the sample or documentation, even if Microsoft has been advised

# of the possibility of such damages.

################################################################################################

 

 

param ($url = $(Read-Host -Prompt "WebApplication Url"))

 

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

new-variable -name duplicatecounter -visibility public -scope global

new-variable -name navType -visibility public -scope global

new-variable -name duplicateThreshold -visibility public -scope global -value 50

 

function sendMail

{

                param ([string]$problemPage)

               

                $emailFrom = "youraddress@yourdomain.com"

                $emailTo = "youraddress@yourdomain.com"

 

                if($global:navType -eq "QuickLaunch")

                {

                               $subject = "ALERT: Duplicate navigation-nodes in Quicklaunch navigation found!"        

               

                }

                else

                {

                               $subject = "ALERT: Duplicate navigation-nodes in TopNavigation found!"

                }             

                $body = "Problematic page: " + ($problemPage)

                $smtpServer = "YourSMTPServer"

                $smtp = new-object Net.Mail.SmtpClient($smtpServer)

                $smtp.Send($emailFrom, $emailTo, $subject, $body)

}

 

 

function tryDeleteNode

{

                param($node,$dictionary,$nodeCollection)

               

                $title = $node.Title

                if(!$dictionary.ContainsKey($title))

                {

                               $dictionary.Add($node.Title,$node.Url)

                }

                else

                {

                               if($dictionary[$title] -eq $node.Url)

                               {

                                               if($node.Children.Count -eq 0)

                                               {

                                                               $global:duplicatecounter++

                                                               if($global:duplicatecounter -gt $global:duplicateThreshold)

                                                               {

                                                                              $affectedPage = ($site.Url) +"/"+ ($title) + ".aspx"

                                                                              echo "    -> Problem page found: $affectedPage"

                                                                              try

                                                                              {

                                                                                              echo "     -> Sending mail…"

                                                                                              sendMail $affectedPage

                                                                                              echo "     -> Mail sent!"

                                                                              }

                                                                              catch

                                                                              {

                                                                                              echo "     -> error sending Mail!"

                                                                              }

                                                                              $global:didDelete = $false

                                                               }

                                                               else

                                                               {

                                                                              $global:didDelete = $true

                                                               }

 

                                               }

                                               else

                                               {

                                                               echo "    -> Dupe Node $title has children, Skipping…"

                                               }

                               }

                               else

                               {

                                               echo "    -> Duplicate title $title found, but mismatched link, Skipping…"

                               }

                }

 

}

 

function deleteNodesRecurse

{

                $nodes = @{}

                foreach($node in $quickLaunch)

                {

                               $childNodes = @{}

                               foreach($child in $node.Children)

                               {

                                               if($global:duplicatecounter -lt ($global:duplicateThreshold+1))

                                               {

                                                               tryDeleteNode -node $child -dictionary $childNodes -nodeCollection $node.Children

                                               }

                               }

                               if($global:duplicatecounter -lt ($global:duplicateThreshold+1))

                               {

                                               tryDeleteNode -node $node -dictionary $nodes -nodeCollection $quickLaunch

                               }

                }

}

 

function deleteGlobalNodesRecurse

{

    $nodes = @{}

    foreach($node in $gnavNodes)

    {

        $childNodes = @{}

        foreach($child in $node.Children)

        {

                               if($global:duplicatecounter -lt ($global:duplicateThreshold+1))

                               {

                                               tryDeleteNode -node $child -dictionary $childNodes -nodeCollection $node.Children                                

                               }

                }

                if($global:duplicatecounter -lt ($global:duplicateThreshold+1))

                {

                        tryDeleteNode -node $node -dictionary $nodes -nodeCollection $gnavNodes

                }

    }

}

 

$webApplication = Get-SPWebApplication $url

$global:duplicatecounter = 0

foreach($siteCollection in $webApplication.Sites)

{

                write-host "SiteCollection: " $sitecollection.URL

                foreach ($site in $siteCollection.AllWebs)

                {

                               write-host " -> Site: " $site.URL

                               write-host "   ->  Checking QuickLaunch navigation…"

                               $global:navType = "QuickLaunch"

                               do

                               {

                                               $global:didDelete = $false

                                               try

                                               {

                                                               $quickLaunch = $site.Navigation.QuickLaunch

                                               }

                                               catch

                                               {

                                                               write-host "    ->  No navigation nodes…"

                                               }

                                               try

                                               {

                                                               deleteNodesRecurse

                                               }

                                               catch

                                               {

                                               }

                               }

                               while($global:didDelete)

 

 

                               $global:duplicatecounter = 0                    

                               $global:didDelete = $true

 

                               write-host "   -> Checking TopNavigation…"

                               $global:navType = "TopNavigation"

                               do

                               {             

                                               $global:didDelete = $false

                                               $pub= [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($site)

                                               try

                                               {

                                                               $gnavNodes = $pub.Navigation.GlobalNavigationNodes;

                                               }

                                               catch

                                               {

                                                               write-host "    -> No navigation nodes…"

                                               }

                                               try

                                               {

                                                               deleteGlobalNodesRecurse

                                               }

                                               catch

                                               {

                                               }

 

                               }

                               while($global:didDelete)

 

                               $site.Dispose()

                               $global:duplicatecounter = 0

                               $global:didDelete = $true

                }

                $siteCollection.Dispose()

}

 

Comments (38)

  1. Anup Dholakia says:

    Excellent explanation.

  2. KCRyan318 says:

    Thanks Jeorge! That certainly sounds like what my client is experiencing. We will look into applying this hotfix.

  3. In the KB with the hotfix, there is a .5000 and a .5003.  Should we only be applying .5003 if we're affected by this issue?

  4. Hi Trevor; now I understand what you means and that was also the reason why I updated my post today. So please check my Update on 15/Feb/2013.

  5. Good lesson – Do not deploy SharePoint CU's right away, have a good reason to deploy, and deploy them to a test farm first.  Thanks for the great post!

  6. Henrik Damslund says:

    The same issue is present in SharePoint 2013 RTM. Using the scripts provided above also Works on 2013.

    There is currently no hotfix for 2013 to address this, and latest response is that it will be fixed in the April 2013 CU for SharePoint 2013.

  7. Andy says:

    Disabling the site navigation will allow access to the failing site:

    stsadm -o deactivatefeature -name navigation -url <site>

    Hopefully the person making the last change to the site will own up and regress it.  Re-enable navigation with this command:

    stsadm -o activatefeature -name navigation -url <site>

  8. Ricardo says:

    Hi Joerg,

    Great post.

    I went to the official Project Server 2010 Updates Site, and the last update was FEB 2013 CU, and installed.

    Now I saw in your post:

    Do not install February 2013 CU! Please wait for April 2013 CU.

    Now what? Should I wait for the April CU or should I install this COD?

    Thank you.

  9. Please install this COD only on SPS2010 and Project Server 2010, only if you run into the issue! In other words it might make sense to really wait for April CU.

  10. Hugo says:

    When does the April CU get released?

  11. From now please do not install the COD anymore and therefore I changed this blog post. April 2013 CU for SharePoint 2010 is now available: blogs.msdn.com/…/sharepoint-2010-and-april-2013-cu.aspx

  12. chris says:

    Hey guys – great news about the April 2013 CU – but I need to run with this script until we've rolled it out across our various farms… just a question –

    We've fixed up the pages it's reported on, but when I pipe the output of the script to a text file, I see – the "Duplicate title found, but mismatched link, Skipping"

    Is this any reason for concern?

  13. Hi Guys,

    We found out that deleting the affected sub sites and restoring them back from the site collection recycle bin is much quicker.

    * Steps followed:

    – Navigate to the content and structure (Site settings > Manage content and structure)

    – delete the affected sub sites

    – restore them back from the site collection recycle bin (Deleted from end user recycle bin)

    This worked for us, hope it helps.

  14. concerned says:

    Hi Joerg,

    I've looked over the supposed issues that April 2013 CU fixes, – support.microsoft.com/…/2775353, and cant see anything that sounds like this issue – We're about to download an test this latest CU – but are you sure this issue is fixed in the April 2013 CU? and why isn't it mentioned?

  15. BTW: It might be a good idea to mention that the April 2013 CU for SharePoint 2013 is available as well. Check here: blogs.msdn.com/…/sharepoint-2013-april-2013-cu.aspx

  16. Jussi Palo says:

    Well, we have April 2013 CU installed and just got this issue.

  17. Aouch @Jussi Palo that's definitely not good, can you confirm in a few days it IS the same issue please ?

    Just had the same issue at client but not yet applying the April CU however the Powershell DeleteDupNodes_QuickLaunch did the trick so far.

    Will apply CU soon when tested.

    FYI: it is quite difficult to find out if the SP2010 April2013 CU contains that fix since the official page mention the fix on the SP2013 CU but not the SP2010 CU but thanks to this post and the updated header we have to believe it is also in SP2010.

  18. Mike says:

    This is just ridiculous. I'm surprised folks using WCM sites havent run into this. I've also heard that there are a number of issues with the April 2013 CU. I have a customer where this keep coming up. What are the conditions that create this issue. Your article provides the symptoms but not the actual cause. Can you comment?

  19. CRB says:

    The PowerShell script to delete the duplicate nodes did not work for me.  It appeared to get stuck in a never-ending loop of attempting to delete the same node over and over again, and I was forced to kill the execution of the script.  We continue to experience the lengthy delay and the affected site failing to load.  I'm not comfortable proceeding with the hotfix or the CU given the negative feedback on those options, yet it is beyond disappointing and frustrating that we have a site that is inaccessible and that there's such a tremendous risk to all other publishing sites.  Come on, Microsoft!

  20. CRB says:

    My initial assessment was incorrect.  It's not that the script was attempting to delete the same duplicate node over and over again, it's that there were THOUSANDS of duplicate nodes.  The script is simply inefficient in handling that many items, as I had it run for several hours and there was no end in sight.  Another post on this issue suggests using SharePoint Designer to delete the problematic page(s) — any that are reported in the scripts as having duplicate nav nodes — and then restore it from the recycle bin.

  21. Mike; there is no absolute clear repro that shows the issue. AFAIK there must be at least 3 WFE (load-balanced) plus a lot of writers creating new pages together with a lot of incoming "reader" traffic.

    CRB; It is possible to create thousands of NavNode entries and therefore the script which based on the object model looks not that efficient. This solution is a safe one. The other solution with SPD and restore from recycle bin is also a good idea.

  22. CRB says:

    Thanks for the reply, Joerg.  Note that we only have 2 load-balanced WFEs in our environment which has been affected by this issue, though there's certainly high load from readers and others as the environment is highly-collaborative.

    Also, I can confirm that simply using SPD to delete a page with duplicate nav nodes allowed me immediate access to the site, where I could then restore the page from the recycle bin and "all was well".  However, I believe that this is likely just temporary, and may need to be repeated if/when the issue occurs again.  Also, this is fine for one-off issues, but not if you suffer from it in bulk.

  23. http://blog.cjvandyk.com says:

    Hey Joerg,

    Can you please provide the hotfix download link again?  Not everyone has the latest CU and the hotfix is the only way to solve the problem.

    Thanks

    C

  24. My old text for this blog contained the COD link but when a CU is available, we (Support) are always suggesting to use the CU. BTW: There was a closer dependency to a CU for the COD than with the April 2013 CU and that means it is definitely easier to install the CU instead of promising that a COD installed on baseline xyz might fix that issue and has no other issues.

  25. Help says:

    I keep reading that the April 2013 CU for SharePoint 2010 will fix the navigation problem? when I look up the CU I don't see any mention of this in the CU. I also read this CU causes more critical problems but there is a hot fix that should fix this issue. Please let me know where this hot fix is so I can test it out if there even is one.

  26. Christian Wimmer says:

    April CU seems to fix this issue, but breaks something with taxonomy pages. I guess we will have to stick with the  powershell script for now.

  27. this is weird says:

    I don't know if this is new.

    What I find is that, if the NavNode Title match/partially-match any subsite title, then the duplication happens; otherwise, it's safe. For ex: if the link title is "Search", while there is subsite called Search, then this error happens.

    FYI, there could be tons of duplicated records already in the system, when you run the script, be patient. that's not looping. it may take more than 1 hour to finish the delete.

  28. We have this problem also even we have installed April 2013 CU. We will test later if latest (August) update will fix this. Meanwhile we have to use managed metadata navigation as workaround.

  29. Tanveer Ahmed Khan says:

    Hi Jeorge,

    Thanks for addressing the issues. As we're working on SharePoint 2013 public facing site, we also face the problem and using SQL Scripts to delete the duplicate entries.

    However, I don't find fix of this issue in the recent released CU's for SharePoint 2013.  Running these SQL Script on Production environment wouldn't be the best option, therefore, we would like to know the CU in which this issue would/have been fixed.

    Highly appreciated your prompt response.

  30. Matt Ingle says:

    Has anyone verified a CU that fixes this issue yet for SP 2010? From what I have read there is no official fix from MS yet and it is still an issue in the latest CUs for SP 2010 and SP 2013. Please correct me if I am wrong.

  31. Matt Ingle says:

    We installed the SP2 + August 2013 CU for SP 2010 but we still have duplicate NavNodes. We run the script to delete them but that removes most of the SP navigation items on each site and we have to manually add them back. We have no choice but to monitor the issue with a scheduled task that emails us when problem pages are found, run the script to delete dups and then manually recreate the SP navigation.

    When is Microsoft going to fix this issue?

  32. You may raise a support ticket so that we can find out what particular issue you might have.

  33. danish says:

    Dear Joerg – I encounter the same issue. I have duplicate nodes in navnodes table. Doesn't it enough to run the CU on your server? Or does I have to run the script as well?

  34. After you applied the CU run the script one time to get rid of the duplicates. The fix will change the behavior to not create duplicates in the future.

  35. Bryce Liesemer says:

    Hey Guys.

    Whenever I run the scripts above, I get an error saying "Exception calling ContainsKey: Key cannot be null" as its going through each of the sites within the collection.  Any ideas what would be causing this?

  36. Debprotim Seal says:

    Thank you for such a descriptive explaination. Helped a lot!!!

  37. Radhika says:

    Thanks a lot saved my day