-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Go: [BREAKING] explicit destruction for futures and transactions #12052
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
base: main
Are you sure you want to change the base?
Conversation
return | ||
} | ||
|
||
kv = ri.kvs[ri.index] |
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.
Note: on next advance call, this slice is thrown away. I'd like to address this in this PR, or a separate one, by having Advance()
return the whole slice.
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 ended up switching from Advance()
/GetSlice()
to NextBatch()
/Get()
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.
Thanks for the PR! Could we update the test cases to make use of the new close method (and directly document there how to use them)?
@@ -88,7 +88,9 @@ func (opt TransactionOptions) setOpt(code int, param []byte) error { | |||
}, param) | |||
} | |||
|
|||
func (t *transaction) destroy() { | |||
// Close will destroy the underlying transaction. | |||
// It must be called after all the transaction-associated futures have been closed. |
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.
Should we document what happens if the transaction is closed before all the associated futures have been closed?
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.
In fact destroying the transaction causes the transaction (and all its futures) to be cancelled, so this needs some re-thinking/re-writing 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.
I will make some attempts and submit a change; I am thinking to return a "closer" function that caller can defer.
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've submitted a version of this; will update all tests code.
This change also introduces an implementation of context with automatic cancellation, as I thought it would be a good time to break the function signature only once.
Stop relying on Go's GC finalizers and instead use explicit Close() calls to release resources, which is more Go-idiomatic. The Get() method is removed from RangeIterator. NOTE: this would be a breaking change for users because without any code breakage they would now have huge memory leaks on their FoundationDB clients; a release management solution must be devised for this problem.
Other functions renamed: * GetSliceWithError() -> Get() * GetSliceOrPanic() -> MustGet()
Result of foundationdb-pr-clang-ide on Linux CentOS 7
|
Result of foundationdb-pr-clang on Linux CentOS 7
|
Result of foundationdb-pr-macos-m1 on macOS Ventura 13.x
|
Result of foundationdb-pr on Linux CentOS 7
|
Result of foundationdb-pr-cluster-tests on Linux CentOS 7
|
Result of foundationdb-pr-clang-arm on Linux CentOS 7
|
Result of foundationdb-pr-macos on macOS Ventura 13.x
|
Use a goroutine to automatically cancel transaction when context has an error. Correctly close transactions by returning a function to caller.
@johscheuer I have fixed the build errors in the directory layer; please trigger CI again |
Result of foundationdb-pr-clang-ide on Linux CentOS 7
|
Result of foundationdb-pr-macos-m1 on macOS Ventura 13.x
|
Result of foundationdb-pr-clang-arm on Linux CentOS 7
|
Result of foundationdb-pr-clang on Linux CentOS 7
|
Result of foundationdb-pr on Linux CentOS 7
|
Result of foundationdb-pr-cluster-tests on Linux CentOS 7
|
Result of foundationdb-pr-macos on macOS Ventura 13.x
|
Thanks for triggering the CI @jzhou77. I guess next step is to discuss the changes |
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.
Thanks again for the PR, it's in my queue for next week!
Thanks! It's a big change, looking forward to the discussion! |
Explicit destruction for futures and transactions.
Introduction of context.
This is a breaking change
This change makes the Go binding stop relying on Go's GC finalizers and instead use explicit Close() calls to release resources, which is more Go-idiomatic; additionally,
context.Context
is added to function signatures and supported through transaction cancellation.NOTE: once merged this will be a breaking change for users because memory leaks would start appear on their FoundationDB clients, unless
Close()
is called for futures, transactions and range iterators.Code-Reviewer Section
I have not yet updated test code as I'd like to discuss this change first.
For Release-Branches
If this PR is made against a release-branch, please also check the following:
release-branch
ormain
if this is the youngest branch)