Uh oh!
There was an error while loading. Please reload this page.
[fix](fe) Skip dropped columns in follower stats sync - #63882
Conversation
Follower stats sync can process queued column references after the column has been dropped, causing getColumn(...).getType() to throw a NullPointerException. Skip dropped columns before checking the type so remaining queued columns can continue to be synced. Key changes: - Check for null column metadata in FollowerColumnSender before reading the column type - Add a unit test covering dropped columns in follower stats sync Unit Test: - org.apache.doris.statistics.FollowerColumnSenderTest
hello-stephen
commented
May 29, 2026
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
yujun777
commented
May 29, 2026
run buildall |
hello-stephen
commented
May 29, 2026
TPC-H: Total hot run time: 31615 ms |
hello-stephen
commented
May 29, 2026
TPC-DS: Total hot run time: 171821 ms |
hello-stephen
commented
May 29, 2026
FE Regression Coverage ReportIncrement line coverage |
yujun777
commented
May 29, 2026
run external |
1 similar comment
yujun777
commented
May 29, 2026
run external |
hello-stephen
commented
May 29, 2026
FE Regression Coverage ReportIncrement line coverage |
1 similar comment
hello-stephen
commented
May 29, 2026
FE Regression Coverage ReportIncrement line coverage |
morrySnow
commented
Jun 1, 2026
/review |
PR approved by at least one committer and no changes requested. |
PR approved by anyone and no changes requested. |
There was a problem hiding this comment.
Review result: no blocking issues found.
Critical checkpoint conclusions:
- Goal and correctness: The PR fixes the follower stats sync NPE by skipping stale queued columns whose metadata has disappeared, while still processing remaining queued columns.
- Scope: The change is small and focused on the failing null dereference path, with no unrelated GitHub PR files.
- Concurrency and lifecycle: No new shared state, locking, thread lifecycle, or static initialization behavior is introduced. The existing queue-draining daemon behavior is unchanged.
- Compatibility and persistence: No thrift schema, storage format, edit log, or rolling-upgrade compatibility impact.
- Parallel paths: Existing table column-index pair implementations already skip missing/unsupported columns; this change covers the earlier direct
getColumn(...).getType()access in the follower sender path. - Error handling: The stale dropped-column case is now handled by skipping the item instead of letting a NullPointerException abort the send round.
- Test coverage: A focused FE unit test was added for dropped-column queue entries, and CI reports FE UT and CheckStyle passing. I did not run additional local tests.
- Observability and performance: No new observability needed; the added null check is trivial and avoids periodic error logs.
- Data correctness: No transaction, visibility-version, delete-bitmap, or data write path is affected.
User focus: No additional user-provided review focus was specified.
Uh oh!
There was an error while loading. Please reload this page.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
### What problem does this PR solve? FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type. This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
What problem does this PR solve?
FollowerColumnSender drains queued column references on follower FEs and syncs the columns that still need analysis to the master. A queued column can become stale after DDL changes. If the table still exists but the queued column has been dropped, table.getColumn(column.colName) returns null and the sender throws a NullPointerException while reading the type.
This patch skips dropped columns before checking the column type, so the daemon does not emit periodic ERROR logs and can continue processing the remaining queued columns.
Issue Number: close #xxx
Release note
None
Check List (For Author)