Comments (5)
This was intentional. It prevents the HostSet from being used after Close is called.
Is this causing problems?
from us.
Yes. It blocks the goroutine in acquireCtx
.
from us.
It's also not a good idea to block goroutines to prevent the HostSet
from being used after Close
is called. Users are hard to find the problem. It should return a proper error instead.
from us.
I wrote it this way to catch developer errors, and it did: calling acquire
after calling Close
should be a developer error. I agree that deadlocking isn't ideal, but it was very simple to implement and was guaranteed to work. Anyway, now we have acquireCtx
, whose goroutine outlives its parent, so we can't treat it as a developer error anymore. Maybe eventually I'll fix acquireCtx
and then I can turn this into a panic
instead.
from us.
Even if it's a developer error, how do people know there is an error? They need a core dump to find there is a goroutine that tries to acquire a session after HostSet
is closed. Such a goroutine never returns, and you might expect people can find it. However, in reality, if a goroutine doesn't return for a long time, the upper context times out or gets cancelled, and the whole application keeps running. As a result, people cannot know there is a goroutine waiting for a lock.
panic
isn't also a good idea. panic
should be used only for unrecoverable run-time errors: https://golang.org/doc/effective_go#panic. If this is a developer error, it simply should return an error. They say
Real library functions should avoid panic. If the problem can be masked or worked around, it's always better to let things continue to run rather than taking down the whole program.
Actually, how can we avoid acquiring sessions after the host set is closed? Ideally, we need to check if all corresponding goroutines finish before closing the host set. But, it's not practical. For example, we don't know when the goroutine in acquireCtx
ends. Another solution would be to add a reference counter and close the host set only if the counter becomes zero. But, such a counter should be implemented in HostSet
if necessary.
I think simply returning an error is enough in this case.
from us.
Related Issues (20)
- Transaction spends a nonexisting siacoin output HOT 1
- Migrate to RHP3 HOT 1
- RenewContract: ReadResponse: consensus conflict: provided transaction set is standalone and invalid: transaction cannot have an output or payout that has zero value HOT 7
- PseudoKV roadmap (discussion) HOT 1
- NewEphemeralMetaDB misses initializing meta
- Hot swapping PseudoKV contracts HOT 12
- AddShard uses bucketChunks to calculate the next ID HOT 1
- Tooling to retry failed contract renewals HOT 5
- Conversion from untyped int to string yields a string of one rune, not a string of digits HOT 4
- BoltMetaDB.ForEachBlob can cause a deadlock HOT 9
- PseudoKV migration acceleration
- Data race in ParallelBlobDownloader HOT 1
- Rejected for low paying host missed output HOT 5
- TestCompatibility takes more than 10min and panics HOT 4
- Could not find the desired sector HOT 12
- Does migration re-upload everything? HOT 2
- Lock: couldn't read LoopLock response: unexpected EOF HOT 3
- Delete files in parallel (ParallelSectorDeleter) HOT 2
- tryLock is not released properly
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from us.