mirror of
https://github.com/s3fs-fuse/s3fs-fuse.git
synced 2025-02-02 18:48:26 +00:00
Added code to address the potential short write
associated with BIO_write Resolves issue #6 git-svn-id: http://s3fs.googlecode.com/svn/trunk@287 df820570-a93a-0410-bd06-b72b767a4274
This commit is contained in:
parent
90ee6b8f9b
commit
68774b5960
@ -1,7 +1,7 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.59)
|
AC_PREREQ(2.59)
|
||||||
AC_INIT(s3fs, 1.27)
|
AC_INIT(s3fs, 1.28)
|
||||||
|
|
||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
|
66
src/s3fs.cpp
66
src/s3fs.cpp
@ -471,6 +471,11 @@ string get_date() {
|
|||||||
string calc_signature(
|
string calc_signature(
|
||||||
string method, string content_type, string date, curl_slist* headers, string resource) {
|
string method, string content_type, string date, curl_slist* headers, string resource) {
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
int bytes_written;
|
||||||
|
int offset;
|
||||||
|
int write_attempts = 0;
|
||||||
|
|
||||||
string Signature;
|
string Signature;
|
||||||
string StringToSign;
|
string StringToSign;
|
||||||
StringToSign += method + "\n";
|
StringToSign += method + "\n";
|
||||||
@ -501,9 +506,60 @@ string calc_signature(
|
|||||||
BIO* b64 = BIO_new(BIO_f_base64());
|
BIO* b64 = BIO_new(BIO_f_base64());
|
||||||
BIO* bmem = BIO_new(BIO_s_mem());
|
BIO* bmem = BIO_new(BIO_s_mem());
|
||||||
b64 = BIO_push(b64, bmem);
|
b64 = BIO_push(b64, bmem);
|
||||||
BIO_write(b64, md, md_len);
|
|
||||||
BIO_flush(b64);
|
offset = 0;
|
||||||
|
for (;;) {
|
||||||
|
bytes_written = BIO_write(b64, &(md[offset]), md_len);
|
||||||
|
write_attempts++;
|
||||||
|
// -1 indicates that an error occurred, or a temporary error, such as
|
||||||
|
// the server is busy, occurred and we need to retry later.
|
||||||
|
// BIO_write can do a short write, this code addresses this condition
|
||||||
|
if (bytes_written <= 0) {
|
||||||
|
// Indicates whether a temporary error occurred or a failure to
|
||||||
|
// complete the operation occurred
|
||||||
|
if ((ret = BIO_should_retry(b64))) {
|
||||||
|
|
||||||
|
// Wait until the write can be accomplished
|
||||||
|
if(write_attempts <= 10) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
// Too many write attempts
|
||||||
|
syslog(LOG_ERR, "Failure during BIO_write, returning null String");
|
||||||
|
BIO_free_all(b64);
|
||||||
|
Signature.clear();
|
||||||
|
return Signature;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If not a retry then it is an error
|
||||||
|
syslog(LOG_ERR, "Failure during BIO_write, returning null String");
|
||||||
|
BIO_free_all(b64);
|
||||||
|
Signature.clear();
|
||||||
|
return Signature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The write request succeeded in writing some Bytes
|
||||||
|
offset += bytes_written;
|
||||||
|
md_len -= bytes_written;
|
||||||
|
|
||||||
|
// If there is no more data to write, the request sending has been
|
||||||
|
// completed
|
||||||
|
if (md_len <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush the data
|
||||||
|
ret = BIO_flush(b64);
|
||||||
|
if ( ret <= 0) {
|
||||||
|
syslog(LOG_ERR, "Failure during BIO_flush, returning null String");
|
||||||
|
BIO_free_all(b64);
|
||||||
|
Signature.clear();
|
||||||
|
return Signature;
|
||||||
|
}
|
||||||
|
|
||||||
BUF_MEM *bptr;
|
BUF_MEM *bptr;
|
||||||
|
|
||||||
BIO_get_mem_ptr(b64, &bptr);
|
BIO_get_mem_ptr(b64, &bptr);
|
||||||
|
|
||||||
Signature.resize(bptr->length - 1);
|
Signature.resize(bptr->length - 1);
|
||||||
@ -514,6 +570,10 @@ string calc_signature(
|
|||||||
return Signature;
|
return Signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// libcurl callback
|
// libcurl callback
|
||||||
// another write callback as shown by example
|
// another write callback as shown by example
|
||||||
// http://curl.haxx.se/libcurl/c/getinmemory.html
|
// http://curl.haxx.se/libcurl/c/getinmemory.html
|
||||||
@ -2142,7 +2202,7 @@ static int s3fs_readdir(
|
|||||||
if (msg != NULL) {
|
if (msg != NULL) {
|
||||||
CURLcode code =msg->data.result;
|
CURLcode code =msg->data.result;
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
syslog(LOG_ERR, "readdir: remaining_msgs: %i code: %d msg: %s",
|
syslog(LOG_DEBUG, "readdir: remaining_msgs: %i code: %d msg: %s",
|
||||||
remaining_msgs, code, curl_easy_strerror(code));
|
remaining_msgs, code, curl_easy_strerror(code));
|
||||||
}
|
}
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user