fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496
, '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

fix(asset-parition): add a mutex lock to AssetModel when updating APDR - #59183

Merged
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition
Dec 18, 2025
Merged

fix(asset-parition): add a mutex lock to AssetModel when updating APDR#59183
Lee-W merged 14 commits into
apache:mainfrom
astronomer:resolve-apdr-race-condition

Conversation

@Lee-W

@Lee-WLee-W commented Dec 8, 2025

Copy link
Copy Markdown
Member

Why

closes: #58919

What

Add a row lock to AssetModel when updating APDR for MySQL and PostgreSQL. Since SQLIte does not support row lock, add retry mechanism if OperationError with Database is locked is encountered.


^ 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 airflow-core/newsfragments.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 4c835f4 to edd36e0CompareDecember 8, 2025 08:09
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 95e4053 to c224bccCompareDecember 8, 2025 14:23
@Lee-W
Lee-W marked this pull request as ready for review December 8, 2025 14:33
@Lee-W
Lee-W requested a review from dstandishDecember 8, 2025 14:33
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to adpr updatingfix(asset-parition): add a mutex lock to APDR updatingDec 8, 2025
@potiuk

potiuk commented Dec 8, 2025

Copy link
Copy Markdown
Member

I don't think it's a good solution

SELECT FOR UPDATE will not lock anything when ADPR lock is missing.

If the task switch happens after ROW lock in first event handling, both select for updates will run and return no row, and this will create both ADPRs:

TimeEvent 1Event 2
0SELECT FOR UPDATE ADR (NO ROW FOUND)
1SELECT FOR UPDATE ADR (NO ROW FOUND)
2CREATE ADPR
3CREATE ADPR

@Lee-W
Lee-W marked this pull request as draft December 9, 2025 01:18
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 386669a to 346eba2CompareDecember 9, 2025 06:00
@jason810496
jason810496 self-requested a review December 9, 2025 06:53
@Lee-WLee-W changed the title fix(asset-parition): add a mutex lock to APDR updatingfix(asset-parition): add a mutex lock to AssetModel when updating APDRDec 9, 2025
@Lee-W
Lee-W marked this pull request as ready for review December 9, 2025 07:42
@Lee-W

Lee-W commented Dec 9, 2025

Copy link
Copy Markdown
MemberAuthor

Just updated it to lock AssetModel inatead of APDR

@potiukpotiuk 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.

Way better I think. @dstandish ?

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
Comment threadairflow-core/tests/unit/assets/test_manager.py Outdated

@potiukpotiuk 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.

Hmm. took a closer look and I have some improvement proposal and some surprise when looking at the test.

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 2 times, most recently from 04023ee to 9688202CompareDecember 10, 2025 09:05
@Lee-W
Lee-W requested a review from potiukDecember 10, 2025 09:49
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 9688202 to 11ba716CompareDecember 10, 2025 10:05

@potiukpotiuk 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.

Much better - htough I think maybe we should run the test few times if it's quick? Lack of the race condition does not say it cannot occur if it's only executed once :)

I did not know SQLite does not support row-level locks. Good solution with extra table.

@potiuk

Copy link
Copy Markdown
Member

I think you need to rebase to get rid of the issues that were fixed in main already

Comment threadairflow-core/src/airflow/assets/manager.py Outdated
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 5892a87 to 93f84f4CompareDecember 11, 2025 01:53

@dstandishdstandish 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.

left some suggestions

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch 3 times, most recently from 67adb42 to e7d33fbCompareDecember 17, 2025 09:40
Comment threadairflow-core/src/airflow/assets/manager.py Outdated

@dstandishdstandish 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.

small question but looks ok

@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from e7d33fb to 8c320eeCompareDecember 18, 2025 07:57
@Lee-W
Lee-Wforce-pushed the resolve-apdr-race-condition branch from 8c320ee to a418c89CompareDecember 18, 2025 09:01
@Lee-W
Lee-W merged commit c36e5ec into apache:mainDec 18, 2025
329 of 333 checks passed
@Lee-W
Lee-W deleted the resolve-apdr-race-condition branch December 18, 2025 14:20
Lohith625 pushed a commit to Lohith625/airflow that referenced this pull request Dec 19, 2025
stegololz pushed a commit to stegololz/airflow that referenced this pull request Jan 9, 2026
jhgoebbert pushed a commit to jhgoebbert/airflow_Owen-CH-Leung that referenced this pull request Feb 8, 2026
Subham-KRLX pushed a commit to Subham-KRLX/airflow that referenced this pull request Mar 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve race condition re creation of APDR records

4 participants

@Lee-W@potiuk@dstandish@jason810496