Skip to content

Commit becccf9

Browse files
committed
cvm: Add built-in swap config
1 parent ec8e251 commit becccf9

5 files changed

Lines changed: 62 additions & 16 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dstack-types/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ license.workspace = true
1313
serde = { workspace = true, features = ["derive"] }
1414
serde-human-bytes.workspace = true
1515
sha3.workspace = true
16+
size-parser = { workspace = true, features = ["serde"] }

dstack-types/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use serde::{Deserialize, Serialize};
66
use serde_human_bytes as hex_bytes;
7+
use size_parser::human_size;
78

89
#[derive(Deserialize, Serialize, Debug, Clone)]
910
pub struct AppCompose {
@@ -39,6 +40,8 @@ pub struct AppCompose {
3940
pub no_instance_id: bool,
4041
#[serde(default = "default_true")]
4142
pub secure_time: bool,
43+
#[serde(default, with = "human_size")]
44+
pub swap_size: u64,
4245
}
4346

4447
fn default_true() -> bool {

dstack-util/src/system_setup.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use dstack_types::{
1818
KeyProvider, KeyProviderInfo,
1919
};
2020
use fs_err as fs;
21+
use fs_err::os::unix::fs::OpenOptionsExt as _;
2122
use luks2::{
2223
LuksAf, LuksConfig, LuksDigest, LuksHeader, LuksJson, LuksKdf, LuksKeyslot, LuksSegment,
2324
LuksSegmentSize,
@@ -621,6 +622,43 @@ impl<'a> Stage0<'a> {
621622
}
622623
}
623624

625+
async fn setup_swap(&self, swap_size: u64) -> Result<()> {
626+
let swap_file = self.args.mount_point.join("swapfile");
627+
let swap_path = swap_file
628+
.to_str()
629+
.ok_or_else(|| anyhow!("Invalid swap file path"))?;
630+
631+
if swap_size == 0 {
632+
if swap_file.exists() {
633+
fs::remove_file(&swap_file).context("Failed to remove swap file")?;
634+
}
635+
return Ok(());
636+
}
637+
638+
info!("Setting up swap file at {swap_path} (size {swap_size} bytes)");
639+
{
640+
let file = fs::OpenOptions::new()
641+
.create(true)
642+
.write(true)
643+
.mode(0o600)
644+
.custom_flags(libc::O_NOFOLLOW)
645+
.open(&swap_file)
646+
.context("Failed to open swap file")?;
647+
file.set_len(swap_size)
648+
.context("Failed to set swap file size")?;
649+
file.sync_all().context("Failed to sync swap file")?;
650+
}
651+
652+
let _ = cmd! {
653+
chmod 600 $swap_path;
654+
mkswap -f $swap_path;
655+
swapon $swap_path;
656+
}
657+
.context("Failed to enable swap")?;
658+
659+
Ok(())
660+
}
661+
624662
async fn mount_data_disk(&self, initialized: bool, disk_crypt_key: &str) -> Result<()> {
625663
let name = "dstack_data_disk";
626664
let fs_dev = "/dev/mapper/".to_string() + name;
@@ -805,6 +843,9 @@ impl<'a> Stage0<'a> {
805843
self.vmm.notify_q("boot.progress", "unsealing env").await;
806844
self.mount_data_disk(is_initialized, &hex::encode(&app_keys.disk_crypt_key))
807845
.await?;
846+
847+
self.setup_swap(self.shared.app_compose.swap_size).await?;
848+
808849
self.vmm
809850
.notify_q(
810851
"instance.info",

vmm/src/main_service.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -173,22 +173,22 @@ pub fn create_manifest_from_vm_config(
173173
None => GpuConfig::default(),
174174
};
175175

176-
Ok(Manifest::builder()
177-
.id(id)
178-
.name(request.name.clone())
179-
.app_id(app_id)
180-
.image(request.image.clone())
181-
.vcpu(request.vcpu)
182-
.memory(request.memory)
183-
.disk_size(request.disk_size)
184-
.port_map(port_map)
185-
.created_at_ms(now)
186-
.hugepages(request.hugepages)
187-
.pin_numa(request.pin_numa)
188-
.gpus(gpus)
189-
.kms_urls(request.kms_urls.clone())
190-
.gateway_urls(request.gateway_urls.clone())
191-
.build())
176+
Ok(Manifest {
177+
id,
178+
name: request.name.clone(),
179+
app_id,
180+
vcpu: request.vcpu,
181+
memory: request.memory,
182+
disk_size: request.disk_size,
183+
image: request.image.clone(),
184+
port_map,
185+
created_at_ms: now,
186+
hugepages: request.hugepages,
187+
pin_numa: request.pin_numa,
188+
gpus: Some(gpus),
189+
kms_urls: request.kms_urls.clone(),
190+
gateway_urls: request.gateway_urls.clone(),
191+
})
192192
}
193193

194194
impl RpcHandler {

0 commit comments

Comments
 (0)