Brian Akins wrote:
> Paul Querna wrote:
> 
>> CacheEnable disk /
> 
> Maybe have it as an option to CacheEnable instead?
> 
> CacheEnable disk /special_stuff normal
> CacheEnable disk / quick
> 
> with quick being the default.  That way, you would not have to do it
> globally, but could be more specific.
> 
>
> Also, have the "both" option where it will try in quick and normal
> handlers.

Attached is a patch that adds 'normal', 'both' and 'quick' to the
CacheEnable command.  It looks okay locally, but I haven't done
extensive testing.

FWIW, the last night's patch went live on update.mozilla.org, and
survived the morning release of Firefox 1.0.4.

Little propaganda on 2.1...

Basic Setup is two reverse proxy + cache machines in front of a single
PHP based Application Server.

Both cache/proxies were running Worker MPM and 2.1.3+patches.  Peaked at
about concurrent 3800 connections each. (only 4 gigs of ram on those
machines)  Once everything was configured correctly, the machines were
not even breaking a sweat.  Previously they were using several Squids,
but the features in 2.1 are very compelling for their uses...

-Paul
Index: modules/cache/cache_util.c
===================================================================
--- modules/cache/cache_util.c  (revision 169788)
+++ modules/cache/cache_util.c  (working copy)
@@ -27,7 +27,8 @@
 
 CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r,
                                                   cache_server_conf *conf, 
-                                                  const char *url)
+                                                  const char *url,
+                                                  int htype)
 {
     cache_provider_list *providers = NULL;
     int i;
@@ -40,7 +41,9 @@
     for (i = 0; i < conf->cacheenable->nelts; i++) {
         struct cache_enable *ent = 
                                 (struct cache_enable *)conf->cacheenable->elts;
-        if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen)) {
+        if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen) &&
+            (CACHE_HANDLER_BOTH == ent[i].handler_type || 
+             htype == ent[i].handler_type)) {
             /* Fetch from global config and add to the list. */
             cache_provider *provider;
             provider = ap_lookup_provider(CACHE_PROVIDER_GROUP, ent[i].type,
Index: modules/cache/mod_cache.c
===================================================================
--- modules/cache/mod_cache.c   (revision 169788)
+++ modules/cache/mod_cache.c   (working copy)
@@ -45,7 +45,7 @@
  *     oh well.
  */
 
-static int cache_url_handler(request_rec *r, int lookup)
+static int cache_url_real_handler(request_rec *r, int lookup, int htype)
 {
     apr_status_t rv;
     const char *auth;
@@ -74,7 +74,7 @@
     /*
      * Which cache module (if any) should handle this request?
      */
-    if (!(providers = ap_cache_get_providers(r, conf, path))) {
+    if (!(providers = ap_cache_get_providers(r, conf, path, htype))) {
         return DECLINED;
     }
 
@@ -156,9 +156,12 @@
     /* We are in the quick handler hook, which means that no output
      * filters have been set. So lets run the insert_filter hook.
      */
-    ap_run_insert_filter(r);
+    if (htype == CACHE_HANDLER_QUICK) {
+        ap_run_insert_filter(r);
+    }
+
     ap_add_output_filter_handle(cache_out_filter_handle, NULL,
-                                r, r->connection);
+                                    r, r->connection);
 
     /* kick off the filter stack */
     out = apr_brigade_create(r->pool, r->connection->bucket_alloc);
@@ -174,6 +177,17 @@
     return OK;
 }
 
+static int cache_url_quick_handler(request_rec *r, int lookup)
+{
+    return cache_url_real_handler(r, lookup, CACHE_HANDLER_QUICK);
+}
+
+static int cache_url_late_handler(request_rec *r)
+{
+    return cache_url_real_handler(r, 0, CACHE_HANDLER_NORMAL);
+}
+
+
 /*
  * CACHE_OUT filter
  * ----------------
@@ -872,10 +886,12 @@
 
 static const char *add_cache_enable(cmd_parms *parms, void *dummy, 
                                     const char *type, 
-                                    const char *url)
+                                    const char *url,
+                                    const char *handler) 
 {
     cache_server_conf *conf;
     struct cache_enable *new;
+    int htype;
 
     if (*type == '/') {
         return apr_psprintf(parms->pool,
@@ -883,6 +899,24 @@
           type);
     }
 
+    if (!handler) {
+        htype = CACHE_HANDLER_QUICK;
+    }
+    else if (!strncasecmp(handler, "quick", 5)) {
+        htype = CACHE_HANDLER_QUICK;
+    }
+    else if (!strncasecmp(handler, "both", 4)) {
+        htype = CACHE_HANDLER_BOTH;
+    }
+    else if (!strncasecmp(handler, "normal", 6)) {
+        htype = CACHE_HANDLER_NORMAL;
+    }
+    else {
+        return apr_psprintf(parms->pool,
+          "CacheEnable: Invalid handler type: '%s'", 
+           handler);
+    }
+
     conf =
         (cache_server_conf *)ap_get_module_config(parms->server->module_config,
                                                   &cache_module);
@@ -890,6 +924,7 @@
     new->type = type;
     new->url = url;
     new->urllen = strlen(url);
+    new->handler_type = htype;
     return NULL;
 }
 
@@ -975,9 +1010,9 @@
      * This is more intuitive that requiring a LoadModule directive.
      */
 
-    AP_INIT_TAKE2("CacheEnable", add_cache_enable, NULL, RSRC_CONF,
-                  "A cache type and partial URL prefix below which "
-                  "caching is enabled"),
+    AP_INIT_TAKE23("CacheEnable", add_cache_enable, NULL, RSRC_CONF,
+                   "A cache type and partial URL prefix below which "
+                   "caching is enabled"),
     AP_INIT_TAKE1("CacheDisable", add_cache_disable, NULL, RSRC_CONF,
                   "A partial URL prefix below which caching is disabled"),
     AP_INIT_TAKE1("CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF,
@@ -1007,9 +1042,12 @@
 
 static void register_hooks(apr_pool_t *p)
 {
-    /* cache initializer */
-    /* cache handler */
-    ap_hook_quick_handler(cache_url_handler, NULL, NULL, APR_HOOK_FIRST);
+    /* cache handlers */
+    ap_hook_quick_handler(cache_url_quick_handler, NULL, NULL,
+                          APR_HOOK_FIRST);
+    ap_hook_handler(cache_url_late_handler, NULL, NULL, 
+                    APR_HOOK_REALLY_FIRST);
+
     /* cache filters 
      * XXX The cache filters need to run right after the handlers and before
      * any other filters. Consider creating AP_FTYPE_CACHE for this purpose.
@@ -1030,6 +1068,8 @@
                                   cache_out_filter, 
                                   NULL,
                                   AP_FTYPE_CONTENT_SET-1);
+
+    /* cache initializer */
     ap_hook_post_config(cache_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
 }
 
Index: modules/cache/mod_cache.h
===================================================================
--- modules/cache/mod_cache.h   (revision 169788)
+++ modules/cache/mod_cache.h   (working copy)
@@ -103,10 +103,15 @@
 #define CACHE_DECLARE_DATA             __declspec(dllimport)
 #endif
 
+#define CACHE_HANDLER_NORMAL 0
+#define CACHE_HANDLER_QUICK  1
+#define CACHE_HANDLER_BOTH   2
+
 struct cache_enable {
     const char *url;
     const char *type;
     apr_size_t urllen;
+    int handler_type;
 };
 
 struct cache_disable {
@@ -256,7 +261,7 @@
 CACHE_DECLARE(char *) generate_name(apr_pool_t *p, int dirlevels, 
                                     int dirlength, 
                                     const char *name);
-CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, 
cache_server_conf *conf, const char *url);
+CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, 
cache_server_conf *conf, const char *url, int is_quick);
 CACHE_DECLARE(int) ap_cache_liststr(apr_pool_t *p, const char *list,
                                     const char *key, char **val);
 CACHE_DECLARE(const char *)ap_cache_tokstr(apr_pool_t *p, const char *list, 
const char **str);

Reply via email to