Skip to content

Commit bc8a2a0

Browse files
nipunn1313Convex, Inc.
authored andcommitted
Save size of completed export in the database (#42697)
This will be useful for measuring usage, and showing sizes on dashboard and in future backup APIs. GitOrigin-RevId: 6760da8464a43e3b518ac12389543f74eaeccdbb
1 parent b97b7ac commit bc8a2a0

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

crates/application/src/exports/worker.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,12 @@ impl<RT: Runtime> ExportWorker<RT> {
322322
.0?
323323
};
324324

325+
let object_attributes = self
326+
.exports_storage
327+
.get_object_attributes(&object_key)
328+
.await?
329+
.context("error getting export object attributes from S3")?;
330+
325331
// Export is done; mark it as such.
326332
tracing::info!("Export {id} completed");
327333
self.database
@@ -344,6 +350,7 @@ impl<RT: Runtime> ExportWorker<RT> {
344350
snapshot_ts,
345351
*tx.begin_timestamp(),
346352
object_key,
353+
object_attributes.size,
347354
)?;
348355
SystemMetadataModel::new_global(tx)
349356
.replace(id, completed_export.try_into()?)
@@ -356,12 +363,6 @@ impl<RT: Runtime> ExportWorker<RT> {
356363
)
357364
.await?;
358365

359-
let object_attributes = self
360-
.exports_storage
361-
.get_object_attributes(&object_key)
362-
.await?
363-
.context("error getting export object attributes from S3")?;
364-
365366
let tag = requestor.usage_tag().to_string();
366367
let call_type = match requestor {
367368
ExportRequestor::SnapshotExport => CallType::Export,

crates/model/src/exports/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,10 @@ mod tests {
359359
check_roundtrip(&in_progress_export);
360360

361361
// Completed
362-
let export = in_progress_export
363-
.clone()
364-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
362+
let export =
363+
in_progress_export
364+
.clone()
365+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
365366
check_roundtrip(&export);
366367

367368
// Failed
@@ -479,7 +480,7 @@ mod tests {
479480
ts_u64 + 1000,
480481
)
481482
.in_progress(ts)?
482-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
483+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
483484
exports_model.insert_export(export).await?;
484485
let backups = exports_model.list_unexpired_cloud_backups().await?;
485486
assert!(backups.is_empty());
@@ -494,7 +495,7 @@ mod tests {
494495
ts_u64 - 1000,
495496
)
496497
.in_progress(ts)?
497-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
498+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
498499
exports_model.insert_export(export).await?;
499500
let backups = exports_model.list_unexpired_cloud_backups().await?;
500501
assert!(backups.is_empty());
@@ -509,7 +510,7 @@ mod tests {
509510
ts_u64 + 1000,
510511
)
511512
.in_progress(ts)?
512-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
513+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
513514
exports_model.insert_export(export).await?;
514515
let backups = exports_model.list_unexpired_cloud_backups().await?;
515516
assert_eq!(backups.len(), 1);
@@ -535,7 +536,7 @@ mod tests {
535536
ts_u64 + 1000,
536537
)
537538
.in_progress(ts)?
538-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
539+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
539540
let id = exports_model.insert_export(export).await?;
540541

541542
let new_expiration = ts_u64 + 2000;
@@ -572,7 +573,7 @@ mod tests {
572573
ts_u64,
573574
)
574575
.in_progress(ts)?
575-
.completed(ts, ts, ObjectKey::try_from("asdf")?)?;
576+
.completed(ts, ts, ObjectKey::try_from("asdf")?, 5)?;
576577
exports_model.insert_export(export).await?;
577578
assert_eq!(exports_model.list().await?.len(), 1);
578579
let toremove = exports_model
@@ -642,6 +643,7 @@ mod tests {
642643
ts,
643644
ts,
644645
ObjectKey::try_from("asdf")?,
646+
5,
645647
)?,
646648
initial_export.clone().in_progress(ts)?.failed(ts, ts)?,
647649
initial_export.clone().canceled(ts)?,

crates/model/src/exports/types.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ pub enum Export {
6666
format: ExportFormat,
6767
component: ComponentId,
6868
requestor: ExportRequestor,
69+
size: u64,
6970
},
7071
Failed {
7172
/// Timestamp for the failed (final) attempt at Export.
@@ -127,6 +128,8 @@ pub enum SerializedExport {
127128
format: SerializedExportFormat,
128129
component: Option<String>,
129130
requestor: String,
131+
#[serde(default)] // 0-default for backward compatibility
132+
size: i64,
130133
},
131134
Failed {
132135
start_ts: u64,
@@ -187,6 +190,7 @@ impl TryFrom<Export> for SerializedExport {
187190
format,
188191
component,
189192
requestor,
193+
size,
190194
} => SerializedExport::Completed {
191195
start_ts: start_ts.into(),
192196
complete_ts: complete_ts.into(),
@@ -195,6 +199,7 @@ impl TryFrom<Export> for SerializedExport {
195199
format: format.into(),
196200
component: component.serialize_to_string(),
197201
requestor: requestor.to_string(),
202+
size: size as i64,
198203
},
199204
Export::Failed {
200205
start_ts,
@@ -267,6 +272,7 @@ impl TryFrom<SerializedExport> for Export {
267272
format,
268273
component,
269274
requestor,
275+
size,
270276
} => Export::Completed {
271277
start_ts: start_ts.try_into()?,
272278
complete_ts: complete_ts.try_into()?,
@@ -275,6 +281,7 @@ impl TryFrom<SerializedExport> for Export {
275281
format: format.into(),
276282
component: ComponentId::deserialize_from_string(component.as_deref())?,
277283
requestor: requestor.parse()?,
284+
size: size as u64,
278285
},
279286
SerializedExport::Failed {
280287
start_ts,
@@ -474,6 +481,7 @@ impl Export {
474481
snapshot_ts: Timestamp,
475482
complete_ts: Timestamp,
476483
zip_object_key: ObjectKey,
484+
size: u64,
477485
) -> anyhow::Result<Export> {
478486
match self {
479487
Self::InProgress {
@@ -494,6 +502,7 @@ impl Export {
494502
format,
495503
component,
496504
requestor,
505+
size,
497506
})
498507
},
499508
Self::Requested {
@@ -510,6 +519,7 @@ impl Export {
510519
format: _,
511520
component: _,
512521
requestor: _,
522+
size: _,
513523
}
514524
| Self::Failed {
515525
start_ts: _,
@@ -561,6 +571,7 @@ impl Export {
561571
format: _,
562572
component: _,
563573
requestor: _,
574+
size: _,
564575
}
565576
| Self::Failed {
566577
start_ts: _,

0 commit comments

Comments
 (0)