Skip to content

Commit 73c6bcb

Browse files
committed
fix some filesystem bugs, migrate more code to use compact_str
1 parent 59c812f commit 73c6bcb

File tree

33 files changed

+369
-231
lines changed

33 files changed

+369
-231
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
resolver = "3"
33
members = ["application", "unrar-rs"]
44
default-members = ["application"]
5+
package.rust-version = "1.93.0"
56

67
[workspace.dependencies]
78
anyhow = "1.0.98"

application/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[package]
22
name = "wings-rs"
3-
version = "0.24.2"
3+
rust-version = { workspace = true }
4+
version = "0.24.3"
45
edition = "2024"
56

67
[dependencies]

application/src/config.rs

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ fn api_file_decompression_threads() -> usize {
5656
fn api_file_compression_threads() -> usize {
5757
2
5858
}
59-
fn api_upload_limit() -> usize {
60-
100
59+
fn api_upload_limit() -> MiB {
60+
100u64.into()
6161
}
6262
fn api_max_jwt_uses() -> usize {
6363
5
@@ -345,8 +345,8 @@ fn docker_container_pid_limit() -> u64 {
345345
fn docker_installer_limits_timeout() -> u64 {
346346
30 * 60
347347
}
348-
fn docker_installer_limits_memory() -> u64 {
349-
1024
348+
fn docker_installer_limits_memory() -> MiB {
349+
1024u64.into()
350350
}
351351
fn docker_installer_limits_cpu() -> u64 {
352352
100
@@ -388,6 +388,40 @@ fn remote_query_retry_limit() -> u64 {
388388
10
389389
}
390390

391+
/// Represents a size in Mebibytes (MiB). The inner value is the number of MiB (not bytes!!).
392+
#[derive(
393+
ToSchema, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default,
394+
)]
395+
#[serde(transparent)]
396+
#[repr(transparent)]
397+
pub struct MiB(u64);
398+
399+
impl MiB {
400+
pub fn as_bytes(self) -> u64 {
401+
self.0 * 1024 * 1024
402+
}
403+
404+
pub fn as_kib(self) -> u64 {
405+
self.0 * 1024
406+
}
407+
408+
pub fn as_mib(self) -> u64 {
409+
self.0
410+
}
411+
}
412+
413+
impl From<u64> for MiB {
414+
fn from(value: u64) -> Self {
415+
MiB(value)
416+
}
417+
}
418+
419+
impl From<i64> for MiB {
420+
fn from(value: i64) -> Self {
421+
MiB(value as u64)
422+
}
423+
}
424+
391425
nestify::nest! {
392426
#[derive(ToSchema, Deserialize, Serialize, DefaultFromSerde)]
393427
pub struct InnerConfig {
@@ -451,8 +485,7 @@ nestify::nest! {
451485
#[serde(default = "api_file_compression_threads")]
452486
pub file_compression_threads: usize,
453487
#[serde(default = "api_upload_limit")]
454-
/// MiB
455-
pub upload_limit: usize,
488+
pub upload_limit: MiB,
456489
#[serde(default = "api_max_jwt_uses")]
457490
pub max_jwt_uses: usize,
458491
#[serde(default)]
@@ -612,11 +645,9 @@ nestify::nest! {
612645
#[schema(inline)]
613646
pub backups: #[derive(ToSchema, Deserialize, Serialize, DefaultFromSerde)] #[serde(default)] pub struct SystemBackups {
614647
#[serde(default)]
615-
/// MiB/s
616-
pub write_limit: u64,
648+
pub write_limit: MiB,
617649
#[serde(default)]
618-
/// MiB/s
619-
pub read_limit: u64,
650+
pub read_limit: MiB,
620651
#[serde(default)]
621652
pub compression_level: crate::io::compression::CompressionLevel,
622653

@@ -699,8 +730,7 @@ nestify::nest! {
699730
#[schema(inline)]
700731
pub transfers: #[derive(ToSchema, Deserialize, Serialize, DefaultFromSerde)] #[serde(default)] pub struct SystemTransfers {
701732
#[serde(default)]
702-
/// MiB/s
703-
pub download_limit: u64,
733+
pub download_limit: MiB,
704734
},
705735
},
706736
#[serde(default)]
@@ -781,8 +811,7 @@ nestify::nest! {
781811
pub timeout: u64,
782812

783813
#[serde(default = "docker_installer_limits_memory")]
784-
/// MiB
785-
pub memory: u64,
814+
pub memory: MiB,
786815
#[serde(default = "docker_installer_limits_cpu")]
787816
/// %
788817
pub cpu: u64,
@@ -798,7 +827,7 @@ nestify::nest! {
798827

799828
#[serde(default)]
800829
/// Memory Limit MiB -> Multiplier
801-
pub multipliers: BTreeMap<i64, f64>,
830+
pub multipliers: BTreeMap<MiB, f64>,
802831
},
803832

804833
#[serde(default)]
@@ -862,11 +891,11 @@ impl DockerOverhead {
862891
/// means, <=1024MiB ram = 1.05 multiplier,
863892
/// <=2048MiB ram = 1.10 multiplier,
864893
/// >2048MiB ram = 1.05 multiplier (default_multiplier)
865-
pub fn get_mutiplier(&self, memory: i64) -> f64 {
894+
pub fn get_mutiplier(&self, memory: MiB) -> f64 {
866895
if !self.r#override {
867-
if memory <= 2048 {
896+
if memory.as_mib() <= 2048 {
868897
return 1.15;
869-
} else if memory <= 4096 {
898+
} else if memory.as_mib() <= 4096 {
870899
return 1.10;
871900
}
872901

@@ -885,10 +914,10 @@ impl DockerOverhead {
885914
}
886915

887916
#[inline]
888-
pub fn get_memory(&self, memory: i64) -> i64 {
917+
pub fn get_memory(&self, memory: MiB) -> MiB {
889918
let multiplier = self.get_mutiplier(memory);
890919

891-
(memory as f64 * multiplier) as i64
920+
MiB((memory.as_mib() as f64 * multiplier) as u64)
892921
}
893922
}
894923

application/src/routes/api/servers/_server_/files/copy_remote.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ mod post {
163163
let inner = async {
164164
let mut walker = filesystem
165165
.async_walk_dir_files_stream(
166-
root.clone(),
166+
&root,
167167
files.into_iter().map(PathBuf::from).collect(),
168168
ignored,
169169
)

application/src/routes/api/transfers/files.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ mod post {
171171
let reader = tokio_util::io::SyncIoBridge::new(reader);
172172
let reader = LimitedReader::new_with_bytes_per_second(
173173
reader,
174-
state.config.system.transfers.download_limit * 1024 * 1024,
174+
state.config.system.transfers.download_limit.as_bytes(),
175175
);
176176
let reader = HashReader::new_with_hasher(reader, sha2::Sha256::new());
177177
let reader = CompressionReader::new(

application/src/routes/api/transfers/mod.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ mod post {
179179
let reader = AbortReader::new(reader, listener.clone());
180180
let reader = LimitedReader::new_with_bytes_per_second(
181181
reader,
182-
state.config.system.transfers.download_limit * 1024 * 1024,
182+
state.config.system.transfers.download_limit.as_bytes(),
183183
);
184184
let reader =
185185
HashReader::new_with_hasher(reader, sha2::Sha256::new());
@@ -409,9 +409,7 @@ mod post {
409409
let reader = AbortReader::new(reader, listener.clone());
410410
let reader = LimitedReader::new_with_bytes_per_second(
411411
reader,
412-
state.config.system.transfers.download_limit
413-
* 1024
414-
* 1024,
412+
state.config.system.transfers.download_limit.as_bytes(),
415413
);
416414
let mut reader = HashReader::new_with_hasher(
417415
reader,
@@ -603,7 +601,7 @@ mod post {
603601
.websocket
604602
.send(crate::server::websocket::WebsocketMessage::new(
605603
crate::server::websocket::WebsocketEvent::ServerTransferStatus,
606-
["completed".to_string()].into(),
604+
["completed".into()].into(),
607605
))
608606
.ok();
609607
}
@@ -649,7 +647,7 @@ mod post {
649647
.websocket
650648
.send(crate::server::websocket::WebsocketMessage::new(
651649
crate::server::websocket::WebsocketEvent::ServerTransferStatus,
652-
["completed".to_string()].into(),
650+
["completed".into()].into(),
653651
))
654652
.ok();
655653
}

application/src/routes/api/update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mod post {
2828
key: Option<String>,
2929
}>,
3030

31-
upload_limit: Option<usize>,
31+
upload_limit: Option<crate::config::MiB>,
3232
}>,
3333

3434
#[schema(inline)]

application/src/routes/download/files.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ mod get {
8383

8484
let mut folder_ascii = String::new();
8585
for (i, file_path) in payload.file_paths.iter().enumerate() {
86-
let file_name = PathBuf::from(file_path)
86+
let file_name = Path::new(file_path)
8787
.file_name()
8888
.unwrap_or_default()
8989
.to_string_lossy()

application/src/routes/upload/file.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,18 +195,18 @@ mod post {
195195

196196
while let Some(chunk) = field.chunk().await? {
197197
if crate::unlikely(
198-
written_size + chunk.len() > state.config.api.upload_limit * 1024 * 1024,
198+
written_size + chunk.len() as u64 > state.config.api.upload_limit.as_bytes(),
199199
) {
200200
return ApiResponse::error(&format!(
201201
"file size is larger than {}MB",
202-
state.config.api.upload_limit
202+
state.config.api.upload_limit.as_mib()
203203
))
204204
.with_status(StatusCode::EXPECTATION_FAILED)
205205
.ok();
206206
}
207207

208208
writer.write_all(&chunk).await?;
209-
written_size += chunk.len();
209+
written_size += chunk.len() as u64;
210210
}
211211

212212
writer.shutdown().await?;

0 commit comments

Comments
 (0)