void CRURefreshTaskExecutor::UpdateRootMVStatistics(TInt32 currDuration) { CRURefreshTask &task = *GetRefreshTask(); if (FALSE == task.NeedToExecuteInternalRefresh()) { return; } CRUDeltaDefList &deltaDefList = task.GetDeltaDefList(); TInt32 prevDuration, nextDuration; CRUMV &rootMV = GetRootMV(); if (TRUE == IsRecompute()) { prevDuration = rootMV.GetRecomputeDurationEstimate(); nextDuration = EvaluateHeuristic(currDuration, prevDuration); rootMV.SetRecomputeDurationEstimate(nextDuration); return; } switch(deltaDefList.GetCount()) { case 0: { // This cannot happen // (NeedToExecuteInternalRefresh() must have returned FALSE). RUASSERT(FALSE); } case 1: { CRUDeltaDef *pDdef = deltaDefList.GetAt(0); // A special case: update the refresh duration, // and (optionally) the delta size. UpdateSingleDeltaStatistics(pDdef, currDuration); break; } case 2: { prevDuration = rootMV.GetRefreshDurationEstimateWith_2_Deltas(); nextDuration = EvaluateHeuristic(currDuration, prevDuration); rootMV.SetRefreshDurationEstimateWith_2_Deltas(nextDuration); break; } case 3: { prevDuration = rootMV.GetRefreshDurationEstimateWith_3_Deltas(); nextDuration = EvaluateHeuristic(currDuration, prevDuration); rootMV.SetRefreshDurationEstimateWith_3_Deltas(nextDuration); break; } default: { prevDuration = rootMV.GetRefreshDurationEstimateWith_N_Deltas(); nextDuration = EvaluateHeuristic(currDuration, prevDuration); rootMV.SetRefreshDurationEstimateWith_N_Deltas(nextDuration); break; } } }
void CRUUnAuditRefreshTaskExecutor::Prologue() { TESTPOINT2(CRUGlobals::TESTPOINT101, GetRootMVName()); BeginTransaction(); if (CDDObject::eON_STATEMENT == GetRootMVType()) { PrologueHandleOnStatementMV(); } // Set the MV non-available etc ... SetObjectsUnavailable(); CommitTransaction(); TESTPOINT2(CRUGlobals::TESTPOINT102, GetRootMVName()); if (TRUE == isPurgedata_) { SetState(EX_PURGE_DATA); } else if (TRUE == IsRecompute()) { SetState(EX_RECOMPUTE); } else { SetState(EX_REFRESH); } }
void CRURefreshTaskExecutor::FinalMetadataUpdate() { CRURefreshTask *pParentTask = GetRefreshTask(); RUASSERT (NULL != pParentTask); TInt32 currDuration = 0; TInt64 ts = CalculateTimeStamp(); if (TRUE == pParentTask->NeedToExecuteInternalRefresh()) { currDuration = GetTimerDuration(); } CRUMV *pPrevMV, *pCurrMV = NULL; CRUMVList &mvList = pParentTask->GetMVList(); DSListPosition pos = mvList.GetHeadPosition(); while (NULL != pos) { pPrevMV = pCurrMV; pCurrMV = mvList.GetNext(pos); // Update the MV's REFRESHED_AT timestamp pCurrMV->SetTimestamp(ts); // publish the refresh event to the PUBLISH table NABoolean isRecomputePublish = (IsRecompute() == TRUE); pCurrMV->PublishMVRefresh(isRecomputePublish); if (CDDObject::eON_STATEMENT != pCurrMV->GetRefreshType()) { if (NULL == pPrevMV) { // This is the Root MV (the first in the list) if (CDDObject::eON_REQUEST == pCurrMV->GetRefreshType()) { // For every table T used by MV, // set MV.EPOCH[T]<--T.CURRENT_EPOCH. UpdateRootMVCurrentEpochVector(); } UpdateRootMVStatistics(currDuration); } else { UpdateNonRootMVStatistics(pCurrMV, pPrevMV, currDuration); } } pCurrMV->SaveMetadata(); } if (CDDObject::eON_STATEMENT != GetRootMV().GetRefreshType()) { IncrementTopMvCurrentEpoch(); } }
void CRUAuditRefreshTaskExecutor::RemoteStart() { BeginTransaction(); if (FALSE == StartTableLockProtocol() ) { SetState(EX_REMOTE_END); return; } if (TRUE == IsRecompute()) { SetState(EX_RECOMPUTE); } else { SetState(EX_REFRESH); } }