読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

s3: s3cmdでGet出来ねえ

Scala/Sprayを使って自作しているS3ソフトウェアのテストである.

s3cmdを使ってのテストを再開する. 一通りの動作は, AWS SDK for Javaを使ってテストされているが, 違うツールを使ってテストをすると, バグが発見出来ることもある. s3cmdでの利用はサポートしたいので, ここでエラーが出るならバグと認定して良い.

ちまちまとコマンドを叩いてやってみる.

$ s3cmd ls
$ s3cmd mb s3://myb
Bucket 's3://myb/' created
$ s3cmd ls
2015-09-17 02:09  s3://myb
  • Get Serviceで, このアカウントに紐付いた全バケットを表示している.
  • mb (make bucket)でmybという名前のバケットを作る.
  • mybが表示出来ている. GMTでお時間が表示されているが, これ自体は間違いとはいえない.

OK

$ s3cmd ls s3://myb
$ s3cmd put unko s3://myb
WARNING: Module python-magic is not available. Guessing MIME types based on file extensions.
unko -> s3://myb/unko  [1 of 1]
 5 of 5   100% in    0s    30.73 B/s  done
$ s3cmd ls s3://myb
2015-09-17 02:12         5   s3://myb/unko
$ s3cmd du
5        s3://myb/
--------
5        Total
  • mybの中身を見てみる. 空
  • mybにunkoをputしてみる. unkoのputに成功した.
  • mybの中にunkoがあることを確認した.
  • duで容量を見ると, mybの容量が5byteだと確認出来た.

OK

$ s3cmd get s3://myb/unko daiben
s3://myb/unko -> daiben  [1 of 1]

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please try reproducing the error using
  the latest s3cmd code from the git master
  branch found at:
    https://github.com/s3tools/s3cmd
  If the error persists, please report the
  following lines (removing any private
  info as necessary) to:
   s3tools-bugs@lists.sourceforge.net

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Invoked as: /usr/local/Cellar/s3cmd/1.5.2/libexec/bin/s3cmd get s3://myb/unko daiben
Problem: KeyError: 'content-length'
S3cmd:   1.5.2
python:   2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]
environment LANG=ja_JP.UTF-8

Traceback (most recent call last):
  File "/usr/local/Cellar/s3cmd/1.5.2/libexec/bin/s3cmd", line 2548, in <module>
    rc = main()
  File "/usr/local/Cellar/s3cmd/1.5.2/libexec/bin/s3cmd", line 2460, in main
    rc = cmd_func(args)
  File "/usr/local/Cellar/s3cmd/1.5.2/libexec/bin/s3cmd", line 532, in cmd_object_get
    response = s3.object_get(uri, dst_stream, start_position = start_position, extra_label = seq_label)
  File "/usr/local/Cellar/s3cmd/1.5.2/libexec/lib/python2.7/site-packages/S3/S3.py", line 598, in object_get
    response = self.recv_file(request, stream, labels, start_position)
  File "/usr/local/Cellar/s3cmd/1.5.2/libexec/lib/python2.7/site-packages/S3/S3.py", line 1285, in recv_file
    size_left = int(response["headers"]["content-length"])
KeyError: 'content-length'

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please try reproducing the error using
  the latest s3cmd code from the git master
  branch found at:
    https://github.com/s3tools/s3cmd
  If the error persists, please report the
  above lines (removing any private
  info as necessary) to:
   s3tools-bugs@lists.sourceforge.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

$ ls daiben
daiben
$ cat unko
unko
$ cat daiben

オーノー

  • unkoをdaibenとしてgetしようとしたらエラーが出た. content-lengthを期待しているが, 存在しないため(KeyErrorはそういう意味ですよね?)
  • daibenファイルは存在する.
  • unkoファイルの中身はunkoである.
  • daibenファイルの中身はない.

おれの考え:

  • getに失敗したのにdaibenファイルが存在するのは, サーバのバグではなく, クライアントのバグ. REST APIではデータを返すだけだから. (ファイルの作成はクライアントの責任) => コードを見てみたい. (getが成功することしか想定出来てないと予想)
  • ストリームを返しているのが何か問題?(しかし, そうしないと大きなファイルを返せないのですが) => とりあえずバイト列で返してみればいい
  • spray | Documentation » 1.2.2 / 1.3.2 » spray-can » HTTP Server のHTTP Headersを見る限りは, Content-Lengthはspray canが自動的につけてくれるものだったと信じていたが. => とりあえず明示的につけてみればいい

将来の目標としては, Debianのtestingからapt-getしたライトブーストの上でこのS3ソフトウェアを動かして, Dropboxのように楽しめればいいと思っている.

広告を非表示にする