diff options
author | sgiehl <stefan@matomo.org> | 2020-03-16 15:12:52 +0300 |
---|---|---|
committer | sgiehl <stefan@matomo.org> | 2020-03-16 17:24:12 +0300 |
commit | e493fee87c983e02001a7d9438cefe58141a38af (patch) | |
tree | 6c8f97e69b7cac83f9bb0b670d658e4c871d4d79 /plugins/Live | |
parent | f8c78e5f5f5c63ef660e1bb36fa059b59a1f7976 (diff) | |
parent | 7c1d70583ba18a5ec34b691bc7ca0862b8db17a1 (diff) |
Merge branch '3.x-dev' into 4.x-dev
Diffstat (limited to 'plugins/Live')
-rw-r--r-- | plugins/Live/Model.php | 89 | ||||
-rw-r--r-- | plugins/Live/tests/Integration/ModelTest.php | 11 |
2 files changed, 38 insertions, 62 deletions
diff --git a/plugins/Live/Model.php b/plugins/Live/Model.php index 89c32d2b12..fe167fcf33 100644 --- a/plugins/Live/Model.php +++ b/plugins/Live/Model.php @@ -16,6 +16,7 @@ use Piwik\Config; use Piwik\Container\StaticContainer; use Piwik\Date; use Piwik\Db; +use Piwik\DbHelper; use Piwik\Period; use Piwik\Period\Range; use Piwik\Piwik; @@ -121,7 +122,7 @@ class Model try { $visits = $readerDb->fetchAll($sql, $bind); } catch (Exception $e) { - $this->handleMaxExecutionTimeError($readerDb, $e, $sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit); + $this->handleMaxExecutionTimeError($readerDb, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, ['sql' => $sql, 'bind' => $bind,]); throw $e; } return $visits; @@ -130,17 +131,16 @@ class Model /** * @param \Piwik\Tracker\Db|\Piwik\Db\AdapterInterface|\Piwik\Db $readerDb * @param Exception $e - * @param $sql - * @param array $bind * @param $segment * @param $dateStart * @param $dateEnd * @param $minTimestamp * @param $limit + * @param $parameters * * @throws MaxExecutionTimeExceededException */ - public function handleMaxExecutionTimeError($readerDb, $e, $sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit) + public static function handleMaxExecutionTimeError($readerDb, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, $parameters) { // we also need to check for the 'maximum statement execution time exceeded' text as the query might be // aborted at different stages and we can't really know all the possible codes at which it may be aborted etc @@ -148,39 +148,41 @@ class Model || $readerDb->isErrNo($e, DbMigration::ERROR_CODE_MAX_EXECUTION_TIME_EXCEEDED_SORT_ABORTED) || strpos($e->getMessage(), 'maximum statement execution time exceeded') !== false; - if ($isMaxExecutionTimeError) { - $message = ''; + if (false === $isMaxExecutionTimeError) { + return; + } + + $message = ''; - if ($this->isLookingAtMoreThanOneDay($dateStart, $dateEnd, $minTimestamp)) { - $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonDateRange'); - } + if (self::isLookingAtMoreThanOneDay($dateStart, $dateEnd, $minTimestamp)) { + $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonDateRange'); + } - if (!empty($segment)) { - $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonSegment'); - } + if (!empty($segment)) { + $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonSegment'); + } - $limitThatCannotBeSelectedInUiButOnlyApi = 550; - if ($limit > $limitThatCannotBeSelectedInUiButOnlyApi) { - $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededLimit'); - } + $limitThatCannotBeSelectedInUiButOnlyApi = 550; + if ($limit > $limitThatCannotBeSelectedInUiButOnlyApi) { + $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededLimit'); + } - if (empty($message)) { - $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonUnknown'); - } + if (empty($message)) { + $message .= ' ' . Piwik::translate('Live_QueryMaxExecutionTimeExceededReasonUnknown'); + } - $message = Piwik::translate('Live_QueryMaxExecutionTimeExceeded') . ' ' . $message; + $message = Piwik::translate('Live_QueryMaxExecutionTimeExceeded') . ' ' . $message; - $params = array( - 'sql' => $sql, 'bind' => $bind, 'segment' => $segment, 'limit' => $limit - ); + $params = array_merge($parameters, [ + 'segment' => $segment, 'limit' => $limit + ]); - /** - * @ignore - * @internal - */ - Piwik::postEvent('Live.queryMaxExecutionTimeExceeded', array($params)); - throw new MaxExecutionTimeExceededException($message); - } + /** + * @ignore + * @internal + */ + Piwik::postEvent('Live.queryMaxExecutionTimeExceeded', array($params)); + throw new MaxExecutionTimeExceededException($message); } /** @@ -190,7 +192,7 @@ class Model * @return bool * @throws Exception */ - public function isLookingAtMoreThanOneDay($dateStart, $dateEnd, $minTimestamp) + public static function isLookingAtMoreThanOneDay($dateStart, $dateEnd, $minTimestamp) { if (!$dateStart) { if (!$minTimestamp) { @@ -493,35 +495,14 @@ class Model $bind = $innerQuery['bind']; - $maxExecutionTimeHint = $this->getMaxExecutionTimeMySQLHint(); - if ($visitorId) { + if (!$visitorId) { // for now let's not apply when looking for a specific visitor - $maxExecutionTimeHint = ''; - } - if ($maxExecutionTimeHint) { - $innerQuery['sql'] = trim($innerQuery['sql']); - $pos = stripos($innerQuery['sql'], 'SELECT'); - if ($pos !== false) { - $innerQuery['sql'] = substr_replace($innerQuery['sql'], 'SELECT ' . $maxExecutionTimeHint, $pos, strlen('SELECT')); - } + $innerQuery['sql'] = DbHelper::addMaxExecutionTimeHintToQuery($innerQuery['sql'], Config::getInstance()->General['live_query_max_execution_time']); } return array($innerQuery['sql'], $bind); } - private function getMaxExecutionTimeMySQLHint() - { - $general = Config::getInstance()->General; - $maxExecutionTime = $general['live_query_max_execution_time']; - $maxExecutionTimeHint = ''; - if (is_numeric($maxExecutionTime) && $maxExecutionTime > 0) { - $timeInMs = $maxExecutionTime * 1000; - $timeInMs = (int) $timeInMs; - $maxExecutionTimeHint = ' /*+ MAX_EXECUTION_TIME('.$timeInMs.') */ '; - } - return $maxExecutionTimeHint; - } - /** * @param $idSite * @return Site diff --git a/plugins/Live/tests/Integration/ModelTest.php b/plugins/Live/tests/Integration/ModelTest.php index ea2b104732..d66872e44d 100644 --- a/plugins/Live/tests/Integration/ModelTest.php +++ b/plugins/Live/tests/Integration/ModelTest.php @@ -82,8 +82,7 @@ class ModelTest extends IntegrationTestCase $dateEnd = Date::now(); $minTimestamp = 1; $limit = 50; - $model = new Model(); - $model->handleMaxExecutionTimeError($db, $e, $sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit); + Model::handleMaxExecutionTimeError($db, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, [$sql, $bind]); $this->assertTrue(true); } @@ -101,8 +100,7 @@ class ModelTest extends IntegrationTestCase $dateEnd = Date::now(); $minTimestamp = null; $limit = 50; - $model = new Model(); - $model->handleMaxExecutionTimeError($db, $e, $sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit); + Model::handleMaxExecutionTimeError($db, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, [$sql, $bind]); } public function test_handleMaxExecutionTimeError_whenTimeIsExceeded_manyReasonsFound() @@ -112,15 +110,12 @@ class ModelTest extends IntegrationTestCase $db = Db::get(); $e = new \Exception('Query execution was interrupted, maximum statement execution time exceeded'); - $sql = 'SELECT 1'; - $bind = array(); $segment = 'userId>=1'; $dateStart = Date::now()->subDay(10); $dateEnd = Date::now(); $minTimestamp = null; $limit = 5000; - $model = new Model(); - $model->handleMaxExecutionTimeError($db, $e, $sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit); + Model::handleMaxExecutionTimeError($db, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, ['param' => 'value']); } public function test_getStandAndEndDate() |