Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

`rc mirror` Upload Performance

Ouverte
#385 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
78/100
Type d'issue
Fonctionnalité
Clarté
Clairement spécifiée
Activité
Active
Stack technique
rust
Domaine
cli, performance

Piste de recherche

Start in crates/s3/src/client.rs around lines 4300-4312, then inspect the single-part and multipart upload paths and their handling of ObjectWritePrecondition. Use the reported nested-folder benchmark as the validation baseline. Done means small preconditioned files avoid unnecessary multipart requests while If-None-Match and If-Match behavior remains correct.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

I recently compared the upload performance of rc mirror vs MinIO's mc mirror against a RustFS server.

Generally, rc mirror turned out to be about six times slower than mc mirror on my machine. I did some investigation and found two major causes for this:

  1. mc mirror seems to use stronger parallelization per default
  2. Small files get uploaded by mc mirror as single PutObject operations, whereas rc mirror always uses a multipart upload.

Point 2 means that for small files, rc mirror makes three requests instead of one, and accordingly triples the upload time. In the code (crates/s3/src/client.rs line 4300-4312, I found a reason for that, namely

// RustFS evaluates write preconditions for multipart completion. Keep
// ordinary small uploads on PutObject, but route conditional path writes
// through multipart so mirror retains compare-and-swap semantics on the
// currently deployed service.
if Self::should_use_multipart(file_size)
    || !matches!(precondition, ObjectWritePrecondition::None)
{
    self.put_object_multipart_from_path(path, file_path, file_size, options, on_progress)
        .await
} else {
    self.put_object_single_part_from_path(path, file_path, file_size, options)
        .await
}

So I understand that's a safeguard to ensure write preconditions are respected. However, since version 1.0.0-alpha.47 (rustfs/rustfs#409), RustFS also enforces If-None-Match/If-Match write preconditions on PutObject itself.
I would therefore suggest to drop the multipart upload route for small files with preconditions. I have already tested it (approx. 25k files in a nested folder structure, with average file size of ~25 KB), and it expectedly increases upload performance by roughly a factor of three for small files (still significantly slower than mc, though):

Command Number of runs Average real time Average user time Average sys time
mc mirror 10 25.120s 9.295s 9.815s
rc mirror 10 168.318s 12.236s 16.648s
rc mirror (skip multipart for small files) 10 42.561s 6.254s 9.561s

Are there any objections against this change? If not, I'd be happy to set up a PR.

Langage dominant
Rust
Étoiles
159
Forks
23
Merge moyen
7 h 4 min
PR mergées (30 j)
10

Préparer son environnement

  • Fournit un Dockerfile ou un fichier Docker Compose
  • Aucun modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de rustfs/cli

Toutes les issues de rustfs/cli

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.