fix(media-proxy): budget native image work by pod memory (#3385)

This commit is contained in:
Hampus authored and GitHub committed 2026-10-11 02:07:19 +02:00
1 parent 575a5adbef
commit 7d2c51a57f
20 files changed
+663 -133

No files matched your search

@@ -7,7 +7,7 @@ pub(in crate::server) use failure::MediaFailure;
pub(in crate::server) use input::{MediaInput, MediaInputLimit, load_media_input};
use crate::{
constants::AssetExtension,
constants::{self, AssetExtension},
image_quality::ImageQuality,
image_transform::AnimationMode,
media_process, mime,
@@ -16,7 +16,7 @@ use crate::{
server::{
format_policy::image_extension_from_filename,
state::AppState,
transform::execution::{run_transform, transform_error_is_timeout},
transform::execution::{deadline_instant, run_transform, transform_error_is_timeout},
},
};
use bytes::Bytes;
@@ -43,21 +43,39 @@ pub(in crate::server) async fn resolve_metadata(
app.media.nsfw().record_declined_scan();
NSFWPolicy::Disabled
};
let json = media_process::metadata_json_with_options(
&input.data,
&input.filename,
media_process::MetadataOptions {
placeholder: true,
nsfw,
},
&app.media.limits(),
app.media.nsfw(),
&app.metrics.transform(),
)
.await
.map_err(|err| MediaFailure::MetadataExtractionFailed {
let runtime = app.media.transforms();
let options = media_process::MetadataOptions {
placeholder: true,
nsfw,
deadline_ms: runtime.transform_deadline_ms(),
};
let deadline = deadline_instant(options.deadline_ms);
let media_limits = app.media.limits();
let transform_metrics = app.metrics.transform();
let data = input.data.clone();
let cost_data = input.data.clone();
let extraction_failed = |err: &dyn std::fmt::Debug| MediaFailure::MetadataExtractionFailed {
detail: format!("filename={} err={err:?}", input.filename),
})?;
};
let prepared = runtime
.tasks()
.run_native(
deadline,
move || Ok(media_process::metadata_cost(&cost_data, &media_limits)?),
move || {
Ok(media_process::prepare_metadata(
&data,
&options,
&media_limits,
&transform_metrics,
)?)
},
)
.await
.map_err(|err| extraction_failed(&err))?;
let json = media_process::finish_metadata(prepared, app.media.nsfw())
.await
.map_err(|err| extraction_failed(&err))?;
Ok(MetadataOutput {
metadata: serde_json::from_str(&json).unwrap_or_else(|_| serde_json::json!({})),
data: include_data.then_some(input.data),
@@ -74,6 +92,8 @@ async fn rasterize_metadata_svg(
input: LoadedMediaInput,
) -> Result<LoadedMediaInput, MediaFailure> {
let options = media_process::ImageOptions {
width: Some(constants::SVG_RASTER_MAX_DIMENSION),
height: Some(constants::SVG_RASTER_MAX_DIMENSION),
format: OutputFormat::WebP,
quality: ImageQuality::Lossless,
animation: AnimationMode::Static,