diff options
| author | Stefan Fritsch <sf@sfritsch.de> | 2015-08-02 00:19:16 +0200 |
|---|---|---|
| committer | Stefan Fritsch <sf@sfritsch.de> | 2015-08-02 00:19:16 +0200 |
| commit | 48802c25dc82a8b13ac351c0c2137ef748256bbd (patch) | |
| tree | dcaa03f7f34153303fe5afbc9c99dbb8c44b22b3 /modules/generators | |
| parent | 080d5e16db802902200a9ce5b6c40f8f1fdc1f73 (diff) | |
| download | apache2-48802c25dc82a8b13ac351c0c2137ef748256bbd.tar.gz | |
Imported Upstream version 2.4.16
Diffstat (limited to 'modules/generators')
| -rw-r--r-- | modules/generators/mod_asis.c | 2 | ||||
| -rw-r--r-- | modules/generators/mod_cgi.c | 2 | ||||
| -rw-r--r-- | modules/generators/mod_cgid.c | 31 | ||||
| -rw-r--r-- | modules/generators/mod_status.c | 40 |
4 files changed, 64 insertions, 11 deletions
diff --git a/modules/generators/mod_asis.c b/modules/generators/mod_asis.c index c947e303..c2b651be 100644 --- a/modules/generators/mod_asis.c +++ b/modules/generators/mod_asis.c @@ -101,7 +101,7 @@ static int asis_handler(request_rec *r) if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01236) "mod_asis: ap_pass_brigade failed for file %s", r->filename); - return HTTP_INTERNAL_SERVER_ERROR; + return AP_FILTER_ERROR; } } else { diff --git a/modules/generators/mod_cgi.c b/modules/generators/mod_cgi.c index beb02f27..ffbef7eb 100644 --- a/modules/generators/mod_cgi.c +++ b/modules/generators/mod_cgi.c @@ -857,7 +857,7 @@ static int cgi_handler(request_rec *r) } ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01225) "Error reading request entity data"); - return HTTP_INTERNAL_SERVER_ERROR; + return ap_map_http_request_error(rv, HTTP_BAD_REQUEST); } for (bucket = APR_BRIGADE_FIRST(bb); diff --git a/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c index 26022d84..4cebd045 100644 --- a/modules/generators/mod_cgid.c +++ b/modules/generators/mod_cgid.c @@ -170,6 +170,10 @@ static int is_scriptaliased(request_rec *r) #define DEFAULT_CONNECT_ATTEMPTS 15 #endif +#ifndef DEFAULT_CONNECT_STARTUP_DELAY +#define DEFAULT_CONNECT_STARTUP_DELAY 60 +#endif + typedef struct { const char *logname; long logbytes; @@ -1203,18 +1207,26 @@ static int connect_to_daemon(int *sdptr, request_rec *r, { int sd; int connect_tries; + int connect_errno; apr_interval_time_t sliding_timer; connect_tries = 0; sliding_timer = 100000; /* 100 milliseconds */ while (1) { + connect_errno = 0; ++connect_tries; if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, errno, APLOGNO(01255) "unable to create socket to cgi daemon"); } if (connect(sd, (struct sockaddr *)server_addr, server_addr_len) < 0) { - if (errno == ECONNREFUSED && connect_tries < DEFAULT_CONNECT_ATTEMPTS) { + /* Save errno for later */ + connect_errno = errno; + /* ECONNREFUSED means the listen queue is full; ENOENT means that + * the cgid server either hasn't started up yet, or we're pointing + * at the wrong socket file */ + if ((errno == ECONNREFUSED || errno == ENOENT) && + connect_tries < DEFAULT_CONNECT_ATTEMPTS) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, errno, r, APLOGNO(01256) "connect #%d to cgi daemon failed, sleeping before retry", connect_tries); @@ -1235,9 +1247,20 @@ static int connect_to_daemon(int *sdptr, request_rec *r, close_unix_socket, apr_pool_cleanup_null); break; /* we got connected! */ } + + /* If we didn't find the socket but the server was not recently restarted, + * chances are there's something wrong with the cgid daemon + */ + if (connect_errno == ENOENT && + apr_time_sec(apr_time_now() - ap_scoreboard_image->global->restart_time) > + DEFAULT_CONNECT_STARTUP_DELAY) { + return log_scripterror(r, conf, HTTP_SERVICE_UNAVAILABLE, connect_errno, + apr_pstrcat(r->pool, APLOGNO(02833) "ScriptSock ", sockname, " does not exist", NULL)); + } + /* gotta try again, but make sure the cgid daemon is still around */ - if (kill(daemon_pid, 0) != 0) { - return log_scripterror(r, conf, HTTP_SERVICE_UNAVAILABLE, errno, APLOGNO(01258) + if (connect_errno != ENOENT && kill(daemon_pid, 0) != 0) { + return log_scripterror(r, conf, HTTP_SERVICE_UNAVAILABLE, connect_errno, APLOGNO(01258) "cgid daemon is gone; is Apache terminating?"); } } @@ -1502,7 +1525,7 @@ static int cgid_handler(request_rec *r) } ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01270) "Error reading request entity data"); - return HTTP_INTERNAL_SERVER_ERROR; + return ap_map_http_request_error(rv, HTTP_BAD_REQUEST); } for (bucket = APR_BRIGADE_FIRST(bb); diff --git a/modules/generators/mod_status.c b/modules/generators/mod_status.c index 6bcf592b..9bd4e8aa 100644 --- a/modules/generators/mod_status.c +++ b/modules/generators/mod_status.c @@ -126,7 +126,7 @@ static void format_kbyte_out(request_rec *r, apr_off_t kbytes) ap_rprintf(r, "%.1f GB", (float) kbytes / MBYTE); } -static void show_time(request_rec *r, apr_interval_time_t tsecs) +static void show_time(request_rec *r, apr_uint32_t tsecs) { int days, hrs, mins, secs; @@ -183,7 +183,8 @@ static int status_handler(request_rec *r) { const char *loc; apr_time_t nowtime; - apr_interval_time_t up_time; + apr_uint32_t up_time; + ap_loadavg_t t; int j, i, res, written; int ready; int busy; @@ -391,10 +392,9 @@ static int status_handler(request_rec *r) /* up_time in seconds */ up_time = (apr_uint32_t) apr_time_sec(nowtime - ap_scoreboard_image->global->restart_time); + ap_get_loadavg(&t); if (!short_report) { - ap_loadavg_t t; - ap_rputs(DOCTYPE_HTML_3_2 "<html><head>\n" "<title>Apache Status</title>\n" @@ -424,10 +424,37 @@ static int status_handler(request_rec *r) ap_rputs("<dt>Server uptime: ", r); show_time(r, up_time); ap_rputs("</dt>\n", r); - ap_get_loadavg(&t); ap_rprintf(r, "<dt>Server load: %.2f %.2f %.2f</dt>\n", t.loadavg, t.loadavg5, t.loadavg15); } + else { + ap_rvputs(r, ap_get_server_name(r), "\n", NULL); + ap_rvputs(r, "ServerVersion: ", + ap_get_server_description(), "\n", NULL); + ap_rvputs(r, "ServerMPM: ", + ap_show_mpm(), "\n", NULL); + ap_rvputs(r, "Server Built: ", + ap_get_server_built(), "\n", NULL); + ap_rvputs(r, "CurrentTime: ", + ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), + "\n", NULL); + ap_rvputs(r, "RestartTime: ", + ap_ht_time(r->pool, + ap_scoreboard_image->global->restart_time, + DEFAULT_TIME_FORMAT, 0), + "\n", NULL); + ap_rprintf(r, "ParentServerConfigGeneration: %d\n", + ap_state_query(AP_SQ_CONFIG_GEN)); + ap_rprintf(r, "ParentServerMPMGeneration: %d\n", + (int)mpm_generation); + ap_rprintf(r, "ServerUptimeSeconds: %u\n", + up_time); + ap_rputs("ServerUptime:", r); + show_time(r, up_time); + ap_rputs("\n", r); + ap_rprintf(r, "Load1: %.2f\nLoad5: %.2f\nLoad15: %.2f\n", + t.loadavg, t.loadavg5, t.loadavg15); + } if (ap_extended_status) { if (short_report) { @@ -437,6 +464,9 @@ static int status_handler(request_rec *r) #ifdef HAVE_TIMES /* Allow for OS/2 not having CPU stats */ + ap_rprintf(r, "CPUUser: %g\nCPUSystem: %g\nCPUChildrenUser: %g\nCPUChildrenSystem: %g\n", + tu / tick, ts / tick, tcu / tick, tcs / tick); + if (ts || tu || tcu || tcs) ap_rprintf(r, "CPULoad: %g\n", (tu + ts + tcu + tcs) / tick / up_time * 100.); |
