Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15467725
D16575.id39896.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
D16575.id39896.diff
View Options
diff --git a/resources/sql/autopatches/20160919.repo.messagecount.sql b/resources/sql/autopatches/20160919.repo.messagecount.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20160919.repo.messagecount.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_repository.repository_statusmessage
+ ADD messageCount INT UNSIGNED NOT NULL;
diff --git a/src/applications/diffusion/management/DiffusionRepositoryStatusManagementPanel.php b/src/applications/diffusion/management/DiffusionRepositoryStatusManagementPanel.php
--- a/src/applications/diffusion/management/DiffusionRepositoryStatusManagementPanel.php
+++ b/src/applications/diffusion/management/DiffusionRepositoryStatusManagementPanel.php
@@ -359,20 +359,13 @@
return $view;
}
break;
- case PhabricatorRepositoryStatusMessage::CODE_WORKING:
+ default:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green')
->setTarget(pht('Initializing Working Copy'))
->setNote(pht('Daemons are initializing the working copy.')));
return $view;
- default:
- $view->addItem(
- id(new PHUIStatusItemView())
- ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
- ->setTarget(pht('Unknown Init Status'))
- ->setNote($message->getStatusCode()));
- return $view;
}
} else {
$view->addItem(
diff --git a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
--- a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
+++ b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php
@@ -172,8 +172,6 @@
}
private function logPull($message) {
- $code_working = PhabricatorRepositoryStatusMessage::CODE_WORKING;
- $this->updateRepositoryInitStatus($code_working, $message);
$this->log('%s', $message);
}
diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php
--- a/src/applications/repository/storage/PhabricatorRepository.php
+++ b/src/applications/repository/storage/PhabricatorRepository.php
@@ -1649,21 +1649,33 @@
$this->getID(),
$status_type);
} else {
+ // If the existing message has the same code (e.g., we just hit an
+ // error and also previously hit an error) we increment the message
+ // count by 1. This allows us to determine how many times in a row
+ // we've run into an error.
+
queryfx(
$conn_w,
'INSERT INTO %T
- (repositoryID, statusType, statusCode, parameters, epoch)
- VALUES (%d, %s, %s, %s, %d)
+ (repositoryID, statusType, statusCode, parameters, epoch,
+ messageCount)
+ VALUES (%d, %s, %s, %s, %d, %d)
ON DUPLICATE KEY UPDATE
statusCode = VALUES(statusCode),
parameters = VALUES(parameters),
- epoch = VALUES(epoch)',
+ epoch = VALUES(epoch),
+ messageCount =
+ IF(
+ statusCode = VALUES(statusCode),
+ messageCount + 1,
+ VALUES(messageCount))',
$table_name,
$this->getID(),
$status_type,
$status_code,
json_encode($parameters),
- time());
+ time(),
+ 1);
}
return $this;
@@ -1738,6 +1750,33 @@
* @return int Repository update interval, in seconds.
*/
public function loadUpdateInterval($minimum = 15) {
+ // First, check if we've hit errors recently. If we have, wait one period
+ // for each consecutive error. Normally, this corresponds to a backoff of
+ // 15s, 30s, 45s, etc.
+
+ $message_table = new PhabricatorRepositoryStatusMessage();
+ $conn = $message_table->establishConnection('r');
+ $error_count = queryfx_one(
+ $conn,
+ 'SELECT MAX(messageCount) error_count FROM %T
+ WHERE repositoryID = %d
+ AND statusType IN (%Ls)
+ AND statusCode IN (%Ls)',
+ $message_table->getTableName(),
+ $this->getID(),
+ array(
+ PhabricatorRepositoryStatusMessage::TYPE_INIT,
+ PhabricatorRepositoryStatusMessage::TYPE_FETCH,
+ ),
+ array(
+ PhabricatorRepositoryStatusMessage::CODE_ERROR,
+ ));
+
+ $error_count = (int)$error_count['error_count'];
+ if ($error_count > 0) {
+ return (int)($minimum * $error_count);
+ }
+
// If a repository is still importing, always pull it as frequently as
// possible. This prevents us from hanging for a long time at 99.9% when
// importing an inactive repository.
@@ -1758,31 +1797,34 @@
$window_start);
if ($last_commit) {
$time_since_commit = ($window_start - $last_commit['epoch']);
+ } else {
+ // If the repository has no commits, treat the creation date as
+ // though it were the date of the last commit. This makes empty
+ // repositories update quickly at first but slow down over time
+ // if they don't see any activity.
+ $time_since_commit = ($window_start - $this->getDateCreated());
+ }
- $last_few_days = phutil_units('3 days in seconds');
-
- if ($time_since_commit <= $last_few_days) {
- // For repositories with activity in the recent past, we wait one
- // extra second for every 10 minutes since the last commit. This
- // shorter backoff is intended to handle weekends and other short
- // breaks from development.
- $smart_wait = ($time_since_commit / 600);
- } else {
- // For repositories without recent activity, we wait one extra second
- // for every 4 minutes since the last commit. This longer backoff
- // handles rarely used repositories, up to the maximum.
- $smart_wait = ($time_since_commit / 240);
- }
-
- // We'll never wait more than 6 hours to pull a repository.
- $longest_wait = phutil_units('6 hours in seconds');
- $smart_wait = min($smart_wait, $longest_wait);
+ $last_few_days = phutil_units('3 days in seconds');
- $smart_wait = max($minimum, $smart_wait);
+ if ($time_since_commit <= $last_few_days) {
+ // For repositories with activity in the recent past, we wait one
+ // extra second for every 10 minutes since the last commit. This
+ // shorter backoff is intended to handle weekends and other short
+ // breaks from development.
+ $smart_wait = ($time_since_commit / 600);
} else {
- $smart_wait = $minimum;
+ // For repositories without recent activity, we wait one extra second
+ // for every 4 minutes since the last commit. This longer backoff
+ // handles rarely used repositories, up to the maximum.
+ $smart_wait = ($time_since_commit / 240);
}
+ // We'll never wait more than 6 hours to pull a repository.
+ $longest_wait = phutil_units('6 hours in seconds');
+ $smart_wait = min($smart_wait, $longest_wait);
+ $smart_wait = max($minimum, $smart_wait);
+
return (int)$smart_wait;
}
diff --git a/src/applications/repository/storage/PhabricatorRepositoryStatusMessage.php b/src/applications/repository/storage/PhabricatorRepositoryStatusMessage.php
--- a/src/applications/repository/storage/PhabricatorRepositoryStatusMessage.php
+++ b/src/applications/repository/storage/PhabricatorRepositoryStatusMessage.php
@@ -8,7 +8,6 @@
const TYPE_NEEDS_UPDATE = 'needs-update';
const CODE_ERROR = 'error';
- const CODE_WORKING = 'working';
const CODE_OKAY = 'okay';
protected $repositoryID;
@@ -16,6 +15,7 @@
protected $statusCode;
protected $parameters = array();
protected $epoch;
+ protected $messageCount;
protected function getConfiguration() {
return array(
@@ -26,6 +26,7 @@
self::CONFIG_COLUMN_SCHEMA => array(
'statusType' => 'text32',
'statusCode' => 'text32',
+ 'messageCount' => 'uint32',
),
self::CONFIG_KEY_SCHEMA => array(
'repositoryID' => array(
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 4, 5:33 PM (6 d, 17 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7225996
Default Alt Text
D16575.id39896.diff (8 KB)
Attached To
Mode
D16575: When repositories hit pull errors, stop updating them as frequently
Attached
Detach File
Event Timeline
Log In to Comment