-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement std::error::Error::source()
for DataFusionError
, make DataFusionError::find_root
more generic
#4992
Conversation
|
||
let mut last_datafusion_error = self; | ||
let mut root_error: &dyn Error = self; | ||
while let Some(source) = find_source(root_error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am quite pleased with how this works (and it will work for other intervening wrapping error types if they implement source()
as well)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Took a few readings, but I get it 👍
} | ||
// some errors are wrapped into `Arc`s to share them with multiple |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this necessary? The source implementation of Arc should already call this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is necessary, but I don't know why. The tests fail without it. If you could help figure out how to avoid it it would be great.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed in f3d2ae6
Benchmark runs are scheduled for baseline = 350cb47 and contender = e713547. e713547 is a master commit associated with this PR. Results will be available as each benchmark for each run completes. |
Which issue does this PR close?
Closes #4991
Rationale for this change
In IOx (and in DataFusion) we often want to know what the root cause of an error is (e.g was it a bug or was it a resources exhausted). ArrowError can wrap other errors with Arrow::External (and DataFusion has something similar) but there is no easy way to get at the source of the error to walk the chain without knowing all the possible types that may be present
I want a generic way to walk up the error stack
What changes are included in this PR?
std::error::Error::source()
forDataFusionError
DataFusionError::find_root
less specific (uses source() rather than so much checking for arrow)Are these changes tested?
Yes, covered by (some quite gnarly) existing tests
Are there any user-facing changes?
Better standard support