Вызов PutBucket для несуществующего имени корзины вызывает исключение

Моя команда настраивает сервер Eucalyptus с Walrus, который мы хотим использовать для запуска тестов нашего кода C#, в котором используются материалы Amazon AWS. Он почти настроен, и теперь мы получаем код, указывающий на Eucalyptus, но мы сталкиваемся с некоторыми трудностями.

Мы начали с вызова PutBucket для создания корзины, которую будем использовать. Ведра раньше не было, так что проблем быть не должно. Однако мы получаем исключение нулевой ссылки со следующей трассировкой стека:

at System.Xml.XmlReader.CalcBufferSize(Stream input)  
at System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding)  
at System.Xml.XmlTextReaderImpl..ctor(String url, Stream input, XmlNameTable nt)  
at System.Xml.XmlTextReader..ctor(Stream input)  
at Amazon.S3.AmazonS3Client.transform(String responseBody, String actionName, Type t)  
at Amazon.S3.AmazonS3Client.processRequestResponse[T](HttpWebResponse httpResponse, S3Request request, Type t, T& response, Exception& cause)  
at Amazon.S3.AmazonS3Client.handleHttpResponse[T](S3Request userRequest, HttpWebRequest request, HttpWebResponse httpResponse, Int32 retries, Int64 lengthOfRequest, T& response, Exception& cause, HttpStatusCode& statusCode)  
at Amazon.S3.AmazonS3Client.getResponseCallback[T](IAsyncResult result)  
at Amazon.S3.AmazonS3Client.endOperation[T](IAsyncResult result)  
at Amazon.S3.AmazonS3Client.EndPutBucket(IAsyncResult asyncResult)  
at Amazon.S3.AmazonS3Client.PutBucket(PutBucketRequest request)  
[at application library]

Теперь вот где это становится странным. Когда мы проверили сервер, ведро было успешно создано! Сервер корректно обработал запрос и сделал ведро, которое мы хотели. Ответ возвращается недействительным, но запрос был обработан правильно. И до сих пор проблема возникает только при вызове PutBucket, потому что когда мы удаляем корзину, она успешно удаляется с сервера, и исключения не выдаются.

Пока мы в недоумении, что происходит. Мы подозреваем, что проблема на стороне Моржа. Возможно, AWS ожидает одно, а Walrus делает другое. Возможно, мы неправильно настроили Eucalyptus и/или Walrus. Мы совсем не уверены.

Вот почему я публикую вопрос здесь. Мне было любопытно, если кто-нибудь имел какой-либо опыт с этим раньше, или, возможно, может предложить некоторое понимание. Что может привести к тому, что сервер правильно обработает запрос, но отправит неверный ответ? Почему Eucalyptus делает ведро, а AWS считает, что операция не удалась?


person MattM    schedule 18.06.2013    source источник


Ответы (1)


Проблема, вероятно, в том, что ответ корзины PUT Walrus включает в себя тело этого элемента, который больше не включается в ответы от S3 (раньше это имело место, но было удалено).

Таким образом, операция на Walrus выполняется успешно, но клиент не может правильно проанализировать ответ. Это часто зависит от конкретных клиентов, поскольку некоторые из них более строгие, чем другие (некоторые, например, даже не будут пытаться анализировать тело ответа, если не ожидается, что оно существует для определенного кода ответа, такого как HTTP 200 OK).

Я бы порекомендовал посмотреть, что отправляется/получается по сети. Wireshark/tcpdump должен показать полный ответ от Walrus. Вероятно, есть разница в XML, которой достаточно, чтобы клиент не работал. Мы в Eucalyptus работаем над устранением этих проблем по мере их возникновения, но поскольку S3 API (в частности, REST) ​​меняется без предупреждения или скачка версии, иногда вещи меняются, и SDK обновляется до того, как мы можем внести изменения в Walrus.

Не стесняйтесь спрашивать о помощи наEngage.eucalyptus.comили поймать нас в IRC на Freenode в #eucalyptus или #eucalyptus-devel.

person ZachH    schedule 19.06.2013