Changeset 640
- Timestamp:
- 02/04/07 22:46:50 (2 years ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/logger_writer.c (modified) (13 diffs)
- cherokee/trunk/cherokee/logger_writer.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r639 r640 1 2007-02-03 A.D.F <adefacc@tin.it> 2 3 * cherokee/logger_writer.h: 4 - added new #define LOGGER_BUF_PAGESIZE 4096 5 to round down write count to a multiple of above value 6 if the data size to write is > LOGGER_BUF_PAGESIZE; 7 this preserves the write speed-up and 8 allows to write as much data as possible without limiting 9 the chunk size to logger_writer->max_bufsize; 10 this fixes the cases when max_bufsize is set 11 to a low value (0 - 16KB or < max request size). 12 13 * cherokee/logger_writer.c: 14 - avoided duplicated code by using new local function 15 logger_writer_close_file(); 16 - configuration, added saner tests on max_bufsize values; 17 - do not use write_fd if the log stream is stderr; 18 - do not close log file if it is stderr; 19 - cherokee_logger_writer_flush(), 20 fixed error handling in order to always flush internal buffer 21 on fatal write errors, because we don't want it 22 to grow up too much (that data is lost anyway). 23 1 24 2007-02-02 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 25 cherokee/trunk/cherokee/logger_writer.c
r638 r640 56 56 57 57 58 static ret_t 59 logger_writer_close_file (cherokee_logger_writer_t *writer) 60 { 61 ret_t ret = ret_ok; 62 63 if (writer->fd != -1) { 64 /* Don't close file if it is stderr 65 */ 66 if (writer->type != cherokee_logger_writer_stderr) { 67 if (close (writer->fd) != 0) 68 ret = ret_error; 69 } 70 writer->fd = -1; 71 } 72 return ret; 73 } 74 75 58 76 ret_t 59 77 cherokee_logger_writer_mrproper (cherokee_logger_writer_t *writer) 60 78 { 61 if (writer->fd != -1) { 62 close (writer->fd); 63 writer->fd = -1; 64 } 79 ret_t ret; 80 81 ret = logger_writer_close_file (writer); 65 82 66 83 cherokee_buffer_mrproper (&writer->buffer); … … 68 85 cherokee_buffer_mrproper (&writer->command); 69 86 70 return ret _ok;87 return ret; 71 88 } 72 89 … … 76 93 { 77 94 ret_t ret; 78 size_t nval = 0;95 int ival = 0; 79 96 cherokee_buffer_t *tmp = NULL; 80 97 cherokee_buffer_t *tmp2 = NULL; … … 119 136 } 120 137 121 122 138 /* Read buffer size (bytes) 123 139 */ … … 132 148 return ret_ok; 133 149 134 nval = (size_t) atoi (tmp2->buf); 135 if (nval > 0 && nval < LOGGER_MIN_BUFSIZE) 136 nval = LOGGER_MIN_BUFSIZE; 137 else 138 if (nval > LOGGER_MAX_BUFSIZE) 139 nval = LOGGER_MAX_BUFSIZE; 150 ival = atoi (tmp2->buf); 151 if (ival <= 0) { 152 ival = 0; 153 } else { 154 /* ival > 0 155 */ 156 if (ival < LOGGER_MIN_BUFSIZE) 157 ival = LOGGER_MIN_BUFSIZE; 158 else 159 if (ival > LOGGER_MAX_BUFSIZE) 160 ival = LOGGER_MAX_BUFSIZE; 161 } 140 162 141 163 /* NOTE: nval is always >= 0 because it is unsigned 142 164 */ 143 if (writer->max_bufsize != nval) {165 if (writer->max_bufsize != (size_t) ival) { 144 166 /* Reallocate buffer to the new size 145 167 */ 146 168 cherokee_buffer_mrproper (&writer->buffer); 147 writer->max_bufsize = nval;169 writer->max_bufsize = (size_t) ival; 148 170 ret = cherokee_buffer_ensure_size ( 149 171 &writer->buffer, … … 215 237 switch (writer->type) { 216 238 case cherokee_logger_writer_syslog: 239 /* Nothing to do, syslog already opened at startup. 240 */ 217 241 return ret_ok; 218 242 … … 221 245 222 246 case cherokee_logger_writer_stderr: 247 /* Nothing to do, syslog already opened at startup. 248 */ 223 249 writer->fd = STDERR_FILENO; 224 250 return ret_ok; … … 241 267 242 268 243 ret_t 269 ret_t 244 270 cherokee_logger_writer_reopen (cherokee_logger_writer_t *writer) 245 271 { … … 253 279 case cherokee_logger_writer_pipe: 254 280 case cherokee_logger_writer_stderr: 255 if (writer->fd != -1) { 256 /* Don't close file if it is stderr 257 */ 258 if (writer->type != cherokee_logger_writer_stderr || 259 writer->fd != STDERR_FILENO) { 260 close (writer->fd); 261 } 262 writer->fd = -1; 263 } 281 ret = logger_writer_close_file (writer); 264 282 break; 265 283 … … 287 305 cherokee_logger_writer_flush (cherokee_logger_writer_t *writer) 288 306 { 289 int re; 290 size_t buflen = MIN(writer->max_bufsize, writer->buffer.len); 307 ret_t ret = ret_ok; 291 308 292 309 /* The internal buffer might be empty … … 301 318 /* In this case we ignore errors. 302 319 */ 303 fwrite (writer->buffer.buf, 1, writer->buffer.len, stderr); 320 if (fwrite (writer->buffer.buf, 1, writer->buffer.len, stderr) 321 != (size_t) writer->buffer.len) 322 ret = ret_error; 323 /* Cleanup the log buffer even if there is an error, 324 * because it's safer to go on anyway. 325 */ 304 326 cherokee_buffer_clean (&writer->buffer); 305 327 break; … … 307 329 case cherokee_logger_writer_pipe: 308 330 case cherokee_logger_writer_file: 331 { 332 ssize_t nwr = 0; 333 size_t buflen = writer->buffer.len; 334 335 /* If there is at least 1 page to write 336 * then round down the length to speed up write(s). 337 */ 338 if (buflen > LOGGER_BUF_PAGESIZE) 339 buflen &= ~LOGGER_BUF_PAGESIZE; 309 340 do { 310 re = write (writer->fd, writer->buffer.buf, buflen); 311 } while (re == -1 && errno == EINTR); 312 if (re < 0) 341 nwr = write (writer->fd, writer->buffer.buf, buflen); 342 } while (nwr == -1 && errno == EINTR); 343 if (nwr <= 0) { 344 /* If an error occured in blocking write, 345 * then cleanup the log buffer now 346 * because we don't want to let it grow too much. 347 */ 348 cherokee_buffer_clean (&writer->buffer); 313 349 return ret_error; 314 315 cherokee_buffer_move_to_begin (&writer->buffer, re); 350 } 351 /* OK, something has been written. 352 */ 353 cherokee_buffer_move_to_begin (&writer->buffer, nwr); 316 354 if (! cherokee_buffer_is_empty (&writer->buffer)) 317 355 return ret_eagain; 356 } 318 357 break; 319 358 320 359 case cherokee_logger_writer_syslog: 321 cherokee_syslog (LOG_INFO, &writer->buffer); 360 /* Write to syslog the whole log buffer, 361 * then cleanup it in any case. 362 */ 363 ret = cherokee_syslog (LOG_INFO, &writer->buffer); 322 364 cherokee_buffer_clean (&writer->buffer); 323 365 break; … … 328 370 } 329 371 330 return ret _ok;331 } 332 372 return ret; 373 } 374 cherokee/trunk/cherokee/logger_writer.h
r638 r640 36 36 CHEROKEE_BEGIN_DECLS 37 37 38 #define LOGGER_BUF_PAGESIZE 4096 /* page size to round down write(n) */ 38 39 #define LOGGER_OVF_BUFSIZE 4096 /* buffer size = max_bufsize + value */ 39 40