1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 14:52:40 +01:00

Resolve diff property updates in parallel

Summary:
I was thinking about creating a method `differential.setdiffproperties` updating all properties at once or adding 'properties' to `differential.creatediff` (better) but it will require bumping Conduit version.

This looks simpler and with similar effect.
We could postpone resolving properties more but I don't want to risk not resolving them after an error.

Test Plan:
This diff for that it works.
Benchmark: 0.55 s before, 0.25 s after (with three properties, the difference will be bigger with more).

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D3689
This commit is contained in:
vrana 2012-10-12 15:01:19 -07:00
parent 646b37a343
commit 3d00e0448d

View file

@ -38,6 +38,7 @@ final class ArcanistDiffWorkflow extends ArcanistBaseWorkflow {
private $revisionID; private $revisionID;
private $postponedLinters; private $postponedLinters;
private $haveUncommittedChanges = false; private $haveUncommittedChanges = false;
private $diffPropertyFutures = array();
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
@ -459,6 +460,7 @@ EOTEXT
$this->updateLintDiffProperty(); $this->updateLintDiffProperty();
$this->updateUnitDiffProperty(); $this->updateUnitDiffProperty();
$this->updateLocalDiffProperty(); $this->updateLocalDiffProperty();
$this->resolveDiffPropertyUpdates();
$output_json = $this->getArgument('json'); $output_json = $this->getArgument('json');
@ -499,10 +501,9 @@ EOTEXT
$revision = $this->dispatchWillCreateRevisionEvent($revision); $revision = $this->dispatchWillCreateRevisionEvent($revision);
$future = $conduit->callMethod( $result = $conduit->callMethodSynchronous(
'differential.createrevision', 'differential.createrevision',
$revision); $revision);
$result = $future->resolve();
$revised_message = $conduit->callMethodSynchronous( $revised_message = $conduit->callMethodSynchronous(
'differential.getcommitmessage', 'differential.getcommitmessage',
@ -2292,7 +2293,7 @@ EOTEXT
* @task diffprop * @task diffprop
*/ */
private function updateDiffProperty($name, $data) { private function updateDiffProperty($name, $data) {
$this->getConduit()->callMethodSynchronous( $this->diffPropertyFutures[] = $this->getConduit()->callMethod(
'differential.setdiffproperty', 'differential.setdiffproperty',
array( array(
'diff_id' => $this->getDiffID(), 'diff_id' => $this->getDiffID(),
@ -2301,6 +2302,18 @@ EOTEXT
)); ));
} }
/**
* Wait for finishing all diff property updates.
*
* @return void
*
* @task diffprop
*/
private function resolveDiffPropertyUpdates() {
Futures($this->diffPropertyFutures)->resolveAll();
$this->diffPropertyFutures = array();
}
private function dispatchWillCreateRevisionEvent(array $fields) { private function dispatchWillCreateRevisionEvent(array $fields) {
$event = $this->dispatchEvent( $event = $this->dispatchEvent(
ArcanistEventType::TYPE_REVISION_WILLCREATEREVISION, ArcanistEventType::TYPE_REVISION_WILLCREATEREVISION,