phacility/phabricator · error · Exception
Synchronization of parent task from Asana failed!
Error message
Synchronization of parent task from Asana failed!
What it means
Before updating the main (parent) Asana task, the worker imports it through DoorkeeperImportEngine and inspects the returned ref. If ref->getSyncFailed() is true — the import engine could not pull the task from the Asana API — this plain Exception is thrown. Because it is a generic Exception rather than a permanent-failure exception, the task queue treats it as a temporary fault and retries the worker later with backoff.
Source
Thrown at src/applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php:132
$projects = $this->getAsanaProjectIDs();
$extra_data = array();
if ($main_edge) {
$extra_data = $main_edge['data'];
$refs = id(new DoorkeeperImportEngine())
->setViewer($possessed_user)
->withPHIDs(array($main_edge['dst']))
->execute();
$parent_ref = head($refs);
if (!$parent_ref) {
throw new PhabricatorWorkerPermanentFailureException(
pht('%s could not be loaded.', 'DoorkeeperExternalObject'));
}
if ($parent_ref->getSyncFailed()) {
throw new Exception(
pht('Synchronization of parent task from Asana failed!'));
} else if (!$parent_ref->getIsVisible()) {
$this->log(
"%s\n",
pht('Skipping main task update, object is no longer visible.'));
$extra_data['gone'] = true;
} else {
$edge_cursor = idx($main_edge['data'], 'cursor', 0);
// TODO: This probably breaks, very rarely, on 32-bit systems.
if ($edge_cursor <= $story->getChronologicalKey()) {
$this->log("%s\n", pht('Updating main task.'));
$task_id = $parent_ref->getObjectID();
$this->makeAsanaAPICall(
$oauth_token,
'tasks/'.$parent_ref->getObjectID(),
'PUT',View on GitHub (pinned to 5720a38cfe)
Solutions
- Inspect the daemon log for the underlying Asana API error (`bin/phd log` / daemons console)
- If the Asana side is transiently failing, let the worker retry; it re-runs with backoff
- If it keeps failing, have related users re-link Asana accounts (see error 530)
- As a last resort for a poisoned story, restart the task queue worker to force a fresh attempt
Defensive patterns
Strategy: retry
Try / catch
// In custom worker scaffolding, let plain Exceptions bubble so the queue retries:
try {
$this->publishToAsana();
} catch (PhabricatorWorkerPermanentFailureException $ex) {
// Permanent: log and stop.
phlog($ex);
throw $ex;
}
// Any other Exception is retried automatically by the worker infrastructure. Prevention
- Rely on worker retries for transient Asana API errors; do not convert them to permanent failures
- Monitor daemon logs to distinguish rate limiting (retry) from token problems (re-link)
- Keep the number of mirrored objects modest to stay under Asana rate limits
When it happens
Trigger: The Asana API request backing the import of the parent task fails: transient 5xx/network errors, rate limiting, an inaccessible workspace, or credentials that fail mid-sync (distinct from the pre-flight token check that produces error 530).
Common situations: Asana outage or throttling while a documentation/maniphest story is being mirrored; expired-ish tokens that pass the cached pre-flight but fail the actual fetch; large syncs hitting rate limits.
Related errors
- Synchronization of child task from Asana failed!
- No related users have linked Asana accounts.
- Unable to find any Asana user with valid credentials to pull
- %s has no visible object on the other side; this likely indi
- No Asana provider configured.
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/c7efff26c4322331.
Report an issue: GitHub.