@@ -18,14 +18,15 @@ use chroma_storage::Storage;
1818use chroma_tracing:: util:: wrap_span_with_parent_context;
1919use chroma_types:: chroma_proto:: {
2020 garbage_collect_phase2_request:: LogToCollect , log_service_client:: LogServiceClient ,
21- log_service_server:: LogService , scrub_log_request:: LogToScrub , CollectionInfo ,
22- GarbageCollectPhase2Request , GarbageCollectPhase2Response ,
23- GetAllCollectionInfoToCompactRequest , GetAllCollectionInfoToCompactResponse ,
24- InspectDirtyLogRequest , InspectDirtyLogResponse , InspectLogStateRequest ,
25- InspectLogStateResponse , LogRecord , MigrateLogRequest , MigrateLogResponse , OperationRecord ,
26- PullLogsRequest , PullLogsResponse , PurgeDirtyForCollectionRequest ,
27- PurgeDirtyForCollectionResponse , PushLogsRequest , PushLogsResponse , ScoutLogsRequest ,
28- ScoutLogsResponse , ScrubLogRequest , ScrubLogResponse , SealLogRequest , SealLogResponse ,
21+ log_service_server:: LogService , purge_from_cache_request:: EntryToEvict ,
22+ scrub_log_request:: LogToScrub , CollectionInfo , GarbageCollectPhase2Request ,
23+ GarbageCollectPhase2Response , GetAllCollectionInfoToCompactRequest ,
24+ GetAllCollectionInfoToCompactResponse , InspectDirtyLogRequest , InspectDirtyLogResponse ,
25+ InspectLogStateRequest , InspectLogStateResponse , LogRecord , MigrateLogRequest ,
26+ MigrateLogResponse , OperationRecord , PullLogsRequest , PullLogsResponse ,
27+ PurgeDirtyForCollectionRequest , PurgeDirtyForCollectionResponse , PurgeFromCacheRequest ,
28+ PurgeFromCacheResponse , PushLogsRequest , PushLogsResponse , ScoutLogsRequest , ScoutLogsResponse ,
29+ ScrubLogRequest , ScrubLogResponse , SealLogRequest , SealLogResponse ,
2930 UpdateCollectionLogOffsetRequest , UpdateCollectionLogOffsetResponse ,
3031} ;
3132use chroma_types:: chroma_proto:: { ForkLogsRequest , ForkLogsResponse } ;
@@ -293,6 +294,10 @@ fn cache_key_for_cursor(collection_id: CollectionUuid, name: &CursorName) -> Str
293294 format ! ( "{collection_id}::cursor::{}" , name. path( ) )
294295}
295296
297+ fn cache_key_for_fragment ( collection_id : CollectionUuid , fragment_path : & str ) -> String {
298+ format ! ( "{collection_id}::{}" , fragment_path)
299+ }
300+
296301////////////////////////////////////////// CachedFragment //////////////////////////////////////////
297302
298303#[ derive( Clone , Debug , Default , serde:: Serialize , serde:: Deserialize ) ]
@@ -1473,7 +1478,7 @@ impl LogServer {
14731478 . map ( |fragment| async {
14741479 let prefix = collection_id. storage_prefix_for_log ( ) ;
14751480 if let Some ( cache) = self . cache . as_ref ( ) {
1476- let cache_key = format ! ( "{ collection_id}::{}" , fragment. path) ;
1481+ let cache_key = cache_key_for_fragment ( collection_id, & fragment. path ) ;
14771482 if let Ok ( Some ( answer) ) = cache. get ( & cache_key) . await {
14781483 return Ok ( Arc :: new ( answer. bytes ) ) ;
14791484 }
@@ -2007,6 +2012,48 @@ impl LogServer {
20072012 . instrument ( span)
20082013 . await
20092014 }
2015+
2016+ async fn purge_from_cache (
2017+ & self ,
2018+ request : Request < PurgeFromCacheRequest > ,
2019+ ) -> Result < Response < PurgeFromCacheResponse > , Status > {
2020+ let span = wrap_span_with_parent_context (
2021+ tracing:: trace_span!( "PurgeFromCache" , ) ,
2022+ request. metadata ( ) ,
2023+ ) ;
2024+ let purge = request. into_inner ( ) ;
2025+ async move {
2026+ let key = match purge. entry_to_evict {
2027+ Some ( EntryToEvict :: CursorForCollectionId ( x) ) => {
2028+ let collection_id = Uuid :: parse_str ( & x)
2029+ . map ( CollectionUuid )
2030+ . map_err ( |_| Status :: invalid_argument ( "Failed to parse collection id" ) ) ?;
2031+ Some ( cache_key_for_cursor ( collection_id, & COMPACTION ) )
2032+ }
2033+ Some ( EntryToEvict :: ManifestForCollectionId ( x) ) => {
2034+ let collection_id = Uuid :: parse_str ( & x)
2035+ . map ( CollectionUuid )
2036+ . map_err ( |_| Status :: invalid_argument ( "Failed to parse collection id" ) ) ?;
2037+ Some ( cache_key_for_manifest ( collection_id) )
2038+ }
2039+ Some ( EntryToEvict :: Fragment ( f) ) => {
2040+ let collection_id = Uuid :: parse_str ( & f. collection_id )
2041+ . map ( CollectionUuid )
2042+ . map_err ( |_| Status :: invalid_argument ( "Failed to parse collection id" ) ) ?;
2043+ Some ( cache_key_for_fragment ( collection_id, & f. fragment_path ) )
2044+ }
2045+ None => None ,
2046+ } ;
2047+ if let Some ( key) = key {
2048+ if let Some ( cache) = self . cache . as_ref ( ) {
2049+ cache. remove ( & key) . await ;
2050+ }
2051+ }
2052+ Ok ( Response :: new ( PurgeFromCacheResponse { } ) )
2053+ }
2054+ . instrument ( span)
2055+ . await
2056+ }
20102057}
20112058
20122059struct LogServerWrapper {
@@ -2107,6 +2154,13 @@ impl LogService for LogServerWrapper {
21072154 ) -> Result < Response < GarbageCollectPhase2Response > , Status > {
21082155 self . log_server . garbage_collect_phase2 ( request) . await
21092156 }
2157+
2158+ async fn purge_from_cache (
2159+ & self ,
2160+ request : Request < PurgeFromCacheRequest > ,
2161+ ) -> Result < Response < PurgeFromCacheResponse > , Status > {
2162+ self . log_server . purge_from_cache ( request) . await
2163+ }
21102164}
21112165
21122166fn parquet_to_records ( parquet : Arc < Vec < u8 > > ) -> Result < Vec < ( LogPosition , Vec < u8 > ) > , Status > {
0 commit comments