Skip to content

Commit 05befcb

Browse files
committed
Refactors version retrieval for concurrency
1 parent c3edfcb commit 05befcb

2 files changed

Lines changed: 103 additions & 100 deletions

File tree

daedalus_client/src/forge/mod.rs

Lines changed: 69 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -733,84 +733,85 @@ pub async fn retrieve_data(
733733
}
734734
//futures::future::try_join_all(version_futures).await?;
735735

736-
// Get old manifest versions for merging
737-
let old_manifest_versions = if let Ok(old_versions) = Arc::try_unwrap(old_versions) {
738-
old_versions.into_inner()
739-
} else {
740-
Vec::new()
736+
// Extract versions by locking the mutex instead of try_unwrap
737+
// This avoids silent failures when Arc still has strong references from async closures
738+
let old_manifest_versions = {
739+
let mut guard = old_versions.lock().await;
740+
std::mem::take(&mut *guard)
741741
};
742742

743-
if let Ok(versions) = Arc::try_unwrap(versions) {
744-
let new_versions = versions.into_inner();
745-
746-
// Merge new versions with old ones to preserve existing data
747-
let mut final_versions = old_manifest_versions;
743+
let new_versions = {
744+
let mut guard = versions.lock().await;
745+
std::mem::take(&mut *guard)
746+
};
748747

749-
for new_version in new_versions {
750-
if let Some(existing) = final_versions.iter_mut().find(|v| v.id == new_version.id) {
751-
// Merge loaders: keep old loaders + add/update new ones
752-
for new_loader in new_version.loaders {
753-
if let Some(existing_loader) = existing.loaders.iter_mut().find(|l| l.id == new_loader.id) {
754-
let loader_id = new_loader.id.clone();
755-
*existing_loader = new_loader;
756-
info!("✅ Forge - Updated loader: {}/{}", existing.id, loader_id);
757-
} else {
758-
info!("✅ Forge - Added new loader: {}/{}", existing.id, new_loader.id);
759-
existing.loaders.push(new_loader);
760-
}
748+
// Merge new versions with old ones to preserve existing data
749+
let mut final_versions = old_manifest_versions;
750+
751+
for new_version in new_versions {
752+
if let Some(existing) = final_versions.iter_mut().find(|v| v.id == new_version.id) {
753+
// Merge loaders: keep old loaders + add/update new ones
754+
for new_loader in new_version.loaders {
755+
if let Some(existing_loader) = existing.loaders.iter_mut().find(|l| l.id == new_loader.id) {
756+
let loader_id = new_loader.id.clone();
757+
*existing_loader = new_loader;
758+
info!("✅ Forge - Updated loader: {}/{}", existing.id, loader_id);
759+
} else {
760+
info!("✅ Forge - Added new loader: {}/{}", existing.id, new_loader.id);
761+
existing.loaders.push(new_loader);
761762
}
762-
} else {
763-
info!("✅ Forge - Added new Minecraft version: {}", new_version.id);
764-
final_versions.push(new_version);
765763
}
764+
} else {
765+
info!("✅ Forge - Added new Minecraft version: {}", new_version.id);
766+
final_versions.push(new_version);
766767
}
768+
}
767769

768-
// Sort versions
769-
final_versions.sort_by(|x, y| {
770-
minecraft_versions
771-
.versions
772-
.iter()
773-
.position(|z| {
774-
x.id.replace("1.7.10_pre4", "1.7.10-pre4") == z.id
775-
})
776-
.unwrap_or_default()
777-
.cmp(
778-
&minecraft_versions
779-
.versions
780-
.iter()
781-
.position(|z| {
782-
y.id.replace("1.7.10_pre4", "1.7.10-pre4") == z.id
783-
})
784-
.unwrap_or_default(),
785-
)
786-
});
787-
788-
// Sort loaders within each version
789-
for version in &mut final_versions {
790-
let loader_versions = maven_metadata.get(&version.id);
791-
if let Some(loader_versions) = loader_versions {
792-
version.loaders.sort_by(|x, y| {
793-
loader_versions
794-
.iter()
795-
.position(|z| &y.id == z)
796-
.unwrap_or_default()
797-
.cmp(
798-
&loader_versions
799-
.iter()
800-
.position(|z| &x.id == z)
801-
.unwrap_or_default(),
802-
)
803-
})
804-
}
770+
// Sort versions
771+
final_versions.sort_by(|x, y| {
772+
minecraft_versions
773+
.versions
774+
.iter()
775+
.position(|z| {
776+
x.id.replace("1.7.10_pre4", "1.7.10-pre4") == z.id
777+
})
778+
.unwrap_or_default()
779+
.cmp(
780+
&minecraft_versions
781+
.versions
782+
.iter()
783+
.position(|z| {
784+
y.id.replace("1.7.10_pre4", "1.7.10-pre4") == z.id
785+
})
786+
.unwrap_or_default(),
787+
)
788+
});
789+
790+
// Sort loaders within each version
791+
for version in &mut final_versions {
792+
let loader_versions = maven_metadata.get(&version.id);
793+
if let Some(loader_versions) = loader_versions {
794+
version.loaders.sort_by(|x, y| {
795+
loader_versions
796+
.iter()
797+
.position(|z| &y.id == z)
798+
.unwrap_or_default()
799+
.cmp(
800+
&loader_versions
801+
.iter()
802+
.position(|z| &x.id == z)
803+
.unwrap_or_default(),
804+
)
805+
})
805806
}
806-
807-
// Set the full Forge versions JSON in manifest_builder with nested structure
808-
// This preserves game version -> loader version mappings
809-
let versions_json = serde_json::to_value(&final_versions)?;
810-
manifest_builder.set_loader_versions("forge", versions_json);
811-
info!(version_count = final_versions.len(), "Set Forge versions with nested structure in CAS manifest builder");
812807
}
813808

809+
// Set the full Forge versions JSON in manifest_builder with nested structure
810+
// This preserves game version -> loader version mappings
811+
let versions_json = serde_json::to_value(&final_versions)?;
812+
manifest_builder.set_loader_versions("forge", versions_json);
813+
info!(version_count = final_versions.len(), "Set Forge versions with nested structure in CAS manifest builder");
814+
814815
Ok(())
815816
}
816817

daedalus_client/src/neoforge/mod.rs

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -462,41 +462,43 @@ pub async fn retrieve_data(
462462
}
463463
}
464464

465-
if let Ok(versions) = Arc::try_unwrap(versions) {
466-
let new_versions = versions.into_inner();
467-
468-
// Get old versions for merging
469-
let old_manifest_versions = if let Ok(old_versions) = Arc::try_unwrap(old_versions) {
470-
old_versions.into_inner()
471-
} else {
472-
Vec::new()
473-
};
474-
475-
// Use common version merging logic
476-
let mut final_versions = merge_loader_versions(
477-
old_manifest_versions,
478-
new_versions,
479-
"NeoForge"
480-
);
481-
482-
// Use common sorting utilities
483-
sort_by_minecraft_order(&mut final_versions, minecraft_versions);
484-
485-
// Sort loaders within each version using metadata order
486-
for version in &mut final_versions {
487-
if let Some(loader_versions) = maven_metadata.get(&version.id) {
488-
let loader_order: Vec<String> = loader_versions.iter().map(|(id, _)| id.clone()).collect();
489-
sort_loaders_by_metadata(version, &loader_order);
490-
}
465+
// Extract versions by locking the mutex instead of try_unwrap
466+
// This avoids silent failures when Arc still has strong references from async closures
467+
let new_versions = {
468+
let mut guard = versions.lock().await;
469+
std::mem::take(&mut *guard)
470+
};
471+
472+
// Get old versions for merging
473+
let old_manifest_versions = {
474+
let mut guard = old_versions.lock().await;
475+
std::mem::take(&mut *guard)
476+
};
477+
478+
// Use common version merging logic
479+
let mut final_versions = merge_loader_versions(
480+
old_manifest_versions,
481+
new_versions,
482+
"NeoForge"
483+
);
484+
485+
// Use common sorting utilities
486+
sort_by_minecraft_order(&mut final_versions, minecraft_versions);
487+
488+
// Sort loaders within each version using metadata order
489+
for version in &mut final_versions {
490+
if let Some(loader_versions) = maven_metadata.get(&version.id) {
491+
let loader_order: Vec<String> = loader_versions.iter().map(|(id, _)| id.clone()).collect();
492+
sort_loaders_by_metadata(version, &loader_order);
491493
}
492-
493-
// Set the full NeoForge versions JSON in manifest_builder with nested structure
494-
// This preserves game version -> loader version mappings
495-
let versions_json = serde_json::to_value(&final_versions)?;
496-
manifest_builder.set_loader_versions("neoforge", versions_json);
497-
info!(version_count = final_versions.len(), "Set NeoForge versions with nested structure in CAS manifest builder");
498494
}
499495

496+
// Set the full NeoForge versions JSON in manifest_builder with nested structure
497+
// This preserves game version -> loader version mappings
498+
let versions_json = serde_json::to_value(&final_versions)?;
499+
manifest_builder.set_loader_versions("neoforge", versions_json);
500+
info!(version_count = final_versions.len(), "Set NeoForge versions with nested structure in CAS manifest builder");
501+
500502
Ok(())
501503
}
502504

0 commit comments

Comments
 (0)