bottleneck testcase based on rubbos
[bottlenecks.git] / rubbos / app / tomcat-connectors-1.2.32-src / docs / generic_howto / timeouts.html
1 <html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>The Apache Tomcat Connector - Generic HowTo - Timeouts HowTo</title><meta name="author" value="Rainer Jung"><meta name="email" value="rjung@apache.org"><link href="../style.css" type="text/css" rel="stylesheet"></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="4"><!--PAGE HEADER--><tr><td colspan="2"><!--TOMCAT LOGO--><a href="http://tomcat.apache.org/"><img src="../images/tomcat.gif" align="left" alt="Apache Tomcat" border="0"></a><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="http://www.apache.org/images/asf-logo.gif" align="right" alt="Apache Logo" border="0"></a></td></tr><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap="true"><p><strong>Links</strong></p><ul><li><a href="../index.html">Docs Home</a></li></ul><p><strong>Reference Guide</strong></p><ul><li><a href="../reference/workers.html">workers.properties</a></li><li><a href="../reference/uriworkermap.html">uriworkermap.properties</a></li><li><a href="../reference/status.html">Status Worker</a></li><li><a href="../reference/apache.html">Apache HTTP Server</a></li><li><a href="../reference/iis.html">IIS</a></li></ul><p><strong>Generic HowTo</strong></p><ul><li><a href="../generic_howto/quick.html">For the impatient</a></li><li><a href="../generic_howto/workers.html">All about workers</a></li><li><a href="../generic_howto/timeouts.html">Timeouts</a></li><li><a href="../generic_howto/loadbalancers.html">Load Balancing</a></li><li><a href="../generic_howto/proxy.html">Reverse Proxy</a></li></ul><p><strong>Webserver HowTo</strong></p><ul><li><a href="../webserver_howto/apache.html">Apache HTTP Server</a></li><li><a href="../webserver_howto/iis.html">IIS</a></li><li><a href="../webserver_howto/nes.html">Netscape/SunOne/Sun</a></li></ul><p><strong>AJP Protocol Reference</strong></p><ul><li><a href="../ajp/ajpv13a.html">AJPv13</a></li><li><a href="../ajp/ajpv13ext.html">AJPv13 Extension Proposal</a></li></ul><p><strong>Miscellaneous Documentation</strong></p><ul><li><a href="../miscellaneous/faq.html">Frequently asked questions</a></li><li><a href="../miscellaneous/changelog.html">Changelog</a></li><li><a href="http://issues.apache.org/bugzilla/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Tomcat+Connectors&amp;long_desc_type=substring&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;keywords_type=allwords&amp;keywords=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=&amp;emailassigned_to2=1&amp;emailreporter2=1&amp;emailcc2=1&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">Current Tomcat Connectors bugs</a></li><li><a href="../miscellaneous/doccontrib.html">Contribute documentation</a></li><li><a href="../miscellaneous/jkstatustasks.html">JK Status Ant Tasks</a></li><li><a href="../miscellaneous/reporttools.html">Reporting Tools</a></li><li><a href="http://tomcat.apache.org/connectors-doc-archive/jk2/index.html">Old JK/JK2 documentation</a></li></ul><p><strong>News</strong></p><ul><li><a href="../news/20110701.html">2011</a></li><li><a href="../news/20100101.html">2010</a></li><li><a href="../news/20090301.html">2009</a></li><li><a href="../news/20081001.html">2008</a></li><li><a href="../news/20070301.html">2007</a></li><li><a href="../news/20060101.html">2006</a></li><li><a href="../news/20050101.html">2005</a></li><li><a href="../news/20041100.html">2004</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left"><table border="0" width="100%" cellspacing="4"><tr><td align="left" valign="top"><h1>The Apache Tomcat Connector - Generic HowTo</h1><h2>Timeouts HowTo</h2></td><td align="right" valign="top" nowrap="true"><small><a href="printer/timeouts.html"><img src="../images/printer.gif" border="0" alt="Printer Friendly Version"><br>print-friendly<br>version
2                     </a></small></td></tr></table><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote> 
3 <br>
4 <p>Setting communication timeouts is very important to improve the
5 communication process. They help to detect problems and stabilise
6 a distributed system. JK can use several different timeout types, which
7 can be individually configured. For historical reasons, all of them are
8 disabled by default. This HowTo explains their use and gives
9 hints how to find appropriate values.
10 </p>
11 <p>All timeouts can be configured in the workers.properties file.
12 For a complete reference of all worker configuration
13 items, please consult the worker <a href="../reference/workers.html">reference</a>.
14 This page assumes, that you are using at least version 1.2.16 of JK.
15 Dependencies on newer versions will be mentioned where necessary.
16 </p>
17 <p><font color="#ff0000">
18 Do not set timeouts to extreme values. Very small timeouts will likely
19 be counterproductive.
20 </font></p>
21 <p><font color="#ff0000">
22 Long Garbage Collection pauses on the backend do not make a good
23 fit with some timeouts. Try to optimise your Java memory and GC settings.
24 </font></p>
25 </blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="JK Timeout Attributes"><strong>JK Timeout Attributes</strong></a></font></td></tr><tr><td><blockquote>
26 <br>
27 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="CPing/CPong"><strong>CPing/CPong</strong></a></font></td></tr><tr><td><blockquote>
28 <p>
29 CPing/CPong is our notion for using small test packets to check the
30 status of backend connections. JK can use such test packets directly after establishing
31 a new backend connection (connect mode) and also directly before each request gets
32 send to a backend (prepost mode).
33 Starting with version 1.2.27 it can also be used when a connection was idle
34 for a long time (interval mode).
35 The maximum waiting time (timeout) for a CPong answer to a CPing and the idle
36 time in interval mode can be configured.
37 </p>
38 <p>
39 The test packets will be answered by the backend very fast with a minimal amount of
40 needed processing resources. A positive answer tells us, that the backend can be reached
41 and is actively processing requests. It does not detect, if some context is deployed
42 and working. The benefit of CPing/CPong is a fast detection of a communication
43 problem with the backend. The downside is a slightly increased latency.
44 </p>
45 <p>
46 The worker attribute <b>ping_mode</b> can be set to a combination of characters
47 to determine, in which situations test packets are used:
48 <ul>
49 <li><b>C</b>: connect mode, timeout <b>ping_timeout</b> overwritten by <b>connect_timeout</b></li>
50 <li><b>P</b>: prepost mode, timeout <b>ping_timeout</b> overwritten by <b>prepost_timeout</b></li>
51 <li><b>I</b>: interval mode, timeout <b>ping_timeout</b>, idle time <b>connection_ping_interval</b></li>
52 <li><b>A</b>: all modes</li>
53 </ul>
54 </p>
55 <p>
56 Multiple values must be concatenated without any separator characters.
57 We recommend using all CPing tests. If your application is very latency sensitive, then
58 you should only use the combination of connect and interval mode.
59 </p>
60 <p>
61 Activating the CPing probing via <b>ping_mode</b> has been added in version 1.2.27.
62 For older versions only the connect and prepost modes exist and must be activated by
63 explicitely setting <b>connect_timeout</b> and <b>prepost_timeout</b>.
64 </p>
65 <p>
66 The worker attribute <b>ping_timeout</b> sets the default wait timeout
67 in milliseconds for CPong for all modes. By default the value is "10000"
68 milliseconds. The value only gets used, if you activate CPing/Cpong probes
69 via <b>ping_mode</b>. The default value should be fine, except if you experience
70 very long Java garbage collection pauses.
71 Depending on your network latency and stability, good custom values
72 often are between 5000 and 15000 milliseconds.
73 You can overwrite the timeout used for connect and prepost mode with
74 <b>connect_timeout</b> and <b>prepost_timeout</b>.
75 Remember: don't use extremely small values.
76 </p>
77 <p>
78 The worker attribute <b>connect_timeout</b> sets the wait timeout
79 in milliseconds for CPong during connection establishment. You can use it
80 if you want to overwrite the general timeout set with <b>ping_timeout</b>.
81 To use connect mode CPing, you need to enable it via <b>ping_mode</b>.
82 Since JK usually uses persistent connections, opening new connections is a
83 rare event. We therefore recommend activating connect mode.
84 Depending on your network latency and stability, good values often
85 are between 5000 and 15000 milliseconds.
86 Remember: don't use extremely small values.
87 </p>
88 <p>
89 The worker attribute <b>prepost_timeout</b> sets the wait timeout
90 in milliseconds for CPong before request forwarding. You can use it
91 if you want to overwrite the general timeout set with <b>ping_timeout</b>.
92 To use prepost mode CPing, you need to enable it via <b>ping_mode</b>.
93 Activating this type of CPing/CPong adds a small latency to each
94 request. Usually this is small enough and the benefit of CPing/CPong is more important.
95 So in general we also recommend using <b>prepost_timeout</b>.
96 Depending on your network latency and stability, good values often
97 are between 5000 and 10000 milliseconds.
98 Remember: don't use extremely small values.
99 </p>
100 <p>
101 Until version 1.2.27 <b>ping_mode</b> and <b>ping_timeout</b> did not
102 exist and to enable connect or prepost mode CPing you had to set <b>connect_timeout</b>
103 respectively <b>prepost_timeout</b> to some reasonable positive value.
104 </p>
105 </blockquote></td></tr></table>
106
107 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Low-Level TCP Timeouts"><strong>Low-Level TCP Timeouts</strong></a></font></td></tr><tr><td><blockquote>
108 <p>
109 Some platforms allow to set timeouts for all operations on TCP sockets.
110 This is available for Linux and Windows, other platforms do not support this,
111 e.g. Solaris. If your platform supports TCP send and receive timeouts,
112 you can set them using the worker attribute <b>socket_timeout</b>.
113 You can not set the two timeouts to different values.
114 </p>
115 <p>
116 JK will accept this attribute even if your platform does not support
117 socket timeouts. In this case setting the attribute will have no effect.
118 By default the value is "0" and the timeout is disabled.
119 You can set the attribute to some seconds value (not: milliseconds).
120 JK will then set the send and the receive timeouts of the backend
121 connections to this value. The timeout is low-level, it is
122 used for each read and write operation on the socket individually.
123 </p>
124 <p>
125 Using this attribute will make JK react faster to some types of network problems.
126 Unfortunately socket timeouts have negative side effects, because for most
127 platforms, there is no good way to recover from such a timeout, once it fired.
128 For JK there is no way to decide, if this timeout fired because of real network
129 problems, or only because it didn't receive an answer packet from a backend in time.
130 So remember: don't use extremely small values.
131 </p>
132 <p>
133 For the general case of connection establishment you can use
134 <b>socket_connect_timeout</b>. It takes a millisecond value and works
135 on most platforms, even if <b>socket_timeout</b> is not supported.
136 We recommend using <b>socket_connect_timeout</b> because in some network
137 failure situations failure detection during connection establishment
138 can take several minutes due to TCP retransmits. Depending on the quality
139 of your network a timeout somewhere between 1000 and 5000 milliseconds
140 should be fine. Note that <b class="code">socket_timeout</b> is in seconds, and
141 <b class="code">socket_connect_timeout</b> in milliseconds.
142 </p>
143 </blockquote></td></tr></table>
144
145 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Connection Pools and Idle Timeouts"><strong>Connection Pools and Idle Timeouts</strong></a></font></td></tr><tr><td><blockquote>
146 <p>
147 JK handles backend connections in a connection pool per web server process.
148 The connections are used in a persistent mode. After a request completed
149 successfully we keep the connection open and wait for the next
150 request to forward. The connection pool is able to grow according
151 to the number of threads that want to forward requests in parallel.
152 </p>
153 <p>
154 Most applications have a varying load depending on the hour of the day
155 or the day of the month. Other reasons for a growing connection pool
156 would be temporary slowness of backends, leading to an increasing
157 congestion of the frontends like web servers. Many backends use a dedicated
158 thread for each incoming connection they handle. So usually one wants the
159 connection pool to shrink, if the load diminishes.
160 </p>
161 <p>
162 JK allows connections in the pool to get closed after some idle time.
163 This maximum idle time can be configured with the attribute
164 <b>connection_pool_timeout</b> which is given in units of seconds.
165 The default value is "0", which disables closing idle connections.
166 </p>
167 <p>
168 We generally recommend values around 10 minutes, so setting
169 <b>connection_pool_timeout</b> to 600 (seconds). If you use this attribute,
170 please also set the attribute <b>connectionTimeout</b> in the AJP
171 Connector element of your Tomcat server.xml configuration file to
172 an analogous value. <b>Caution</b>: connectionTimeout is in milliseconds.
173 So if you set JK connection_pool_timeout to 600, you should set Tomcat
174 connectionTimeout to 600000.
175 </p>
176 <p>
177 JK connections do not get closed immediately after the timeout passed.
178 Instead there is an automatic internal maintenance task
179 running every 60 seconds, that checks the idle status of all connections.
180 The 60 seconds interval
181 can be adjusted with the global attribute worker.maintain. We do not
182 recommend to change this value, because it has a lot of side effects.
183 Until version 1.2.26, the maintenance task only runs, if requests get
184 processed. So if your web server has processes that do not receive any
185 requests for a long time, there is no way to close the idle connections
186 in its pool. Starting with version 1.2.27 you can configure an independent
187 watchdog thread when using Apache 2.x with threaded APR or IIS.
188 </p>
189 <p>
190 The maximum connection pool size can be configured with the
191 attribute <b>connection_pool_size</b>. We generally do not recommend
192 to use this attribute in combination with Apache httpd. For
193 Apache httpd we automatically detect the number of threads per
194 process and set the maximum pool size to this value. For IIS we use
195 a default value of 250 (before version 1.2.20: 10),
196 for the Sun Web Server the default is "1".
197 We strongly recommend adjusting this value for IIS and the Sun Web Server
198 to the number of requests one web server process should
199 be able to send to a backend in parallel. You should measure how many connections
200 you need during peak hours without performance problems, and then add some
201 percentage depending on your growth rate etc. Finally you should check,
202 whether your web server processes are able to use at least as many threads,
203 as you configured as the pool size.
204 </p>
205 <p>
206 The JK attribute <b>connection_pool_minsize</b> defines,
207 how many idle connections remain when the pool gets shrunken.
208 By default this is half of the maximum pool size.
209 </p>
210 </blockquote></td></tr></table>
211
212 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Firewall Connection Dropping"><strong>Firewall Connection Dropping</strong></a></font></td></tr><tr><td><blockquote>
213 <p>
214 One particular problem with idle connections comes from firewalls, that
215 are often deployed between the web server layer and the backend.
216 Depending on their configuration, they will silently drop
217 connections from their status table if they are idle for to long.
218 </p>
219 <p>
220 From the point of view of JK and of the web server, the other side
221 simply doesn't answer any traffic. Since TCP is a reliable protocol
222 it detects the missing TCP ACKs and tries to resend the packets for
223 a relatively long time, typically several minutes.
224 </p>
225 <p>
226 Many firewalls will allow connection closing, even if they dropped
227 the connection for normal traffic. Therefore you should always use
228 <a href="#Connection Pools and Idle Timeouts">connection_pool_timeout and
229 connection_pool_minsize</a> on the JK side
230 and connectionTimeout on the Tomcat side.
231 </p>
232 <p>
233 Furthermore using the boolean attribute <b>socket_keepalive</b> you can
234 set a standard socket option, that automatically sends TCP keepalive packets
235 after some idle time on each connection. By default this is set to "False".
236 If you suspect idle connection drops by firewalls you should set this to
237 "True".
238 </p>
239 <p>
240 Unfortunately the default intervals and algorithms for these packets
241 are platform specific. You might need to inspect TCP tuning options for
242 your platform on how to control TCP keepalive.
243 Often the default intervals are much longer than the firewall timeouts
244 for idle connections. Nevertheless we recommend talking to your firewall
245 administration and your platform administration in order to make them agree
246 on good configuration values for the firewall and the platform TCP tuning.
247 </p>
248 <p>
249 In case none of our recommendations help and you are definitively having
250 problems with idle connection drops, you can disable the use of persistent
251 connections when using JK together with Apache httpd. For this you set
252 "JkOptions +DisableReuse" in your Apache httpd configuration.
253 This will have a huge negative performance impact!
254 </p>
255 </blockquote></td></tr></table>
256
257 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Reply Timeout"><strong>Reply Timeout</strong></a></font></td></tr><tr><td><blockquote>
258 <p>
259 JK can also use a timeout on request replies. This timeout does not
260 measure the full processing time of the response. Instead it controls,
261 how much time between consecutive response packets is allowed.
262 </p>
263 <p>
264 In most cases, this is what one actually wants. Consider for example
265 long running downloads. You would not be able to set an effective global
266 reply timeout, because downloads could last for many minutes.
267 Most applications though have limited processing time before starting
268 to return the response. For those applications you could set an explicit
269 reply timeout. Applications that do not harmonise with reply timeouts
270 are batch type applications, data warehouse and reporting applications
271 which are expected to observe long processing times.
272 </p>
273 <p><font color="#ff0000">
274 If JK aborts waiting for a response, because a reply timeout fired,
275 there is no way to stop processing on the backend. Although you free
276 processing resources in your web server, the request
277 will continue to run on the backend - without any way to send back a
278 result once the reply timeout fired.
279 </font></p>
280 <p>
281 JK uses the worker attribute <b>reply_timeout</b> to set reply timeouts.
282 The default value is "0" (timeout disabled) and you can set it to any
283 millisecond value.
284 </p>
285 <p>
286 In combination with Apache httpd, you can also set a more flexible reply_timeout
287 using an httpd environment variable. If you set the variable JK_REPLY_TIMEOUT
288 to some integer value, this value will be used instead of the value in
289 the worker configuration. This way you can set reply timeouts more flexible
290 with mod_setenvif and mod_rewrite depending on URI, query string etc.
291 If the environment variable JK_REPLY_TIMEOUT is not set, or is set to a
292 negative value, the default reply timeout of the worker will be used. If
293 JK_REPLY_TIMEOUT contains the value "0", then the reply timeout will be disabled
294 for the request.
295 </p>
296 <p>
297 In combination with a load balancing worker, JK will disable a member
298 worker of the load balancer if a reply timeout fires. The worker will then
299 no longer be used until it gets recovered during the next automatic
300 maintenance task. Starting with JK 1.2.24 you can improve this behaviour using
301 <b><a href="../reference/workers.html">max_reply_timeouts</a></b>. This
302 attribute will allow occasional long running requests without disabling the
303 worker. Only if those requests happen to often, the worker gets disabled by the
304 load balancer.
305 </p>
306 </blockquote></td></tr></table>
307 </blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Load Balancer Error Detection"><strong>Load Balancer Error Detection</strong></a></font></td></tr><tr><td><blockquote>
308 <br>
309 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Local and Global Error States"><strong>Local and Global Error States</strong></a></font></td></tr><tr><td><blockquote>
310 <p>
311 A load balancer worker does not only have the ability to balance load.
312 It also handles stickyness and failover of requests in case of errors.
313 When a load balancer detects an error on one of its members, it needs to
314 decide, whether the error is serious, or only a temporary error or maybe
315 only related to the actual request that was processed. Temporary errors
316 are called local errors, serious errors will be called global errors.
317 </p>
318 <p>
319 If the load balancer decides that a backend should be put into the global error
320 state, then the web server will not send any more requests there. If no session
321 replication is used, this means that all user sessions located on the respective
322 backend are no longer available. The users will be send to another backend
323 and will have to login again. So the global error state is not transparent to the
324 users. The application is still available, but users might loose some work.
325 </p>
326 <p>
327 In some cases the decision between local error and global error is easy.
328 For instance if there is an error sending back the response to the client (browser),
329 then it is very unlikely that the backend is broken.
330 So this situation is a typical example of a local error.
331 </p>
332 <p>
333 Some situations are harder to decide though. If the load balancer can't establish
334 a new connection to a backend, it could be because of a temporary overload situation
335 (so no more free threads in the backend), or because the backend isn't alive any more.
336 Depending on the details, the right state could either be local error or global error.
337 </p>
338 </blockquote></td></tr></table>
339 <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Error Escalation Time"><strong>Error Escalation Time</strong></a></font></td></tr><tr><td><blockquote>
340 <p>
341 Until version 1.2.26 most errors were interpreted as global errors.
342 Starting with version 1.2.27 many errors which were previously interpreted as global
343 were switched to being local whenever the backend is still busy. Busy means, that
344 other concurrent requests are send to the same backend (successful or not).
345 </p>
346 <p>
347 In many cases there is no perfect way of making the decision
348 between local and global error. The load balancer simply doesn't have enough information.
349 In version 1.2.28 you can now tune, how fast the load balancer switches from local error to
350 global error. If a member of a load balancer stays in local error state for too long,
351 the load balancer will escalate it into global error state.
352 </p>
353 <p>
354 The time tolerated in local error state is controlled by the load balancer attribute
355 <b>error_escalation_time</b> (in seconds). The default value is half of <b>recover_time</b>,
356 so unless you changed <b>recover_time</b> the default is 30 seconds.
357 </p>
358 <p>
359 Using a smaller value for <b>error_escalation_time</b> will make the load balancer react
360 faster to serious errors, but also carries the risk of more often loosing sessions
361 in not so serious situations. You can lower <b>error_escalation_time</b> down to 0 seconds,
362 which means all local errors which are potentially serious are escalated to global errors
363 immediately.
364 </p>
365 <p>
366 Note that without good basic error detection the whole escalation procedure is useless.
367 So you should definitely use <b>socket_connect_timeout</b> and activate CPing/CPong
368 with <b>ping_mode</b> and <b>ping_timeout</b> before thinking about also tuning
369 <b>error_escalation_time</b>.
370 </p>
371 </blockquote></td></tr></table>
372 </blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em>
373         Copyright &copy; 1999-2011, Apache Software Foundation
374         </em></font></div></td></tr></table></body></html>