在不存在的存储桶名称上调用PutBucket会引发异常

时间:2013-06-18 13:26:47

标签: amazon-s3 eucalyptus walrus

我的团队正在设置一个带有Walrus的Eucalyptus服务器,我们想用它来运行我们的C#代码测试,这些代码使用亚马逊的AWS东西。它已接近设置,我们现在正在将代码指向Eucalyptus,但我们遇到了一些困难。

我们最初通过调用PutBucket来创建我们将要使用的存储桶。该桶以前不存在,所以应该没有任何问题。但是,我们使用以下stacktrace获取空引用异常:

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时发生,因为当我们删除存储桶时,它会被成功删除,不会引发异常。

到目前为止,我们对发生的事情感到茫然。我们怀疑Walrus的问题已经存在。也许AWS期待一件事,而Walrus正在做另一件事。也许我们没有正确配置Eucalyptus和/或Walrus。我们根本不确定。

这就是我在这里发布问题的原因。我很好奇,如果有人之前有任何经验,或者可能提供一些见解。什么可能导致服务器正确处理请求但发回无效响应?为什么Eucalyptus会成功,但AWS认为操作失败了?

1 个答案:

答案 0 :(得分:1)

问题可能是Walrus PUT桶响应包含一个主体,该元素不再包含在S3的响应中(以前是这种情况,但已被删除)。

因此,该操作在Walrus上取得了成功,但客户端未能正确解析响应。这通常取决于特定的客户端,因为有些客户端比其他客户端更严格(例如,如果预计特定响应代码(例如HTTP 200 OK)不存在,某些客户端甚至不会尝试解析响应主体)。

我建议您查看通过电汇发送/接收的内容。 Wireshark / tcpdump应显示来自Walrus的完整响应。可能存在XML差异,足以使客户端失败。我们Eucalyptus正在努力解决这些问题,但由于S3 API(特别是REST)在没有警告或版本崩溃的情况下发生变化,有时情况会发生变化,SDK会在我们在Walrus进行更改之前更新。

随时可以在engage.eucalyptus.com上寻求帮助,或者在#eucalyptus或#eucalyptus-devel上的Freenode上了解IRC