Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsgiehl <stefan@matomo.org>2020-03-16 15:12:52 +0300
committersgiehl <stefan@matomo.org>2020-03-16 17:24:12 +0300
commite493fee87c983e02001a7d9438cefe58141a38af (patch)
tree6c8f97e69b7cac83f9bb0b670d658e4c871d4d79 /plugins/Live
parentf8c78e5f5f5c63ef660e1bb36fa059b59a1f7976 (diff)
parent7c1d70583ba18a5ec34b691bc7ca0862b8db17a1 (diff)
Merge branch '3.x-dev' into 4.x-dev
Diffstat (limited to 'plugins/Live')
-rw-r--r--plugins/Live/Model.php89
-rw-r--r--plugins/Live/tests/Integration/ModelTest.php11
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()