fix(arrow): Defer release callbacks until the vector is destroyed (mhaseeb123 2026-09-10 option 1) - #15
Open
simoneves wants to merge 1 commit into
Conversation
`importFromArrowAsOwner` documents that the returned vector calls the `ArrowSchema` and `ArrowArray` release callbacks when it is destroyed. Import paths that copy Arrow data ran them before the import call had even returned. Times, timestamps and several decimal layouts copy their values rather than viewing them. When `null_count` is zero there is no nulls buffer to view either, so nothing referenced the Arrow structures at all. Nothing dangled, because a vector built from copied values holds no pointer into Arrow memory. A producer that frees or unrefs its own state from a release callback still saw that happen while the caller was holding the vector. Ownership used to travel only through the buffer views placed over Arrow memory. The returned vector now owns the two releasers directly, so release timing no longer depends on whether a path viewed or copied its input. Its deleter drops the vector before the releasers, so that buffer views on the viewing paths are gone before the callbacks free what they reference.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
importFromArrowAsOwnerdocuments that the returned vector calls theArrowSchemaandArrowArrayrelease callbacks when it is destroyed. Import paths that copy Arrow data ran them before the import call had even returned. Times, timestamps and several decimal layouts copy their values rather than viewing them. Whennull_countis zero there is no nulls buffer to view either, so nothing referenced the Arrow structures at all.Nothing dangled, because a vector built from copied values holds no pointer into Arrow memory. A producer that frees or unrefs its own state from a release callback still saw that happen while the caller was holding the vector.
Ownership used to travel only through the buffer views placed over Arrow memory. The returned vector now owns the two releasers directly, so release timing no longer depends on whether a path viewed or copied its input. Its deleter drops the vector before the releasers, so that buffer views on the viewing paths are gone before the callbacks free what they reference.