accelerate the writing of server input and response request files

to disk, trying to defeat file and disk write-behind algorithms
This commit is contained in:
Yang Tse 2008-04-20 19:15:08 +00:00
parent 7abf50a5c0
commit a87c468c5c
2 changed files with 64 additions and 8 deletions

View File

@ -2000,6 +2000,8 @@ AC_CHECK_FUNCS( strtoll \
strcasecmp \ strcasecmp \
stricmp \ stricmp \
strcmpi \ strcmpi \
fflush \
fsync \
gethostbyaddr \ gethostbyaddr \
gettimeofday \ gettimeofday \
inet_addr \ inet_addr \

View File

@ -470,6 +470,7 @@ int ProcessRequest(struct httprequest *req)
/* store the entire request in a file */ /* store the entire request in a file */
void storerequest(char *reqbuf, ssize_t totalsize) void storerequest(char *reqbuf, ssize_t totalsize)
{ {
int res;
int error; int error;
ssize_t written; ssize_t written;
ssize_t writeleft; ssize_t writeleft;
@ -504,18 +505,41 @@ void storerequest(char *reqbuf, ssize_t totalsize)
writeleft -= written; writeleft -= written;
} while ((writeleft > 0) && ((error = ERRNO) == EINTR)); } while ((writeleft > 0) && ((error = ERRNO) == EINTR));
fclose(dump); /* close it ASAP */
if (writeleft > 0) { if (writeleft > 0) {
logmsg("Error writing file %s error: %d %s", logmsg("Error writing file %s error: %d %s",
REQUEST_DUMP, error, strerror(error)); REQUEST_DUMP, error, strerror(error));
logmsg("Wrote only (%d bytes) of (%d bytes) request input to %s", logmsg("Wrote only (%d bytes) of (%d bytes) request input to %s",
totalsize-writeleft, totalsize, REQUEST_DUMP); totalsize-writeleft, totalsize, REQUEST_DUMP);
} }
else {
#ifdef HAVE_FFLUSH
do {
res = fflush(dump);
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error flushing file %s error: %d %s",
REQUEST_DUMP, error, strerror(error));
#endif
#ifdef HAVE_FSYNC
do {
res = fsync(fileno(dump));
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error syncing file %s error: %d %s",
REQUEST_DUMP, error, strerror(error));
#endif
do {
res = fclose(dump);
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error closing file %s error: %d %s",
REQUEST_DUMP, error, strerror(error));
if(!writeleft)
logmsg("Wrote request (%d bytes) input to " REQUEST_DUMP, logmsg("Wrote request (%d bytes) input to " REQUEST_DUMP,
totalsize); totalsize);
}
} }
/* return 0 on success, non-zero on failure */ /* return 0 on success, non-zero on failure */
@ -620,8 +644,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
size_t cmdsize=0; size_t cmdsize=0;
FILE *dump; FILE *dump;
bool persistant = TRUE; bool persistant = TRUE;
bool sendfailure = FALSE;
size_t responsesize; size_t responsesize;
int error; int error;
int res;
static char weare[256]; static char weare[256];
@ -761,9 +787,8 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
num = 200; num = 200;
written = swrite(sock, buffer, num); written = swrite(sock, buffer, num);
if (written < 0) { if (written < 0) {
fclose(dump); sendfailure = TRUE;
logmsg("Sending response failed and we bailed out!"); break;
return -1;
} }
else { else {
logmsg("Sent off %d bytes", written); logmsg("Sent off %d bytes", written);
@ -775,7 +800,36 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
buffer += written; buffer += written;
} while(count>0); } while(count>0);
fclose(dump); #ifdef HAVE_FFLUSH
do {
res = fflush(dump);
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error flushing file %s error: %d %s",
RESPONSE_DUMP, error, strerror(error));
#endif
#ifdef HAVE_FSYNC
do {
res = fsync(fileno(dump));
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error syncing file %s error: %d %s",
RESPONSE_DUMP, error, strerror(error));
#endif
do {
res = fclose(dump);
} while(res && ((error = ERRNO) == EINTR));
if(res)
logmsg("Error closing file %s error: %d %s",
RESPONSE_DUMP, error, strerror(error));
if(sendfailure) {
logmsg("Sending response failed. Only (%d bytes) of (%d bytes) were sent",
responsesize-count, responsesize);
return -1;
}
logmsg("Response sent (%d bytes) and written to " RESPONSE_DUMP, logmsg("Response sent (%d bytes) and written to " RESPONSE_DUMP,
responsesize); responsesize);