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 \
stricmp \
strcmpi \
fflush \
fsync \
gethostbyaddr \
gettimeofday \
inet_addr \

View File

@ -470,6 +470,7 @@ int ProcessRequest(struct httprequest *req)
/* store the entire request in a file */
void storerequest(char *reqbuf, ssize_t totalsize)
{
int res;
int error;
ssize_t written;
ssize_t writeleft;
@ -504,18 +505,41 @@ void storerequest(char *reqbuf, ssize_t totalsize)
writeleft -= written;
} while ((writeleft > 0) && ((error = ERRNO) == EINTR));
fclose(dump); /* close it ASAP */
if (writeleft > 0) {
logmsg("Error writing file %s error: %d %s",
REQUEST_DUMP, error, strerror(error));
logmsg("Wrote only (%d bytes) of (%d bytes) request input to %s",
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,
totalsize);
}
}
/* 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;
FILE *dump;
bool persistant = TRUE;
bool sendfailure = FALSE;
size_t responsesize;
int error;
int res;
static char weare[256];
@ -761,9 +787,8 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
num = 200;
written = swrite(sock, buffer, num);
if (written < 0) {
fclose(dump);
logmsg("Sending response failed and we bailed out!");
return -1;
sendfailure = TRUE;
break;
}
else {
logmsg("Sent off %d bytes", written);
@ -775,7 +800,36 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
buffer += written;
} 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,
responsesize);