martes, 25 de marzo de 2014

Solucionando el error READPAST lock in the READ COMMITTED en HealthReport.aspx para SharePoint 2013

 

El detalle del error que muestra es el siguiente:

Application error when access /_admin/HealthReport.aspx, Error=You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels.   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)     at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)     at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)     at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)     at System.Data.SqlClient.SqlDataReader.Read()     at System.Data.Common.DataAdapter.FillLoadDataRowChunk(SchemaMapping mapping, Int32 startRecord, Int32 maxRecords)     at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)     at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)     at Microsoft.SharePoint.Administration.SPHealthReportFactory.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)     at Microsoft.SharePoint.Administration.SPHealthReportFactory.GetReportData(String reportName)     at Microsoft.SharePoint.WebControls.HealthDataSourceView.Select(DataSourceSelectArguments selectArguments)     at Microsoft.SharePoint.WebControls.AdministrationDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)     at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)     at System.Web.UI.WebControls.DataBoundControl.PerformSelect()     at System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()     at System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls()     at System.Web.UI.Control.EnsureChildControls()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Esto nos impide ver el informe de mantenimiento en la sección de Supervidor del Central Administration.

Gracias al Blog de Jason Lee´s que nos da respuestas correctas para problemas reales.   Según explica Jason hay un procedimiento almacenado en la base de datos de WSS_Logging mal escrito y esto impide que se pueda consultar el reporte.

Lo curioso de ello es que el problema esta desde la versión RTM y en el cliente que me dio error tiene una versión superior y de todos modos el error persiste.  La versión de mi cliente es 15.0.4481.1005 que básicamente es la actualización obligatoria de Marzo del 2013. 

El Store Procedure en mención al artículo que resuelve el problema puedo confirmarlo es el mismo. Abajo les muestro el SP de la versión del SharePoint de mi cliente:

USE [WSS_Logging]
GO
/****** Object:  StoredProcedure [dbo].[proc_GetSlowestPages]    Script Date: 03/25/2014 10:18:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[proc_GetSlowestPages]
   @StartTime           datetime = NULL,
   @EndTime             datetime = NULL,
   @WebApplicationId    uniqueIdentifier = NULL,
   @MachineName         nchar(128) = NULL,
   @MaxRows             bigint = 100
AS
BEGIN
    SET NOCOUNT ON
    SELECT TOP(@MaxRows)
         ServerUrl +
         CASE  ISNULL(SiteUrl,'')+ ISNULL(WebUrl,'')
             WHEN '/' THEN '' ELSE ISNULL(SiteUrl,'')+ ISNULL(WebUrl,'')
         END
         +ISNULL(DocumentPath,'')
         +ISNULL(QueryString,'') AS Url,
        CONVERT(float,AVG(Duration))/1000 AS AverageDuration,
        CONVERT(float,MAX(Duration))/1000 AS MaximumDuration,
        CONVERT(float,MIN(Duration))/1000 AS MinimumDuration,
        AVG(QueryCount) AS AverageQueryCount,
        MAX(QueryCount) AS MaximumQueryCount,
        MIN(QueryCount) AS MinimumQueryCount,
        COUNT(*) AS TotalPageHits
    FROM dbo.RequestUsage WITH (READPAST) 
    WHERE PartitionId in (SELECT PartitionId from dbo.fn_PartitionIdRangeMonthly(@StartTime, @EndTime))
    AND  LogTime BETWEEN @StartTime AND @EndTime
    AND (@WebApplicationId IS NULL OR  WebApplicationId = @WebApplicationId)
    AND (@MachineName IS NULL or MachineName = @MachineName)
    GROUP BY ServerUrl,SiteUrl,WebUrl,DocumentPath,QueryString
    ORDER BY AVG(duration) DESC
END

La solución prácticamente es eliminar la línea WITH (READPAST) del procedimiento proc_GetSlowestPages de la base de datos WSS_Logging.  Yo lo hice y me funciono el error, para lo que sabes algo de SQL Server esto no tiene ninguna implicación importante que afecte de alguna forma el SharePoint, únicamente se esta corrigiendo un código en SQL mal escrito.

 

image

Interesante el artículo que menciona que Ms no se opone a que se corrija el problema especialmente con temas de visualización y no de operación.  Así que todo depende de Usted.

El artículo que menciono lo puede encontrar en la siguiente dirección: http://www.jrjlee.com/2012/11/problems-viewing-health-reports-in.html

Hasta la próxima!,

Juan Manuel Herrera

No hay comentarios.: