@@ -70,6 +70,7 @@ use model::{
70
70
types:: {
71
71
Export ,
72
72
ExportFormat ,
73
+ ExportRequestor ,
73
74
} ,
74
75
ExportsModel ,
75
76
} ,
@@ -288,6 +289,7 @@ impl<RT: Runtime> ExportWorker<RT> {
288
289
& mut self ,
289
290
format : ExportFormat ,
290
291
component : ComponentId ,
292
+ requestor : ExportRequestor ,
291
293
) -> anyhow:: Result < ( Timestamp , ObjectKey , FunctionUsageTracker ) > {
292
294
tracing:: info!( "Beginning snapshot export..." ) ;
293
295
let storage = & self . storage ;
@@ -346,6 +348,7 @@ impl<RT: Runtime> ExportWorker<RT> {
346
348
system_tables,
347
349
include_storage,
348
350
usage. clone ( ) ,
351
+ requestor,
349
352
) ;
350
353
let ( _, ( ) ) = try_join ! ( uploader, zipper) ?;
351
354
let zip_object_key = upload. complete ( ) . await ?;
@@ -367,6 +370,7 @@ impl<RT: Runtime> ExportWorker<RT> {
367
370
system_tables : & BTreeMap < ( TableNamespace , TableName ) , TabletId > ,
368
371
include_storage : bool ,
369
372
usage : FunctionUsageTracker ,
373
+ requestor : ExportRequestor ,
370
374
) -> anyhow:: Result < ( ) > {
371
375
let namespace: TableNamespace = component_tree. id . into ( ) ;
372
376
let component_path = component_ids_to_paths
@@ -477,19 +481,18 @@ impl<RT: Runtime> ExportWorker<RT> {
477
481
. as_ref ( )
478
482
. map ( |ct| ct. parse ( ) )
479
483
. transpose ( ) ?;
480
- usage
481
- . track_storage_call (
482
- component_path. clone ( ) ,
483
- "snapshot_export" ,
484
- file_storage_entry. storage_id . clone ( ) ,
485
- content_type,
486
- file_storage_entry. sha256 . clone ( ) ,
487
- )
488
- . track_storage_egress_size (
489
- component_path. clone ( ) ,
490
- "snapshot_export" . to_string ( ) ,
491
- file_stream. content_length as u64 ,
492
- ) ;
484
+ usage. track_storage_call (
485
+ component_path. clone ( ) ,
486
+ "snapshot_export" ,
487
+ file_storage_entry. storage_id . clone ( ) ,
488
+ content_type,
489
+ file_storage_entry. sha256 . clone ( ) ,
490
+ ) ;
491
+ self . usage_tracking . track_independent_storage_egress_size (
492
+ component_path. clone ( ) ,
493
+ requestor. usage_tag ( ) ,
494
+ file_stream. content_length as u64 ,
495
+ ) ;
493
496
zip_snapshot_upload
494
497
. stream_full_file ( path, file_stream. stream )
495
498
. await ?;
@@ -552,6 +555,7 @@ impl<RT: Runtime> ExportWorker<RT> {
552
555
system_tables,
553
556
include_storage,
554
557
usage. clone ( ) ,
558
+ requestor,
555
559
)
556
560
. await ?;
557
561
}
@@ -570,6 +574,7 @@ impl<RT: Runtime> ExportWorker<RT> {
570
574
system_tables : BTreeMap < ( TableNamespace , TableName ) , TabletId > ,
571
575
include_storage : bool ,
572
576
usage : FunctionUsageTracker ,
577
+ requestor : ExportRequestor ,
573
578
) -> anyhow:: Result < ( ) > {
574
579
let mut zip_snapshot_upload = ZipSnapshotUpload :: new ( & mut writer) . await ?;
575
580
@@ -584,6 +589,7 @@ impl<RT: Runtime> ExportWorker<RT> {
584
589
& system_tables,
585
590
include_storage,
586
591
usage,
592
+ requestor,
587
593
)
588
594
. await ?;
589
595
@@ -597,21 +603,34 @@ impl<RT: Runtime> ExportWorker<RT> {
597
603
& mut self ,
598
604
export : ParsedDocument < Export > ,
599
605
) -> anyhow:: Result < ( ) > {
600
- let ( ts, object_keys , usage) = self
601
- . export_inner ( export. format ( ) , export. component ( ) )
606
+ let ( ts, object_key , usage) = self
607
+ . export_inner ( export. format ( ) , export. component ( ) , export . requestor ( ) )
602
608
. await ?;
603
609
604
610
let mut tx = self . database . begin ( Identity :: system ( ) ) . await ?;
605
611
let completed_export =
606
612
( * export)
607
613
. clone ( )
608
- . completed ( ts, * tx. begin_timestamp ( ) , object_keys ) ?;
614
+ . completed ( ts, * tx. begin_timestamp ( ) , object_key . clone ( ) ) ?;
609
615
SystemMetadataModel :: new_global ( & mut tx)
610
616
. replace ( export. id ( ) , completed_export. try_into ( ) ?)
611
617
. await ?;
612
618
self . database
613
619
. commit_with_write_source ( tx, "export_worker_mark_complete" )
614
620
. await ?;
621
+ let object_attributes = self
622
+ . storage
623
+ . get_object_attributes ( & object_key)
624
+ . await ?
625
+ . context ( "error getting export object attributes from S3" ) ?;
626
+
627
+ // Charge file bandwidth for the upload of the snapshot to exports storage
628
+ self . usage_tracking . track_independent_storage_ingress_size (
629
+ ComponentPath :: root ( ) ,
630
+ export. requestor ( ) . usage_tag ( ) ,
631
+ object_attributes. size ,
632
+ ) ;
633
+ // Charge database bandwidth accumulated during the export
615
634
self . usage_tracking . track_call (
616
635
UdfIdentifier :: Cli ( "export" . to_string ( ) ) ,
617
636
ExecutionId :: new ( ) ,
@@ -809,7 +828,10 @@ mod tests {
809
828
use headers:: ContentType ;
810
829
use keybroker:: Identity ;
811
830
use model:: {
812
- exports:: types:: ExportFormat ,
831
+ exports:: types:: {
832
+ ExportFormat ,
833
+ ExportRequestor ,
834
+ } ,
813
835
file_storage:: types:: FileStorageEntry ,
814
836
test_helpers:: DbFixturesWithModel ,
815
837
} ;
@@ -932,6 +954,7 @@ mod tests {
932
954
include_storage : true ,
933
955
} ,
934
956
ComponentId :: Root ,
957
+ ExportRequestor :: SnapshotExport ,
935
958
)
936
959
. await ?;
937
960
@@ -1046,6 +1069,7 @@ mod tests {
1046
1069
include_storage : false ,
1047
1070
} ,
1048
1071
ComponentId :: Root ,
1072
+ ExportRequestor :: SnapshotExport ,
1049
1073
)
1050
1074
. await ?;
1051
1075
@@ -1106,6 +1130,7 @@ mod tests {
1106
1130
include_storage : false ,
1107
1131
} ,
1108
1132
child_component,
1133
+ ExportRequestor :: SnapshotExport ,
1109
1134
)
1110
1135
. await ?;
1111
1136
@@ -1199,6 +1224,7 @@ mod tests {
1199
1224
include_storage : true ,
1200
1225
} ,
1201
1226
ComponentId :: Root ,
1227
+ ExportRequestor :: SnapshotExport ,
1202
1228
)
1203
1229
. await ?;
1204
1230
@@ -1224,13 +1250,6 @@ mod tests {
1224
1250
1225
1251
let usage = usage. gather_user_stats ( ) ;
1226
1252
assert ! ( usage. database_egress_size. is_empty( ) ) ;
1227
- assert_eq ! (
1228
- * usage
1229
- . storage_egress_size
1230
- . get( & ComponentPath :: test_user( ) )
1231
- . unwrap( ) ,
1232
- 3
1233
- ) ;
1234
1253
1235
1254
Ok ( ( ) )
1236
1255
}
@@ -1268,6 +1287,7 @@ mod tests {
1268
1287
include_storage : false ,
1269
1288
} ,
1270
1289
ComponentId :: test_user ( ) ,
1290
+ ExportRequestor :: SnapshotExport ,
1271
1291
)
1272
1292
. await ?;
1273
1293
Ok ( ( ) )
0 commit comments