plume-model: refactor Searcher to have its own DbPool #809
Geen beoordelaars
Labels
Geen label
A: API
A: Backend
A: Federation
A: Front-End
A: I18N
A: Meta
A: Security
Build
C: Bug
C: Discussion
C: Enhancement
C: Feature
Compatibility
Dependency
Design
Documentation
Good first issue
Help welcome
Mobile
Rendering
S: Blocked
S: Duplicate
S: Incomplete
S: Instance specific
S: Invalid
S: Needs Voting/Discussion
S: Ready for review
Suggestion
S: Voted on Loomio
S: Wontfix
Geen mijlpaal
Geen project
Niet toegewezen
2 deelnemers
Notificaties
Vervaldatum
Geen vervaldatum ingesteld.
Afhankelijkheden
Geen afhankelijkheden ingesteld.
Referentie: Plume/Plume#809
Laden…
Tabel toevoegen
Verwijs in een nieuwe issue
Geen beschrijving gegeven.
Branch "igalic/Plume:refactor/extract-searcher-with-dbpool" verwijderen
Het verwijderen van een branch is permanent. Hoewel de verwijderde branch kan blijven bestaan voor een korte tijd voordat het daadwerkelijk wordt verwijderd, kan het in de meeste gevallen NIET ongedaan gemaakt worden. Wilt u doorgaan?
This PR is another attempt at fixing #799
Instead of relying on a separate actor model, as described, we make use of the fact that DbPool is an
Arc
, and can be arbitrarily cloned, so we add it toSearcher
. Further more, anddb_pool.get()
acts like sending a message to an Actor: if there are enough connections, the Pool gives us one, if not, tough luck!this way, we don't need to pass along a conn into the searcher functions.
This should make splitting PlumeRocket up into its components a little easier.
👌
@ -175,15 +186,16 @@ impl Searcher {
let lang = schema.get_field("lang").unwrap();
let license = schema.get_field("license").unwrap();
let conn = self.dbpool.get().unwrap();
I would prefer using
?
instead ofunwrap
here.can you briefly explain why?
we use
.unwrap()
in all other lines.I think all the previous ones are safe: we now it can't panic because we control the search index schema, we know that these fields exist (even if Rust can't check this at comoile-time). Here, we may fail to get a DB connection from the pool for whatever reason, and I think we should make the error "go up", so that the web UI or the CLI can display a proper error.
@ -222,24 +229,27 @@ impl Searcher {
let searcher = self.reader.searcher();
let res = searcher.search(&query.into_query(), &collector).unwrap();
let conn = self.dbpool.get().unwrap();
Same here.
👀
@ -40,6 +40,7 @@ pub enum Error {
Io(std::io::Error),
MissingApProperty,
NotFound,
DbPool,
you're not trying to convert the original
diesel::r2d2::Error
?It is a
r2d2::Error
, not the same as Diesel's one apparently. And I don't want to add another direct dependency in our Cargo.toml.gonna have to ask somebody how the heck this is happening
@ -177,1 +188,4 @@
let conn = match self.dbpool.get() {
Ok(c) => c,
Err(_) => return Err(Error::DbPool),
that means we won't know exactly why the pool didn't give us a connection
🙋🏻♀️
@ -31,0 +55,4 @@
///
/// The panic messages are normally explicit enough for a human to
/// understand how to fix the issue when they see it.
pub fn new(db_pool: DbPool) -> Arc<Self> {
why are we returning
Arc<Self>
?this means our code needs to know exactly how it's going to be used
what about cli? does that use an Arc?
i would use this function to only return a Self
there's no need to init_pool, we just want a copy
we can create an initialize method, which tries to call open and create methods in the appropriate order with the error recovery, if that makes sense here
but as it stands, for a new function, this does too much
9309ed279f
naara5c81498b2
closing in favour of #813
Pull request gesloten