> we require that a setup always have a teardown I'd personally prefer this one because "explicit is better than implicit". I see the cases where it could be useful (I was also contemplating no setup/no teardown before), but I think the wiggly behaviour is a recipe for a number of mistakes (and issues raised by users), especially when someone modifies existing DAG and adds teardown without realising the consequences.
Not a strong preference, I am ok with both, but if I got to choose, I'd require teardown. J. On Fri, Jun 30, 2023 at 10:28 PM Daniel Standish <daniel.stand...@astronomer.io.invalid> wrote: > Ok want to pick back up setup / teardown discussion as we get closer to > 2.7. > > For personal reasons I had to take some time off work just as we were > wrapping up work on 2.6, and at least partly due to that, we punted setup / > teardown to 2.7. > > But we've picked it back up and continued along the path outlined in this > thread and things look good for 2.7. > > In the time since the previous discussion, not a lot has changed except > that we've implemented in main some of the things discussed. > > For one we added a one-liner syntax. > > So now if you have an existing dag such as this: > > create_cluster >> run_query >> delete_cluster > > You can convert it to use setup / teardown with the following: > > create_cluster >> run_query >> > delete_cluster.as_teardown(setups=create_cluster) > > The context manager suggested by Ash has been added, so if you have setup > `s` and teardown `t`, you can do the following: > > with s >> t: > some_work(other_work()) > > Notably, just as with task group context manager, you must instantiate the > task inside the context in order for it to be registered. Ephraim is > working on some improvements to the context manager to address this (so > that you can explicitly add tasks to the context in that scenario) and so > that we can throw an error on non-sensical usages such as `with a >> b >> > c:` > > There is a docs PR outlining the current state of the feature here > <https://github.com/apache/airflow/pull/32169> and you are all welcome to > comment. There's still time to make adjustments if desired. > > But I wanted to raise one point for discussion here. It's something I > could have gone either way on, and I want to tap into the wisdom of the > community. > > The question of whether a setup with no teardown, or a teardown with no > setup, should be added. > > There are two options as I see it. > > Option 1: if a setup has no teardown, then all the downstreams are assumed > to be "in scope" for the setup > Note: the notion of "scope" is about the clearing behavior aspect of setup > / teardown: you clear a task, it clears its setups too. A work task is in > the scope of s and t if it's between s and t. > So then with s1 >> w1 >> w2, clearing work task w1 would clear w1 w2 and > s1. > And clearing w2 would clear w2 and s1. > This makes it easy to have a setup with no teardown. But it makes the > behavior slightly more... wiggly... for lack of a better term. With this > example, s1 is a setup for w2. But then suppose you add a teardown after > w1: s1 >> w1 >> [w2, t1.as_teardown(setups=s1)]. Now s1 is not a setup for > w2. > So the logic is ... "a work task is in scope of a setup if it is in between > the setup and its teardown, *or *if the setup has no teardowns". > > Option 1: we require that a setup always have a teardown > With this approach, the rule is simpler and it forces unambiguously defined > scopes. If you just want to use a setup and don't need a teardown task, > you add an empty teardown. The rule is then "a work task is in scope of a > setup if it is in between the setup and its teardown" -- i.e. the same rule > minus the `or` clause. > So the example would have to be s1 >> w1 >> w2 >> > EmptyOperator().as_teardown(setups=s1). > > Thanks in advance for your engagement. > > P.S. note that those of us in the U.S. will be off for holiday soon so may > be slower to respond but just wanted to get this conversation started so > that we can get this feature to a place that people generally feel good > enough about in 2.7. > > P.P.S. Random-ish note... we should consider marking some features as beta > I think. There's a difference between beta and experimental, though > historically we've only employed the latter. But I think beta can be good > to signal "we are committed to this feature we just might make a change or > two to the API". Not saying we should do this with setup / teardown > necessarily but it's an option. Sometimes I think it can be a little > overwhelming to put out features with the spectre of being locked in by > backcompat guarantees and perhaps something like a beta feature could be a > way to get things out there a little bit more freely and allow for a > feedback loop. > > Thanks again, > > Daniel >