2012-02-10 2 views
1

Je dois déplacer de gros fichiers (> 5 Go) sur Amazon S3 avec boto, de et vers le même compartiment. Pour cela, j'ai besoin d'utiliser l'API multipart, qui n'utilise pas les sommes md5 pour etags.Comment vérifier si deux gros fichiers sont identiques sur amazon S3?

Bien que je pense (bien sûr seulement 98%) que mon code est correct, je voudrais vérifier que la nouvelle copie n'est pas corrompue avant de supprimer l'original. Cependant, je n'ai trouvé aucune méthode à part télécharger les deux objets et les comparer localement, ce qui est assez long pour les fichiers de plus de 5 Go. Pour l'anecdote, voici mon code pour copier un gros fichier avec boto, peut-être que cela peut aider quelqu'un. S'il n'y a pas de bonne solution à mon problème, peut-être que quelqu'un trouvera un bug et m'empêchera de corrompre les données.

import boto 

copy_size = 1000000000 #1e9 
bucket_name = 'mybucket' 
orig_key_name = 'ABigFile' 
dest_key_name = 'ABigFile.clone' 

s3 = boto.connect_s3() 
mybucket = s3.get_bucket(bucket_name) 

key = mybucket.get_key(orig_key_name) 

mp = mybucket.initiate_multipart_upload(dest_key_name) #keyname 

print 'key size: ', key.size 

count = 1 
start = 0 
end = -1 

while end < key.size-1: 
    print 'count: ', count 
    start = end + 1 
    end = min(key.size -1 , start + copy_size) 
    mp.copy_part_from_key(bucket_name, orig_key_name, count , start, end) 
    count+=1 

mp.complete_upload() 

Ce code ne fonctionne que pour les tailles de clé d'origine> = 5368709121 octets.

+0

Testez avec deux petits fichiers d'environ 1 Ko. – istruble

+1

@istruble: bien, multipart ne fonctionne que pour les blocs 5BM +. Mais encore, je ne peux que tester quelques fichiers et espérer que la partie amazon est libre de tout bug et que mes tests étaient exhaustifs. – ascobol

+0

Merci. J'ai appris quelque chose de nouveau aujourd'hui. – istruble

Répondre

1

Vous devriez pouvoir calculer un hachage SHA-1 sur un flux de données (see this SO thread pour le code C++, ce qui pourrait donner des indications pour une approche python). En redirigeant votre flux de données haché vers l'équivalent de /dev/null, vous devriez pouvoir comparer les hachages SHA-1 de deux fichiers sans les télécharger au préalable localement.

+0

Je doute que cela fonctionnera à distance avec amazon S3 ... – ascobol

+0

Vous êtes en train de télécharger des données pour calculer un hachage, mais ne stocke pas les données. En ce qui concerne un programme donné, S3 est juste une autre source de données, accessible via des requêtes web. –

+0

Je vois, il est temps d'essayer EC2 :) – ascobol

0

Il n'y a aucun moyen de faire ce que vous voulez sans savoir comment AWS calcule l'etag sur les téléchargements multipart. Si vous avez une copie locale de l'objet, vous pouvez calculer le md5 de chaque partie que vous copiez sur l'objet local et le comparer à l'etag dans la clé que chaque mp.copy_part_from_key() renvoie. On dirait que vous n'avez aucun objet local cependant.

Vous avez également un petit problème non évident se cachant dans boto qui peut ou ne peut pas vous faire perdre des données dans un cas très rare. Si vous regardez le code source de boto, vous remarquerez que la fonction mp.complete_upload() n'utilise en fait aucune des étiquettes pour les parties retournées par AWS lors du téléchargement. Quand vous utilisez multipart_complete, il fait lui-même une liste multipart tout à fait nouvelle et obtient une nouvelle liste de parties et de etags de S3. Ceci est risqué en raison de la cohérence éventuelle et la liste peut ou peut ne pas être complète. Le multipart_complete() devrait idéalement utiliser les informations de etags qui ont été retournées par chaque copie à distance pour être complètement sûr. C'est ce que recommande Amazon dans sa documentation (voir la note sous Multipart Upload Listings). Cela dit, il est moins probable que ce soit un problème si vous confirmez que la taille du fichier des deux objets est la même. Le pire des cas, je crois, est qu'une partie n'est pas répertoriée dans la liste de téléchargement en plusieurs parties. Une partie listée ne devrait jamais être incorrecte elle-même.

Questions connexes