mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-07-04 20:37:15 +02:00
sync the api key operations between the leader and followers
This commit is contained in:
parent
56f7e0d89a
commit
0a772fb391
3 changed files with 96 additions and 11 deletions
|
@ -22,6 +22,7 @@ use uuid::Uuid;
|
|||
pub struct AuthController {
|
||||
store: Arc<HeedAuthStore>,
|
||||
master_key: Option<String>,
|
||||
|
||||
cluster: Option<Cluster>,
|
||||
}
|
||||
|
||||
|
@ -37,7 +38,28 @@ impl AuthController {
|
|||
generate_default_keys(&store)?;
|
||||
}
|
||||
|
||||
Ok(Self { store: Arc::new(store), master_key: master_key.clone(), cluster })
|
||||
let this = Self {
|
||||
store: Arc::new(store),
|
||||
master_key: master_key.clone(),
|
||||
cluster: cluster.clone(),
|
||||
};
|
||||
|
||||
if let Some(Cluster::Follower(follower)) = cluster {
|
||||
let this = this.clone();
|
||||
|
||||
std::thread::spawn(move || loop {
|
||||
match follower.api_key_operation() {
|
||||
cluster::ApiKeyOperation::Insert(key) => {
|
||||
this.store.put_api_key(key).expect("Inconsistency with the leader");
|
||||
}
|
||||
cluster::ApiKeyOperation::Delete(uuid) => {
|
||||
this.store.delete_api_key(uuid).expect("Inconsistency with the leader");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
||||
/// Return the size of the `AuthController` database in bytes.
|
||||
|
@ -48,7 +70,13 @@ impl AuthController {
|
|||
pub fn create_key(&self, create_key: CreateApiKey) -> Result<Key> {
|
||||
match self.store.get_api_key(create_key.uid)? {
|
||||
Some(_) => Err(AuthControllerError::ApiKeyAlreadyExists(create_key.uid.to_string())),
|
||||
None => self.store.put_api_key(create_key.to_key()),
|
||||
None => {
|
||||
let key = self.store.put_api_key(create_key.to_key())?;
|
||||
if let Some(Cluster::Leader(ref leader)) = self.cluster {
|
||||
leader.insert_key(key.clone());
|
||||
}
|
||||
Ok(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,7 +91,12 @@ impl AuthController {
|
|||
name => key.name = name.set(),
|
||||
};
|
||||
key.updated_at = OffsetDateTime::now_utc();
|
||||
self.store.put_api_key(key)
|
||||
|
||||
let key = self.store.put_api_key(key)?;
|
||||
if let Some(Cluster::Leader(ref leader)) = self.cluster {
|
||||
leader.insert_key(key.clone());
|
||||
}
|
||||
Ok(key)
|
||||
}
|
||||
|
||||
pub fn get_key(&self, uid: Uuid) -> Result<Key> {
|
||||
|
@ -106,6 +139,9 @@ impl AuthController {
|
|||
|
||||
pub fn delete_key(&self, uid: Uuid) -> Result<()> {
|
||||
if self.store.delete_api_key(uid)? {
|
||||
if let Some(Cluster::Leader(ref leader)) = self.cluster {
|
||||
leader.delete_key(uid);
|
||||
}
|
||||
Ok(())
|
||||
} else {
|
||||
Err(AuthControllerError::ApiKeyNotFound(uid.to_string()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue