Page MenuHomePhabricator

Improve resolution behaviors of FutureProxy
ClosedPublic

Authored by epriestley on Jul 1 2020, 12:23 PM.
Tags
None
Referenced Files
Unknown Object (File)
Thu, Mar 21, 12:28 AM
Unknown Object (File)
Feb 1 2024, 11:30 PM
Unknown Object (File)
Jan 11 2024, 10:10 PM
Unknown Object (File)
Dec 27 2023, 1:30 PM
Unknown Object (File)
Dec 27 2023, 1:30 PM
Unknown Object (File)
Dec 27 2023, 1:30 PM
Unknown Object (File)
Dec 27 2023, 1:30 PM
Unknown Object (File)
Dec 22 2023, 3:10 AM
Subscribers
None

Details

Summary

See PHI1764. See PHI1802. Address two resolution behaviors for FutureProxy:

  • FutureProxy may throw an exception directly from iteration via "FutureIterator" (see PHI1764). This is wrong: futures should throw only when resolved.
  • FutureProxy can not change an exception into a result, or a result into an exception, or an exception into a different exception. Being able to proxy the full range of result and exception behavior is useful, particularly for Conduit (see PHI1802).

Make "FutureProxy" more robust in how it handles exceptions from proxied futures.

Test Plan

Used this script to raise an exception during result processing:

<?php

require_once 'support/init/init-script.php';

final class ThrowingFutureProxy
  extends FutureProxy {

  protected function didReceiveResult($result) {
    throw new Exception('!');
  }

}

$future = new ImmediateFuture('quack');
$proxy = new ThrowingFutureProxy($future);
$iterator = new FutureIterator(array($proxy));

foreach ($iterator as $resolved) {
  try {
    $resolved->resolve();
  } catch (Exception $ex) {
    echo "Caught exception properly on resolution.\n";
  }
}

Before this change, the exception is raised in the foreach() loop. After this change, the exception is raised at resolution time.

Diff Detail

Repository
rARC Arcanist
Branch
future2
Lint
Lint Passed
Unit
Tests Passed
Build Status
Buildable 24717
Build 34085: Run Core Tests
Build 34084: arc lint + arc unit