Bird
Raised Fist0
Apache Airflowdevops~5 mins

Task failure callbacks in Apache Airflow - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Task failure callbacks
O(n)
Understanding Time Complexity

When Airflow runs tasks, it can call special functions if a task fails. Understanding how often these callbacks run helps us see how the system behaves as tasks increase.

We want to know how the work done by failure callbacks grows as the number of tasks grows.

Scenario Under Consideration

Analyze the time complexity of the following Airflow DAG snippet with failure callbacks.

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def on_failure_callback(context):
    print(f"Task {context['task_instance'].task_id} failed.")

def task_function():
    pass

dag = DAG('example_failure_callback', start_date=datetime(2024, 1, 1))

task1 = PythonOperator(
    task_id='task1',
    python_callable=task_function,
    on_failure_callback=on_failure_callback,
    dag=dag
)

task2 = PythonOperator(
    task_id='task2',
    python_callable=task_function,
    on_failure_callback=on_failure_callback,
    dag=dag
)

This code sets up two tasks in a DAG, each with a failure callback that runs if the task fails.

Identify Repeating Operations

Look at what repeats when tasks run and fail.

  • Primary operation: The failure callback function runs once per failed task.
  • How many times: At most once per task failure, so up to the number of tasks.
How Execution Grows With Input

As the number of tasks increases, the number of failure callbacks that might run grows in a straight line.

Input Size (n tasks)Approx. Failure Callback Runs
10Up to 10
100Up to 100
1000Up to 1000

Pattern observation: The number of failure callbacks grows directly with the number of tasks.

Final Time Complexity

Time Complexity: O(n)

This means the work done by failure callbacks grows linearly with the number of tasks that fail.

Common Mistake

[X] Wrong: "Failure callbacks run once for the whole DAG regardless of how many tasks fail."

[OK] Correct: Each task can fail independently, so each failure triggers its own callback. The callbacks add up with more failing tasks.

Interview Connect

Knowing how failure callbacks scale helps you design reliable workflows. It shows you how extra work grows as your DAG grows, which is useful for real projects and discussions.

Self-Check

"What if the failure callback triggers another task that also has a failure callback? How would the time complexity change?"

Practice

(1/5)
1. What is the main purpose of on_failure_callback in an Airflow task?
easy
A. To run a function automatically when the task fails
B. To schedule the task to run at a specific time
C. To retry the task multiple times on failure
D. To log the task's successful completion

Solution

  1. Step 1: Understand the role of on_failure_callback

    This parameter is designed to specify a function that runs automatically when a task fails.
  2. Step 2: Differentiate from other task features

    Scheduling and retries are handled by other parameters, not on_failure_callback.
  3. Final Answer:

    To run a function automatically when the task fails -> Option A
  4. Quick Check:

    Failure callback = automatic function on failure [OK]
Hint: Failure callback runs code only when task fails [OK]
Common Mistakes:
  • Confusing failure callback with scheduling
  • Thinking it retries the task automatically
  • Assuming it runs on task success
2. Which of the following is the correct way to assign a failure callback function named notify_failure to an Airflow task?
easy
A. task = PythonOperator(failure_callback=notify_failure, ...)
B. task = PythonOperator(on_failure_callback=notify_failure, ...)
C. task = PythonOperator(on_fail_callback=notify_failure, ...)
D. task = PythonOperator(callback_on_failure=notify_failure, ...)

Solution

  1. Step 1: Recall the exact parameter name

    The correct parameter to assign a failure callback is on_failure_callback.
  2. Step 2: Match the parameter with the options

    Only task = PythonOperator(on_failure_callback=notify_failure, ...) uses on_failure_callback correctly.
  3. Final Answer:

    task = PythonOperator(on_failure_callback=notify_failure, ...) -> Option B
  4. Quick Check:

    Correct parameter name = on_failure_callback [OK]
Hint: Use exact parameter name: on_failure_callback [OK]
Common Mistakes:
  • Using incorrect parameter names like failure_callback
  • Swapping words in the parameter name
  • Misspelling the parameter
3. Given this code snippet, what will be printed if the task fails?
def alert(context):
    print(f"Task {context['task_instance'].task_id} failed")

task = PythonOperator(
    task_id='my_task',
    python_callable=lambda: 1/0,
    on_failure_callback=alert
)
medium
A. Task succeeded
B. ZeroDivisionError
C. No output, task succeeds
D. Task my_task failed

Solution

  1. Step 1: Analyze the task's python_callable

    The lambda divides 1 by 0, causing a failure (ZeroDivisionError).
  2. Step 2: Understand the failure callback behavior

    On failure, the alert function runs and prints the failure message with the task ID.
  3. Final Answer:

    Task my_task failed -> Option D
  4. Quick Check:

    Failure triggers alert print [OK]
Hint: Failure triggers callback print message [OK]
Common Mistakes:
  • Expecting ZeroDivisionError to print directly
  • Thinking task succeeds despite error
  • Ignoring the callback print output
4. You wrote this failure callback function:
def fail_alert():
    print("Task failed")

task = PythonOperator(
    task_id='fail_task',
    python_callable=lambda: 1/0,
    on_failure_callback=fail_alert
)

Why does the callback not run when the task fails?
medium
A. The callback function must be decorated with @task
B. The callback function must return a value
C. The callback function must accept a context parameter
D. The callback function must be async

Solution

  1. Step 1: Check callback function signature

    Failure callbacks receive a context dictionary argument; missing it causes errors.
  2. Step 2: Understand Airflow callback requirements

    The callback must accept one parameter (context) to work properly.
  3. Final Answer:

    The callback function must accept a context parameter -> Option C
  4. Quick Check:

    Callback needs context argument [OK]
Hint: Callback must accept context argument [OK]
Common Mistakes:
  • Defining callback without parameters
  • Expecting return value from callback
  • Making callback async unnecessarily
5. You want to send an email alert only when a task fails and the failure reason contains the word "timeout". How should you implement the on_failure_callback function?
hard
A. Define a function that checks context['exception'] for 'timeout' and sends email if true
B. Define a function that always sends email regardless of failure reason
C. Use on_failure_callback to retry the task on timeout
D. Set on_failure_callback to None and handle alerts elsewhere

Solution

  1. Step 1: Understand the requirement

    Send email only if failure reason contains "timeout".
  2. Step 2: Use context to check exception message

    The failure callback receives context with exception info; check if 'timeout' is in the exception string.
  3. Step 3: Send email conditionally

    Send email alert only if the condition is met inside the callback function.
  4. Final Answer:

    Define a function that checks context['exception'] for 'timeout' and sends email if true -> Option A
  5. Quick Check:

    Check exception text in callback before alert [OK]
Hint: Check exception text in callback before alert [OK]
Common Mistakes:
  • Sending email on all failures without filtering
  • Trying to retry task in failure callback
  • Ignoring exception details in context
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard