Optimized memory usage when auditing large volumes of CIs (10'000 items was requiring 200 Mb, it now runs with 32 Mb -including the 30Mb overhead!)

SVN:1.2[1795]
This commit is contained in:
Romain Quetiez
2012-01-20 15:03:07 +00:00
parent 3635e60850
commit c539f19ce9

View File

@@ -83,7 +83,7 @@ function FilterByContext(DBObjectSearch &$oFilter, ApplicationContext $oAppConte
} }
} }
function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext) function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
{ {
$oRule = MetaModel::GetObject('AuditRule', $iRuleId); $oRule = MetaModel::GetObject('AuditRule', $iRuleId);
$sOql = $oRule->Get('query'); $sOql = $oRule->Get('query');
@@ -95,23 +95,36 @@ function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
// The query returns directly the invalid elements // The query returns directly the invalid elements
$oFilter = $oRuleFilter; $oFilter = $oRuleFilter;
$oFilter->MergeWith($oDefinitionFilter); $oFilter->MergeWith($oDefinitionFilter);
$oErrorObjectSet = new CMDBObjectSet($oFilter);
} }
else else
{ {
// The query returns only the valid elements, all the others are invalid // The query returns only the valid elements, all the others are invalid
$oFilter = $oRuleFilter; $aValidRows = $oRuleFilter->ToDataArray(array('id'));
$oErrorObjectSet = new CMDBObjectSet($oFilter); $aValidIds = array();
$aValidIds = array(0); // Make sure that we have at least one value in the list foreach($aValidRows as $aRow)
while($oObj = $oErrorObjectSet->Fetch())
{ {
$aValidIds[] = $oObj->GetKey(); $aValidIds[] = $aRow['id'];
} }
$oFilter = clone $oDefinitionFilter; $oFilter = clone $oDefinitionFilter;
$oFilter->AddCondition('id', $aValidIds, 'NOTIN'); if (count($aValidIds) > 0)
$oErrorObjectSet = new CMDBObjectSet($oFilter); {
$aInDefSet = array();
foreach($oDefinitionFilter->ToDataArray(array('id')) as $aRow)
{
$aInDefSet[] = $aRow['id'];
}
$aInvalids = array_diff($aInDefSet, $aValidIds);
if (count($aInvalids) > 0)
{
$oFilter->AddCondition('id', $aInvalids, 'IN');
}
else
{
$oFilter->AddCondition('id', 0, '=');
}
}
} }
return $oErrorObjectSet; return $oFilter;
} }
function GetReportColor($iTotal, $iErrors) function GetReportColor($iTotal, $iErrors)
@@ -153,7 +166,8 @@ try
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set')); $oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
FilterByContext($oDefinitionFilter, $oAppContext); FilterByContext($oDefinitionFilter, $oAppContext);
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter); $oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
$oErrorObjectSet = GetRuleResultSet($iRuleIndex, $oDefinitionFilter, $oAppContext); $oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
$oErrorObjectSet = new CMDBObjectSet($oFilter);
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex); $oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>'); $oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>'); $oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
@@ -211,12 +225,12 @@ try
{ {
try try
{ {
$oRuleFilter = DBObjectSearch::FromOQL($oAuditRule->Get('query')); $oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
$oErrorObjectSet = GetRuleResultSet($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext); $aErrors = $oFilter->ToDataArray(array('id'));
$iErrorsCount = $oErrorObjectSet->Count(); $iErrorsCount = count($aErrors);
while($oObj = $oErrorObjectSet->Fetch()) foreach($aErrors as $aErrorRow)
{ {
$aObjectsWithErrors[$oObj->GetKey()] = true; $aObjectsWithErrors[$aErrorRow['id']] = true;
} }
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>"; $aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount)); $aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
@@ -229,7 +243,7 @@ try
$aRow['class'] = 'red'; $aRow['class'] = 'red';
$sMessage = Dict::Format('UI:Audit:ErrorIn_Rule_Reason', $oAuditRule->GetHyperlink(), $e->getMessage()); $sMessage = Dict::Format('UI:Audit:ErrorIn_Rule_Reason', $oAuditRule->GetHyperlink(), $e->getMessage());
$oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/>&nbsp;".$sMessage); $oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/>&nbsp;".$sMessage);
} }
} }
$aResults[] = $aRow; $aResults[] = $aRow;
$iTotalErrors = count($aObjectsWithErrors); $iTotalErrors = count($aObjectsWithErrors);
@@ -263,7 +277,6 @@ try
$oP->add("</td></tr>\n"); $oP->add("</td></tr>\n");
$oP->add("</table>\n"); $oP->add("</table>\n");
} }
$oP->output(); $oP->output();
} }
catch(CoreException $e) catch(CoreException $e)