Cache W2L templates in-memory

This commit is contained in:
Brandon Thomas committed 2022-07-27 02:51:48 -04:00
1 parent fc88730386
commit d458d753fb
4 files changed
+49 -15

No files matched your search

@@ -7,7 +7,7 @@ use sqlx::MySqlPool;
// FIXME: This is the old style of query scoping and shouldn't be copied.
#[derive(Serialize)]
#[derive(Serialize, Clone)]
pub struct W2lTemplateRecordForList {
pub template_token: String,
pub template_type: String,
@@ -10,7 +10,7 @@ use crate::AnyhowResult;
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
use crate::server_state::ServerState;
use database_queries::queries::w2l::w2l_templates::list_w2l_templates::{W2lTemplateRecordForList, list_w2l_templates};
use log::{info, warn, log};
use log::{info, warn, log, error};
use regex::Regex;
use sqlx::MySqlPool;
use sqlx::error::DatabaseError;
@@ -57,22 +57,47 @@ pub async fn list_w2l_templates_handler(
http_request: HttpRequest,
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, ListW2lTemplatesError>
{
let no_scope_creator = None;
// TODO(bt): Perhaps we should build a second endpoint to allow fetching a user's W2L templates
// and including them in the global list (before they're mod approved!) just for the uploader.
// TODO(bt): Ideally we show users their own W2L templates here before they're mod approved.
let maybe_templates = server_state
.caches
.w2l_template_list
.copy_without_bump_if_unexpired()
.map_err(|e| {
error!("Error consulting cache: {:?}", e);
ListW2lTemplatesError::ServerError
})?;
let query_results = list_w2l_templates(
&server_state.mysql_pool,
no_scope_creator,
true,
).await;
let templates = match maybe_templates {
Some(templates) => {
templates
},
None => {
const NO_CREATOR_SCOPING_HERE : Option<&'static str> = None;
let templates = match query_results {
Ok(results) => results,
Err(e) => {
warn!("w2l template list query error: {:?}", e);
return Err(ListW2lTemplatesError::ServerError);
}
let query_results = list_w2l_templates(
&server_state.mysql_pool,
NO_CREATOR_SCOPING_HERE,
true,
).await;
let templates = match query_results {
Ok(results) => results,
Err(e) => {
warn!("w2l template list query error: {:?}", e);
return Err(ListW2lTemplatesError::ServerError);
}
};
server_state.caches.w2l_template_list.store_copy(&templates)
.map_err(|e| {
error!("error storing cache: {:?}", e);
ListW2lTemplatesError::ServerError
})?;
templates
},
};
let response = ListW2lTemplatesSuccessResponse {
@@ -316,6 +316,10 @@ async fn main() -> AnyhowResult<()> {
let voice_list_cache = SingleItemTtlCache::create_with_duration(voice_list_cache_ttl);
let category_list_cache = SingleItemTtlCache::create_with_duration(category_list_cache_ttl);
let w2l_template_cache = SingleItemTtlCache::create_with_duration(
easyenv::get_env_duration_seconds_or_default("W2L_TEMPLATE_LIST_CACHE_TTL_SECONDS", Duration::from_secs(300)) // 5 minutes
);
let tts_queue_length_cache = SingleItemTtlCache::create_with_duration(
easyenv::get_env_duration_seconds_or_default("TTS_QUEUE_LENGTH_CACHE_TTL_SECONDS", Duration::from_secs(30))
);
@@ -392,6 +396,7 @@ async fn main() -> AnyhowResult<()> {
static_api_token_set,
caches: InMemoryCaches {
voice_list: voice_list_cache,
w2l_template_list: w2l_template_cache,
category_list: category_list_cache,
tts_queue_length: tts_queue_length_cache,
},
@@ -13,6 +13,7 @@ use memory_caching::single_item_ttl_cache::SingleItemTtlCache;
use r2d2_redis::{r2d2, RedisConnectionManager};
use sqlx::MySqlPool;
use database_queries::queries::tts::tts_inference_jobs::get_pending_tts_inference_job_count::TtsQueueLengthResult;
use database_queries::queries::w2l::w2l_templates::list_w2l_templates::W2lTemplateRecordForList;
use storage_buckets_common::bucket_client::BucketClient;
/// State that is injected into every endpoint.
@@ -105,6 +106,9 @@ pub struct InMemoryCaches {
/// In-memory caches with TTL-based eviction. Contains a list of all voices.
pub voice_list: SingleItemTtlCache<Vec<TtsModelRecordForResponse>>,
/// Contains a list of all W2L templates.
pub w2l_template_list: SingleItemTtlCache<Vec<W2lTemplateRecordForList>>,
/// In-memory caches with TTL-based eviction. Contains a list of all TTS categories.
pub category_list: SingleItemTtlCache<Vec<DisplayCategory>>,