Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Swap Dag Parsing to use the TaskSDK machinery. - #44972

Merged
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk
Dec 19, 2024
Merged

Swap Dag Parsing to use the TaskSDK machinery.#44972
ashb merged 2 commits into
apache:mainfrom
astronomer:dag-parsing-uses-task-sdk

Conversation

@ashb

@ashbashb commented Dec 16, 2024

Copy link
Copy Markdown
Member

As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.

This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in #44898 and the
"subprocess" machinery introduced in #44874.

Important Note: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.

Some key parts of this change:

  • It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
    nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
    This will be addressed before release (we have talked about introducing a
    new "apache-airflow-base-executor" dist where this subprocess+supervisor
    could live, as the "execution_time" folder in the Task SDK is more a feature
    of the executor, not of the TaskSDK itself)
  • A number of classes that we need to send between processes have been
    converted to Pydantic for ease of serialization.
  • In order to not have to serialize everything in the subprocess and deserialize everything
    in the parent Manager process, we have created a LazyDeserializedDAG class
    that provides lazy access to much of the properties needed to create update
    the DAG related DB objects, without needing to fully deserialize the entire
    DAG structure.
  • Classes switched to attrs based for less boilerplate in constructors.
  • Internal timers convert to time.monotonic where possible, and time.time
    where not, we only need second diff between two points, not datetime objects
  • With the earlier removal of "sync mode" for SQLite in Remove "single process" restrictions on SQLite in favour of using WAL mode #44839 the need for
    separate TERMIANTE and END messages over the control socket can go

Co-authored-by: Jed Cunningham 66968678+jedcunningham@users.noreply.github.com
Co-authored-by: Daniel Imberman daniel.imberman@gmail.com


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in newsfragments.

@ashbashb added area:Scheduler including HA (high availability) scheduler area:task-execution-interface-aip72 AIP-72: Task Execution Interface (TEI) aka Task SDK area:task-sdk labels Dec 16, 2024
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

The tests aren't 100% finished yet.

And this change is larger than I would have liked, but at least it's a net-negative change

@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 32176b9 to 1215213CompareDecember 16, 2024 23:29
Comment threadtests/listeners/test_dag_import_error_listener.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from 1215213 to 9f04c14CompareDecember 16, 2024 23:46
@ashb

ashb commented Dec 16, 2024

Copy link
Copy Markdown
MemberAuthor

I don't expect tests to pass yet, but I want to give people the chance to see this PR, and I know @jedcunningham is waiting on this for some of his DAG versioning work.

@kaxil

kaxil commented Dec 17, 2024

Copy link
Copy Markdown
Member

Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.

I think that is unavoidable, as user code will come from Task SDK

This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself)

Right, I think processor will have to depend on both Task SDK (user-facing code) + Base Executor dist -- after that separation

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review, will be coming back to it in an hour

Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/models/dagcode.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/manager.py
Comment threadairflow/callbacks/callback_requests.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadtests/dag_processing/test_manager.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 2 times, most recently from 93b8d53 to 553049eCompareDecember 17, 2024 15:56
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadairflow/serialization/serialized_objects.py Outdated
Comment threadtask_sdk/src/airflow/sdk/log.py

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mainly reviewed the processor and manager files. The other changes seem mostly reactive. Overall, I like the improvements, especially the reuse of the execution time machinery here. Few initial comments, nothing serious but mostly nits.


class DagFileProcessor(LoggingMixin):
@attrs.define()
class DagFileProcessorProcess(WatchedSubprocess):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sounds good

Comment threadairflow/dag_processing/processor.py
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
Comment threadairflow/serialization/serialized_objects.py
Comment threadairflow/dag_processing/manager.py Outdated
Comment threadtests/dag_processing/test_processor.py
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch 3 times, most recently from e61c595 to f6487c9CompareDecember 18, 2024 23:08
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

@ashb
ashb marked this pull request as ready for review December 18, 2024 23:09
@ashb

ashb commented Dec 18, 2024

Copy link
Copy Markdown
MemberAuthor

(I still need to rename a class and file, but that is a non-meaningful/non-review-impacting change.

@kaxilkaxil added the full tests needed We need to run full set of tests for this PR to merge label Dec 19, 2024
Comment threadairflow/dag_processing/collection.py
Comment threadairflow/serialization/serialized_objects.py
@kaxil

Copy link
Copy Markdown
Member

Right, I think this should now pass the tests, the only thing I'm not sure about this is the xfail I've put for the "simple ti roundtrip exec config tests" -- Either we should remove it or make it work, but I'm not sure if we need to pass down executor config via TI anymore

@kaxil Any ideas the best plan for that one?

Since we are planning to handle callbacks via Executor/worker interface too -- don't think we need to pass it explicitly from TI, instead just handle it on the server side before sending TI/request to the worker.

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor comments and the renaming of file & classes can happen in a separate PR too

Comment threadairflow/dag_processing/manager.py Outdated
Comment threadairflow/dag_processing/processor.py Outdated
@ashb

ashb commented Dec 19, 2024

Copy link
Copy Markdown
MemberAuthor

I'm going to run this with full tests, I want the kube tests to see if there is something broken not covered by unit tests

ashband others added 2 commits December 19, 2024 12:02
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMIANTE and END messages over the control socket can go.
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
@ashb
ashbforce-pushed the dag-parsing-uses-task-sdk branch from f6487c9 to b22af18CompareDecember 19, 2024 12:04
assert "a.py" in resp.import_errors


# @conf_vars({("logging", "dag_processor_log_target"): "stdout"})

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving these comments out for now as I want to overhaul the logging in #45072

@ashb
ashb merged commit 8774f28 into apache:mainDec 19, 2024
@ashb
ashb deleted the dag-parsing-uses-task-sdk branch December 19, 2024 14:19
got686-yandex pushed a commit to got686-yandex/airflow that referenced this pull request Jan 30, 2025
As part of Airflow 3 DAG definition files will have to use the Task SDK for
all their classes, and anything involving running user code will need to be
de-coupled from the database in the user-code process.
This change moves all of the "serialization" change up to the
DagFileProcessorManager, using the new function introduced in apache#44898 and the
"subprocess" machinery introduced in apache#44874.
**Important Note**: this change does not remove the ability for dag processes
to access the DB for Variables etc. That will come in a future change.
Some key parts of this change:
- It builds upon the WatchedSubprocess from the TaskSDK. Right now this puts a
nasty/unwanted depenednecy between the Dag Parsing code upon the TaskSDK.
This will be addressed before release (we have talked about introducing a
new "apache-airflow-base-executor" dist where this subprocess+supervisor
could live, as the "execution_time" folder in the Task SDK is more a feature
of the executor, not of the TaskSDK itself.)
- A number of classes that we need to send between processes have been
converted to Pydantic for ease of serialization.
- In order to not have to serialize everything in the subprocess and deserialize everything
in the parent Manager process, we have created a `LazyDeserializedDAG` class
that provides lazy access to much of the properties needed to create update
the DAG related DB objects, without needing to fully deserialize the entire
DAG structure.
- Classes switched to attrs based for less boilerplate in constructors.
- Internal timers convert to `time.monotonic` where possible, and `time.time`
where not, we only need second diff between two points, not datetime
objects.
- With the earlier removal of "sync mode" for SQLite in apache#44839 the need for
separate TERMINATE and END messages over the control socket can go.
---------
Co-authored-by: Jed Cunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Daniel Imberman <daniel.imberman@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:CLIarea:Schedulerincluding HA (high availability) schedulerarea:serializationarea:task-execution-interface-aip72AIP-72: Task Execution Interface (TEI) aka Task SDKarea:task-sdkfull tests neededWe need to run full set of tests for this PR to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ashb@kaxil@amoghrajesh@jedcunningham