From 19947b7ef0acf1168a83925f662dc2514be5a13f Mon Sep 17 00:00:00 2001 From: rsdy Date: Fri, 15 Sep 2023 18:36:59 +0200 Subject: [PATCH] Recreate Qdrant collection on delete, and wait for deletion to succeed (#960) * Wait max 60s before moving on from deleting the qdrant collection * Nicer this way * Immediately recreate the collection --- server/bleep/src/indexes.rs | 2 +- server/bleep/src/semantic.rs | 39 ++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/server/bleep/src/indexes.rs b/server/bleep/src/indexes.rs index 6787cea2bb..b5d1ae75fe 100644 --- a/server/bleep/src/indexes.rs +++ b/server/bleep/src/indexes.rs @@ -114,7 +114,7 @@ impl Indexes { } if let Some(ref semantic) = semantic { - semantic.delete_collection().await?; + semantic.reset_collection_blocking().await?; } } config.source.save_index_version()?; diff --git a/server/bleep/src/semantic.rs b/server/bleep/src/semantic.rs index bb78565567..358de9c2c3 100644 --- a/server/bleep/src/semantic.rs +++ b/server/bleep/src/semantic.rs @@ -2,6 +2,7 @@ use std::{borrow::Cow, collections::HashMap, env, path::Path, sync::Arc}; use crate::{query::parser::SemanticQuery, Configuration}; +use anyhow::bail; use qdrant_client::{ prelude::{QdrantClient, QdrantClientConfig}, qdrant::{ @@ -15,7 +16,7 @@ use qdrant_client::{ use futures::{stream, StreamExt, TryStreamExt}; use rayon::prelude::*; use thiserror::Error; -use tracing::{debug, info, warn}; +use tracing::{debug, error, info, warn}; pub mod chunk; pub mod embedder; @@ -244,12 +245,46 @@ impl Semantic { pub fn embedder(&self) -> &dyn Embedder { self.embedder.as_ref() } - pub async fn delete_collection(&self) -> anyhow::Result<()> { + + pub async fn reset_collection_blocking(&self) -> anyhow::Result<()> { _ = self .qdrant .delete_collection(&self.config.collection_name) .await?; + let deleted = 'deleted: { + for _ in 0..60 { + match self + .qdrant + .has_collection(&self.config.collection_name) + .await + { + Ok(true) => { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + } + Ok(false) => { + break 'deleted true; + } + Err(err) => { + error!(?err, "failed to delete qdrant collection for migration"); + } + } + } + false + }; + + if !deleted { + error!("failed to delete qdrant collection after 60s"); + bail!("deletion failed") + } + + let CollectionOperationResponse { result, .. } = + create_collection(&self.config.collection_name, &self.qdrant) + .await + .unwrap(); + + assert!(result); + Ok(()) }