Вызов PutBucket для имени корзины, которого еще не существует, вызывает исключение
Моя команда настраивает сервер Eucalyptus с Walrus, который мы хотим использовать для запуска тестов на нашем C# -коде, который использует Amazon Amazon. Он почти настроен, и теперь мы получаем код, указывающий на эвкалипт, но мы сталкиваемся с некоторыми трудностями.
Мы начали с вызова 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 - другое. Возможно, мы неправильно настроили Эвкалипт и / или Морж. Мы совсем не уверены.
Вот почему я размещаю вопрос здесь. Мне было любопытно, имел ли кто-либо опыт с этим раньше, или, возможно, может предложить некоторое понимание. Что может заставить сервер правильно обработать запрос, но отослать неверный ответ? Зачем Эвкалипту делать ведро, а AWS считает, что операция провалилась?
1 ответ
Вероятно, проблема заключается в том, что в ответе Walrus PUT содержится элемент body, который больше не включается в ответы S3 (раньше это было так, но был удален).
Таким образом, операция выполняется на Walrus, но клиент не может правильно проанализировать ответ. Это часто зависит от конкретных клиентов, так как некоторые из них более строгие, чем другие (например, некоторые даже не будут пытаться проанализировать тело ответа, если не ожидается, что оно существует для определенного кода ответа, такого как HTTP 200 OK).
Я бы порекомендовал посмотреть на то, что отправляется / получает по проводам. Wireshark/tcpdump должен показывать полный ответ от Walrus. Вероятно, существует разница в XML, достаточная для сбоя клиента. Мы в Eucalyptus работаем над устранением этих проблем по мере их возникновения, но поскольку S3 API (в частности, REST) изменяется без предупреждения или повышения версии, иногда все меняется, и SDK обновляется, прежде чем мы сможем внести изменения в Walrus.
Не стесняйтесь спрашивать на сайте eng.eucalyptus.com о помощи или ловите нас на IRC на Freenode в #eucalyptus или #eucalyptus-devel