Skip to content

Commit f47b6f3

Browse files
committed
Import the core parts of the DTrace patch. This is a modified and updated
version of what was submited by Theo before: <http://mail-archives.apache.org/mod_mbox/httpd-dev/200805.mbox/%[email protected]%3E> Note, this does not hook it up into the build system at this time, because the original patch was a little too creative there. Submitted By: Theo Schlossnagle <jesus omniti.com> git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@723565 13f79535-47bb-0310-9956-ffa450edef68
1 parent cca2d66 commit f47b6f3

File tree

8 files changed

+342
-9
lines changed

8 files changed

+342
-9
lines changed

ap.d

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#pragma D depends_on provider io
2+
typedef struct request_rec {
3+
uintptr_t pool;
4+
uintptr_t connection;
5+
uintptr_t server;
6+
uintptr_t next;
7+
uintptr_t prev;
8+
uintptr_t main;
9+
char *the_request;
10+
int assbackwards;
11+
int proxyreq;
12+
int header_only;
13+
char *protocol;
14+
int proto_num;
15+
char *hostname;
16+
int64_t request_time;
17+
char *status_line;
18+
int status;
19+
const char *method;
20+
int method_number;
21+
int64_t allowed;
22+
uintptr_t allowed_xmethods;
23+
uintptr_t allowed_methods;
24+
offset_t sent_bodyct;
25+
offset_t bytes_sent;
26+
int64_t mtime;
27+
int chunked;
28+
char *range;
29+
offset_t clength;
30+
offset_t remaining;
31+
offset_t read_length;
32+
int read_body;
33+
int read_chunked;
34+
unsigned expecting_100;
35+
uintptr_t headers_in;
36+
uintptr_t headers_out;
37+
uintptr_t err_headers_out;
38+
uintptr_t subprocess_env;
39+
uintptr_t notes;
40+
char *content_type; /* Break these out --- we dispatch on 'em */
41+
char *handler; /* What we *really* dispatch on */
42+
char *content_encoding;
43+
uintptr_t content_languages;
44+
char *vlist_validator;
45+
char *user;
46+
char *ap_auth_type;
47+
int no_cache;
48+
int no_local_copy;
49+
char *unparsed_uri;
50+
char *uri;
51+
char *filename;
52+
char *canonical_filename;
53+
char *path_info;
54+
char *args;
55+
/* finfo */
56+
uintptr_t finfo_pool;
57+
int32_t finfo_valid;
58+
int32_t finfo_protection;
59+
int32_t finfo_filetype;
60+
int finfo_user;
61+
int finfo_group;
62+
uint64_t finfo_inode;
63+
uint64_t finfo_device;
64+
int32_t finfo_nlink;
65+
offset_t finfo_size;
66+
offset_t finfo_csize;
67+
int64_t finfo_atime;
68+
int64_t finfo_mtime;
69+
int64_t finfo_ctime;
70+
char *finfo_fname;
71+
char *finfo_name;
72+
uintptr_t finfo_ffilehand;
73+
/* parsed_uri */
74+
char *uri_scheme;
75+
char *uri_hostinfo;
76+
char *uri_user;
77+
char *uri_password;
78+
char *uri_hostname;
79+
char *uri_port_str;
80+
char *uri_path;
81+
char *uri_query;
82+
char *uri_fragment;
83+
uintptr_t uri_hostent;
84+
uint16_t uri_port;
85+
unsigned uri_is_initialized:1;
86+
unsigned uri_dns_looked_up:1;
87+
unsigned uri_dns_resolved:1;
88+
89+
/* back to request_rec */
90+
int used_path_info;
91+
uintptr_t per_dir_config;
92+
uintptr_t request_config;
93+
uintptr_t htaccess;
94+
uintptr_t output_filters;
95+
uintptr_t input_filters;
96+
uintptr_t proto_output_filters;
97+
uintptr_t proto_input_filters;
98+
int eos_sent;
99+
uintptr_t kept_body;
100+
uintptr_t invoke_mtx;
101+
} request_rec;
102+

apache_probes.d

+172
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
provider ap {
2+
/* Explicit, core */
3+
probe internal__redirect(char *, char *);
4+
probe process__request__entry(uintptr_t, char *);
5+
probe process__request__return(uintptr_t, char *, uint32_t);
6+
probe read__request__entry(uintptr_t, uintptr_t);
7+
probe read__request__success(uintptr_t, char *, char *, char *, uint32_t);
8+
probe read__request__failure(uintptr_t);
9+
10+
/* Explicit, modules */
11+
probe rewrite__log(uintptr_t, int, int, char *, char *);
12+
probe proxy__run(uintptr_t);
13+
probe proxy__run__finished(uintptr_t);
14+
15+
/* Implicit, APR hooks */
16+
probe translate_name__entry();
17+
probe translate_name__dispatch__invoke(char *);
18+
probe translate_name__dispatch__complete(char *, uint32_t);
19+
probe translate_name__return(uint32_t);
20+
probe map_to_storage__entry();
21+
probe map_to_storage__dispatch__invoke(char *);
22+
probe map_to_storage__dispatch__complete(char *, uint32_t);
23+
probe map_to_storage__return(uint32_t);
24+
probe check_user_id__entry();
25+
probe check_user_id__dispatch__invoke(char *);
26+
probe check_user_id__dispatch__complete(char *, uint32_t);
27+
probe check_user_id__return(uint32_t);
28+
probe fixups__entry();
29+
probe fixups__dispatch__invoke(char *);
30+
probe fixups__dispatch__complete(char *, uint32_t);
31+
probe fixups__return(uint32_t);
32+
probe type_checker__entry();
33+
probe type_checker__dispatch__invoke(char *);
34+
probe type_checker__dispatch__complete(char *, uint32_t);
35+
probe type_checker__return(uint32_t);
36+
probe access_checker__entry();
37+
probe access_checker__dispatch__invoke(char *);
38+
probe access_checker__dispatch__complete(char *, uint32_t);
39+
probe access_checker__return(uint32_t);
40+
probe auth_checker__entry();
41+
probe auth_checker__dispatch__invoke(char *);
42+
probe auth_checker__dispatch__complete(char *, uint32_t);
43+
probe auth_checker__return(uint32_t);
44+
probe insert_filter__entry();
45+
probe insert_filter__dispatch__invoke(char *);
46+
probe insert_filter__dispatch__complete(char *, uint32_t);
47+
probe insert_filter__return(uint32_t);
48+
probe create_connection__entry();
49+
probe create_connection__dispatch__invoke(char *);
50+
probe create_connection__dispatch__complete(char *, uint32_t);
51+
probe create_connection__return(uint32_t);
52+
probe pre_connection__entry();
53+
probe pre_connection__dispatch__invoke(char *);
54+
probe pre_connection__dispatch__complete(char *, uint32_t);
55+
probe pre_connection__return(uint32_t);
56+
probe process_connection__entry();
57+
probe process_connection__dispatch__invoke(char *);
58+
probe process_connection__dispatch__complete(char *, uint32_t);
59+
probe process_connection__return(uint32_t);
60+
probe create_request__entry();
61+
probe create_request__dispatch__invoke(char *);
62+
probe create_request__dispatch__complete(char *, uint32_t);
63+
probe create_request__return(uint32_t);
64+
probe header_parser__entry();
65+
probe header_parser__dispatch__invoke(char *);
66+
probe header_parser__dispatch__complete(char *, uint32_t);
67+
probe header_parser__return(uint32_t);
68+
probe pre_config__entry();
69+
probe pre_config__dispatch__invoke(char *);
70+
probe pre_config__dispatch__complete(char *, uint32_t);
71+
probe pre_config__return(uint32_t);
72+
probe test_config__entry();
73+
probe test_config__dispatch__invoke(char *);
74+
probe test_config__dispatch__complete(char *, uint32_t);
75+
probe test_config__return(uint32_t);
76+
probe post_config__entry();
77+
probe post_config__dispatch__invoke(char *);
78+
probe post_config__dispatch__complete(char *, uint32_t);
79+
probe post_config__return(uint32_t);
80+
probe open_logs__entry();
81+
probe open_logs__dispatch__invoke(char *);
82+
probe open_logs__dispatch__complete(char *, uint32_t);
83+
probe open_logs__return(uint32_t);
84+
probe child_init__entry();
85+
probe child_init__dispatch__invoke(char *);
86+
probe child_init__dispatch__complete(char *, uint32_t);
87+
probe child_init__return(uint32_t);
88+
probe handler__entry();
89+
probe handler__dispatch__invoke(char *);
90+
probe handler__dispatch__complete(char *, uint32_t);
91+
probe handler__return(uint32_t);
92+
probe quick_handler__entry();
93+
probe quick_handler__dispatch__invoke(char *);
94+
probe quick_handler__dispatch__complete(char *, uint32_t);
95+
probe quick_handler__return(uint32_t);
96+
probe optional_fn_retrieve__entry();
97+
probe optional_fn_retrieve__dispatch__invoke(char *);
98+
probe optional_fn_retrieve__dispatch__complete(char *, uint32_t);
99+
probe optional_fn_retrieve__return(uint32_t);
100+
probe get_mgmt_items__entry();
101+
probe get_mgmt_items__dispatch__invoke(char *);
102+
probe get_mgmt_items__dispatch__complete(char *, uint32_t);
103+
probe get_mgmt_items__return(uint32_t);
104+
probe pre_mpm__entry();
105+
probe pre_mpm__dispatch__invoke(char *);
106+
probe pre_mpm__dispatch__complete(char *, uint32_t);
107+
probe pre_mpm__return(uint32_t);
108+
probe default_port__entry();
109+
probe default_port__dispatch__invoke(char *);
110+
probe default_port__dispatch__complete(char *, uint32_t);
111+
probe default_port__return(uint32_t);
112+
probe http_scheme__entry();
113+
probe http_scheme__dispatch__invoke(char *);
114+
probe http_scheme__dispatch__complete(char *, uint32_t);
115+
probe http_scheme__return(uint32_t);
116+
probe error_log__entry();
117+
probe error_log__dispatch__invoke(char *);
118+
probe error_log__dispatch__complete(char *, uint32_t);
119+
probe error_log__return(uint32_t);
120+
probe log_transaction__entry();
121+
probe log_transaction__dispatch__invoke(char *);
122+
probe log_transaction__dispatch__complete(char *, uint32_t);
123+
probe log_transaction__return(uint32_t);
124+
probe monitor__entry();
125+
probe monitor__dispatch__invoke(char *);
126+
probe monitor__dispatch__complete(char *, uint32_t);
127+
probe monitor__return(uint32_t);
128+
probe post_read_request__entry();
129+
probe post_read_request__dispatch__invoke(char *);
130+
probe post_read_request__dispatch__complete(char *, uint32_t);
131+
probe post_read_request__return(uint32_t);
132+
probe get_suexec_identity__entry();
133+
probe get_suexec_identity__dispatch__invoke(char *);
134+
probe get_suexec_identity__dispatch__complete(char *, uint32_t);
135+
probe get_suexec_identity__return(uint32_t);
136+
probe insert_error_filter__entry();
137+
probe insert_error_filter__dispatch__invoke(char *);
138+
probe insert_error_filter__dispatch__complete(char *, uint32_t);
139+
probe insert_error_filter__return(uint32_t);
140+
141+
/* Implicit, APR hooks for proxy */
142+
probe scheme_handler__entry();
143+
probe scheme_handler__dispatch__invoke(char *);
144+
probe scheme_handler__dispatch__complete(char *, uint32_t);
145+
probe scheme_handler__return(uint32_t);
146+
probe canon_handler__entry();
147+
probe canon_handler__dispatch__invoke(char *);
148+
probe canon_handler__dispatch__complete(char *, uint32_t);
149+
probe canon_handler__return(uint32_t);
150+
probe pre_request__entry();
151+
probe pre_request__dispatch__invoke(char *);
152+
probe pre_request__dispatch__complete(char *, uint32_t);
153+
probe pre_request__return(uint32_t);
154+
probe post_request__entry();
155+
probe post_request__dispatch__invoke(char *);
156+
probe post_request__dispatch__complete(char *, uint32_t);
157+
probe post_request__return(uint32_t);
158+
159+
/* Implicit, APR hooks for dav */
160+
probe gather_propsets__entry();
161+
probe gather_propsets__dispatch__invoke(char *);
162+
probe gather_propsets__dispatch__complete(char *, uint32_t);
163+
probe gather_propsets__return(uint32_t);
164+
probe find_liveprop__entry();
165+
probe find_liveprop__dispatch__invoke(char *);
166+
probe find_liveprop__dispatch__complete(char *, uint32_t);
167+
probe find_liveprop__return(uint32_t);
168+
probe insert_all_liveprops__entry();
169+
probe insert_all_liveprops__dispatch__invoke(char *);
170+
probe insert_all_liveprops__dispatch__complete(char *, uint32_t);
171+
probe insert_all_liveprops__return(uint32_t);
172+
};

configure.in

+29-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,8 @@ grp.h \
380380
strings.h \
381381
sys/prctl.h \
382382
sys/processor.h \
383-
sys/sem.h
383+
sys/sem.h \
384+
sys/sdt.h
384385
)
385386
AC_HEADER_SYS_WAIT
386387

@@ -446,6 +447,33 @@ AC_ARG_WITH(sslport,APACHE_HELP_STRING(--with-sslport=SSLPORT,Port on which to s
446447
[if test "$withval" = "yes"; then AC_MSG_ERROR('option --with-sslport requires a value (the SSL TCP port number)'); else SSLPORT="$withval"; fi],
447448
[SSLPORT=443])
448449

450+
DTRACE=true
451+
AC_ARG_ENABLE(dtrace,APACHE_HELP_STRING(--enable-dtrace,Enable DTrace probes),
452+
[
453+
enable_dtrace=$enableval
454+
APR_ADDTO(CPPFLAGS, -DAPR_DTRACE_PROVIDER)
455+
AC_MSG_ERROR('DTrace Support in the build system is not complete. Patches Welcome!')
456+
],
457+
[
458+
enable_dtrace=no
459+
])
460+
461+
dnl Disabled dtrace build for now.
462+
enable_dtrace=no
463+
464+
case $host in
465+
*-solaris2*)
466+
if test $enable_dtrace = "yes" -a "$ac_cv_header_sys_sdt_h" = "yes"; then
467+
AC_DEFINE(AP_ENABLE_DTRACE, 1,
468+
[Enable DTrace probes])
469+
DTRACE="/usr/sbin/dtrace $DTRACEFLAGS"
470+
test -f include/apache_probes.h || $DTRACE -h -s apache_probes.d -o include/apache_probes.h
471+
fi
472+
;;
473+
esac
474+
475+
APACHE_SUBST(DTRACE)
476+
449477
APR_CHECK_APR_DEFINE(APR_HAVE_IPV6)
450478

451479
AC_ARG_ENABLE(v4-mapped,APACHE_HELP_STRING(--enable-v4-mapped,Allow IPv6 sockets to handle IPv4 connections),

include/ap_config.h

+7
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,13 @@
238238
#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1
239239
#endif
240240

241+
#if AP_ENABLE_DTRACE && HAVE_SYS_SDT_H
242+
#include <sys/sdt.h>
243+
#else
244+
#undef _DTRACE_VERSION
245+
#endif
246+
#include "apache_probes.h"
247+
241248
/* TODO - We need to put OS detection back to make all the following work */
242249

243250
#if defined(SUNOS4) || defined(IRIX) || defined(NEXT) || defined(AUX3) \

modules/http/http_request.c

+8
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ void ap_process_request_after_handler(request_rec *r)
260260

261261
c->cs->state = CONN_STATE_WRITE_COMPLETION;
262262
check_pipeline(c);
263+
AP_PROCESS_REQUEST_RETURN((uintptr_t)r, r->uri, r->status);
263264
if (ap_extended_status) {
264265
ap_time_process_request(c->sbh, STOP_PREQUEST);
265266
}
@@ -284,6 +285,7 @@ void ap_process_async_request(request_rec *r)
284285
* Use this hook with extreme care and only if you know what you are
285286
* doing.
286287
*/
288+
AP_PROCESS_REQUEST_ENTRY((uintptr_t)r, r->uri);
287289
if (ap_extended_status) {
288290
ap_time_process_request(r->connection->sbh, START_PREQUEST);
289291
}
@@ -299,6 +301,10 @@ void ap_process_async_request(request_rec *r)
299301
}
300302

301303
if (access_status == SUSPENDED) {
304+
/* TODO: Should move these steps into a generic function, so modules
305+
* working on a suspended request can also call _ENTRY again.
306+
*/
307+
AP_PROCESS_REQUEST_RETURN((uintptr_t)r, r->uri, access_status);
302308
if (ap_extended_status) {
303309
ap_time_process_request(c->sbh, STOP_PREQUEST);
304310
}
@@ -536,6 +542,8 @@ AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r)
536542
request_rec *new = internal_internal_redirect(new_uri, r);
537543
int access_status;
538544

545+
AP_INTERNAL_REDIRECT(r->uri, new_uri);
546+
539547
/* ap_die was already called, if an error occured */
540548
if (!new) {
541549
return;

modules/mappers/mod_rewrite.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,8 @@ static void do_rewritelog(request_rec *r, int level, char *perdir,
490490

491491
conf = ap_get_module_config(r->server->module_config, &rewrite_module);
492492

493-
if (!conf->rewritelogfp || level > conf->rewriteloglevel) {
493+
if ((!conf->rewritelogfp || level > conf->rewriteloglevel) &&
494+
!AP_REWRITE_LOG_ENABLED()) {
494495
return;
495496
}
496497

@@ -524,6 +525,11 @@ static void do_rewritelog(request_rec *r, int level, char *perdir,
524525
perdir ? "] ": "",
525526
text);
526527

528+
AP_REWRITE_LOG((uintptr_t)r, level, r->main ? 0 : 1, (char *)ap_get_server_name(r), logline);
529+
530+
if (!conf->rewritelogfp || level > conf->rewriteloglevel)
531+
return;
532+
527533
rv = apr_global_mutex_lock(rewrite_log_lock);
528534
if (rv != APR_SUCCESS) {
529535
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,

0 commit comments

Comments
 (0)