@@ -34,7 +34,7 @@ use std::{
34
34
collections:: { BTreeMap , HashMap } ,
35
35
sync:: Arc ,
36
36
} ;
37
- use tracing:: { debug, error, instrument, trace} ;
37
+ use tracing:: { debug, error, info_span , instrument, trace, Instrument } ;
38
38
39
39
static DOC_RUST_LANG_ORG_REDIRECTS : Lazy < HashMap < & str , & str > > = Lazy :: new ( || {
40
40
HashMap :: from ( [
@@ -126,7 +126,9 @@ pub(crate) async fn rustdoc_redirector_handler(
126
126
. is_ok ( )
127
127
{
128
128
rendering_time. step ( "serve static asset" ) ;
129
- return try_serve_legacy_toolchain_asset ( storage, config, params. name ) . await ;
129
+ return try_serve_legacy_toolchain_asset ( storage, config, params. name )
130
+ . instrument ( info_span ! ( "serve static asset" ) )
131
+ . await ;
130
132
}
131
133
}
132
134
@@ -176,84 +178,77 @@ pub(crate) async fn rustdoc_redirector_handler(
176
178
if target. ends_with ( ".js" ) {
177
179
// this URL is actually from a crate-internal path, serve it there instead
178
180
rendering_time. step ( "serve JS for crate" ) ;
179
- let version = matched_release. into_version ( ) ;
180
181
181
- let krate = CrateDetails :: new ( & mut conn, & crate_name, & version, params. version . clone ( ) )
182
- . await ?
183
- . ok_or ( AxumNope :: ResourceNotFound ) ?;
182
+ return async {
183
+ let version = matched_release. into_version ( ) ;
184
184
185
- rendering_time. step ( "fetch from storage" ) ;
185
+ let krate =
186
+ CrateDetails :: new ( & mut conn, & crate_name, & version, params. version . clone ( ) )
187
+ . await ?
188
+ . ok_or ( AxumNope :: ResourceNotFound ) ?;
186
189
187
- match storage
188
- . fetch_rustdoc_file (
189
- & crate_name,
190
- & version. to_string ( ) ,
191
- krate. latest_build_id . unwrap_or ( 0 ) ,
192
- target,
193
- krate. archive_storage ,
194
- Some ( & mut rendering_time) ,
195
- )
196
- . await
197
- {
198
- Ok ( blob) => return Ok ( File ( blob) . into_response ( ) ) ,
199
- Err ( err) => {
200
- if !matches ! ( err. downcast_ref( ) , Some ( AxumNope :: ResourceNotFound ) )
201
- && !matches ! ( err. downcast_ref( ) , Some ( crate :: storage:: PathNotFoundError ) )
202
- {
203
- debug ! ( ?target, ?err, "got error serving file" ) ;
204
- }
205
- // FIXME: we sometimes still get requests for toolchain
206
- // specific static assets under the crate/version/ path.
207
- // This is fixed in rustdoc, but pending a rebuild for
208
- // docs that were affected by this bug.
209
- // https://github.com/rust-lang/docs.rs/issues/1979
210
- if target. starts_with ( "search-" ) || target. starts_with ( "settings-" ) {
211
- return try_serve_legacy_toolchain_asset ( storage, config, target) . await ;
212
- } else {
213
- return Err ( err. into ( ) ) ;
190
+ rendering_time. step ( "fetch from storage" ) ;
191
+
192
+ match storage
193
+ . fetch_rustdoc_file (
194
+ & crate_name,
195
+ & version. to_string ( ) ,
196
+ krate. latest_build_id . unwrap_or ( 0 ) ,
197
+ target,
198
+ krate. archive_storage ,
199
+ Some ( & mut rendering_time) ,
200
+ )
201
+ . await
202
+ {
203
+ Ok ( blob) => Ok ( File ( blob) . into_response ( ) ) ,
204
+ Err ( err) => {
205
+ if !matches ! ( err. downcast_ref( ) , Some ( AxumNope :: ResourceNotFound ) )
206
+ && !matches ! (
207
+ err. downcast_ref( ) ,
208
+ Some ( crate :: storage:: PathNotFoundError )
209
+ )
210
+ {
211
+ debug ! ( ?target, ?err, "got error serving file" ) ;
212
+ }
213
+ // FIXME: we sometimes still get requests for toolchain
214
+ // specific static assets under the crate/version/ path.
215
+ // This is fixed in rustdoc, but pending a rebuild for
216
+ // docs that were affected by this bug.
217
+ // https://github.com/rust-lang/docs.rs/issues/1979
218
+ if target. starts_with ( "search-" ) || target. starts_with ( "settings-" ) {
219
+ try_serve_legacy_toolchain_asset ( storage, config, target) . await
220
+ } else {
221
+ Err ( err. into ( ) )
222
+ }
214
223
}
215
224
}
216
225
}
226
+ . instrument ( info_span ! ( "serve JS for crate" ) )
227
+ . await ;
217
228
}
218
229
}
219
230
220
231
let matched_release = matched_release. into_canonical_req_version ( ) ;
221
232
222
- // get target name and whether it has docs
223
- // FIXME: This is a bit inefficient but allowing us to use less code in general
224
- rendering_time. step ( "fetch release doc status" ) ;
225
- let ( target_name, has_docs) : ( String , bool ) = {
226
- let row = sqlx:: query!(
227
- "SELECT
228
- target_name,
229
- rustdoc_status
230
- FROM releases
231
- WHERE releases.id = $1" ,
232
- matched_release. id( ) ,
233
- )
234
- . fetch_one ( & mut * conn)
235
- . await ?;
236
-
237
- ( row. target_name , row. rustdoc_status )
238
- } ;
239
-
240
233
let mut target = params. target . as_deref ( ) ;
241
- if target == Some ( "index.html" ) || target == Some ( & target_name) {
234
+ if target == Some ( "index.html" ) || target == Some ( matched_release . target_name ( ) ) {
242
235
target = None ;
243
236
}
244
237
245
- if has_docs {
238
+ if matched_release . rustdoc_status ( ) {
246
239
rendering_time. step ( "redirect to doc" ) ;
247
240
248
241
let url_str = if let Some ( target) = target {
249
242
format ! (
250
- "/{crate_name}/{}/{target}/{target_name}/" ,
251
- matched_release. req_version
243
+ "/{crate_name}/{}/{target}/{}/" ,
244
+ matched_release. req_version,
245
+ matched_release. target_name( ) ,
252
246
)
253
247
} else {
254
248
format ! (
255
- "/{crate_name}/{}/{target_name}/" ,
256
- matched_release. req_version
249
+ "/{crate_name}/{}/{}/" ,
250
+ matched_release. req_version,
251
+ matched_release. target_name( ) ,
257
252
)
258
253
} ;
259
254
@@ -663,6 +658,7 @@ pub(crate) async fn rustdoc_html_server_handler(
663
658
) )
664
659
}
665
660
} )
661
+ . instrument ( info_span ! ( "rewrite html" ) )
666
662
. await ?
667
663
}
668
664
@@ -731,6 +727,7 @@ fn path_for_version(
731
727
( path, query_params)
732
728
}
733
729
730
+ #[ instrument( skip_all) ]
734
731
pub ( crate ) async fn target_redirect_handler (
735
732
Path ( ( name, req_version, req_path) ) : Path < ( String , ReqVersion , String ) > ,
736
733
mut conn : DbConnection ,
@@ -805,7 +802,7 @@ pub(crate) struct BadgeQueryParams {
805
802
version : Option < ReqVersion > ,
806
803
}
807
804
808
- #[ instrument]
805
+ #[ instrument( skip_all ) ]
809
806
pub ( crate ) async fn badge_handler (
810
807
Path ( name) : Path < String > ,
811
808
Query ( query) : Query < BadgeQueryParams > ,
@@ -823,6 +820,7 @@ pub(crate) async fn badge_handler(
823
820
) )
824
821
}
825
822
823
+ #[ instrument( skip_all) ]
826
824
pub ( crate ) async fn download_handler (
827
825
Path ( ( name, req_version) ) : Path < ( String , ReqVersion ) > ,
828
826
mut conn : DbConnection ,
@@ -866,6 +864,7 @@ pub(crate) async fn download_handler(
866
864
/// Serves shared resources used by rustdoc-generated documentation.
867
865
///
868
866
/// This serves files from S3, and is pointed to by the `--static-root-path` flag to rustdoc.
867
+ #[ instrument( skip_all) ]
869
868
pub ( crate ) async fn static_asset_handler (
870
869
Path ( path) : Path < String > ,
871
870
Extension ( storage) : Extension < Arc < AsyncStorage > > ,
0 commit comments