You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Ruediger Pluem <rp...@apache.org> on 2008/04/11 13:30:17 UTC

Re: svn commit: r645978 - in /httpd/httpd/trunk/modules: cache/ap_socache.h cache/mod_socache_dbm.c cache/mod_socache_dc.c cache/mod_socache_memcache.c cache/mod_socache_shmcb.c ssl/ssl_scache.c (fwd)

> 
> Author: jorton
> Date: Tue Apr  8 08:47:48 2008
> New Revision: 645978
> 
> URL: http://svn.apache.org/viewvc?rev=645978&view=rev
> Log:
> Adjust socache init interface to take sizing hints, and namespace tag
> for memcache:
> 
> * modules/cache/ap_socache.h (struct ap_socache_hints): New structure.
>   Change init callback to take namespace string and hints structure pointer.
> 
> * modules/cache/mod_socache_dc.c (socache_dc_init): Adjust accordingly.
> 
> * modules/cache/mod_socache_dbm.c (struct ap_socache_instance_t): Rename
>   timeout field to expiry_interval.
>   (socache_dbm_init, socache_dbm_create): Take expiry interval from
>   hints rather than hard-code to 30.
>   (socache_dbm_expire): Update for timeout field rename.
> 
> * modules/cache/mod_socache_shmcb.c (socache_shmcb_init): Adjust for
>   hints and namespace; adjust subcache index sizing heuristics to use
>   passed-in hints.
> 
> * modules/cache/mod_socache_memcache.c (struct ap_socache_instance_t):
>   Add tag, taglen fields.
>   (socache_mc_init): Store the passed-in namespace in instance
>   structure.
>   (mc_session_id2sz): Adjust to not take context, use configured
>   tag as string prefix, and not use a return value.
>   (socache_mc_store, socache_mc_retrieve, socache_mc_remove):
>   Adjust for mc_session_id2sz interface changes.
> 
> * modules/ssl/ssl_scache.c (ssl_scache_init): Pass namespace and hints
>   to socache provider init function.
> 
> Modified:
>     httpd/httpd/trunk/modules/cache/ap_socache.h
>     httpd/httpd/trunk/modules/cache/mod_socache_dbm.c
>     httpd/httpd/trunk/modules/cache/mod_socache_dc.c
>     httpd/httpd/trunk/modules/cache/mod_socache_memcache.c
>     httpd/httpd/trunk/modules/cache/mod_socache_shmcb.c
>     httpd/httpd/trunk/modules/ssl/ssl_scache.c
> 

> Modified: httpd/httpd/trunk/modules/cache/mod_socache_memcache.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_socache_memcache.c?rev=645978&r1=645977&r2=645978&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/mod_socache_memcache.c (original)
> +++ httpd/httpd/trunk/modules/cache/mod_socache_memcache.c Tue Apr  8 08:47:48 2008
> @@ -164,22 +167,21 @@
>      /* noop. */
>  }
>  
> -static char *mc_session_id2sz(const unsigned char *id, unsigned int idlen,
> -                              char *str, int strsize)
> +static void mc_session_id2sz(ap_socache_instance_t *ctx,
> +                             const unsigned char *id, unsigned int idlen,
> +                             char *buf, apr_size_t buflen)
>  {
> +    apr_size_t maxlen = (buflen - ctx->taglen) / 2;

What happens if ctx-taglen > buflen?

>      char *cp;
>      int n;
> -    int maxlen = (strsize - MC_TAG_LEN)/2;
>  
> -    cp = apr_cpystrn(str, MC_TAG, MC_TAG_LEN);
> +    cp = apr_cpystrn(buf, ctx->tag, ctx->taglen);

Se above. IMHO we should be defensive here and ensure that the last
parameter to apr_cpystrn is not larger than the buffer size.

>      for (n = 0; n < idlen && n < maxlen; n++) {
>          apr_snprintf(cp, 3, "%02X", (unsigned) id[n]);
>          cp += 2;
>      }
>  
>      *cp = '\0';
> -
> -    return str;
>  }
>  
>  static apr_status_t socache_mc_store(ap_socache_instance_t *ctx, server_rec *s, 
> @@ -188,21 +190,16 @@
>                                       unsigned char *ucaData, unsigned int nData)
>  {
>      char buf[MC_KEY_LEN];
> -    char *strkey = NULL;
>      apr_status_t rv;
>  
> -    strkey = mc_session_id2sz(id, idlen, buf, sizeof(buf));
> -    if(!strkey) {
> -        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "scache_mc: Key generation borked.");
> -        return APR_EGENERAL;
> -    }
> +    mc_session_id2sz(ctx, id, idlen, buf, sizeof(buf));
>  
> -    rv = apr_memcache_set(ctx->mc, strkey, (char*)ucaData, nData, timeout, 0);
> +    rv = apr_memcache_set(ctx->mc, buf, (char*)ucaData, nData, timeout, 0);
>  
>      if (rv != APR_SUCCESS) {
>          ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
>                       "scache_mc: error setting key '%s' "
> -                     "with %d bytes of data", strkey, nData);
> +                     "with %d bytes of data", buf, nData);
>          return rv;
>      }
>  
> @@ -217,21 +214,14 @@
>  {
>      apr_size_t der_len;
>      char buf[MC_KEY_LEN], *der;
> -    char *strkey = NULL;
>      apr_status_t rv;
>  
> -    strkey = mc_session_id2sz(id, idlen, buf, sizeof(buf));
> -
> -    if (!strkey) {
> -        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
> -                     "scache_mc: Key generation borked.");
> -        return APR_EGENERAL;
> -    }
> +    mc_session_id2sz(ctx, id, idlen, buf, sizeof(buf));
>  
>      /* ### this could do with a subpool, but _getp looks like it will
>       * eat memory like it's going out of fashion anyway. */
>  
> -    rv = apr_memcache_getp(ctx->mc, p, strkey,
> +    rv = apr_memcache_getp(ctx->mc, p, buf,
>                             &der, &der_len, NULL);
>      if (rv) {
>          if (rv != APR_NOTFOUND) {
> 
> Modified: httpd/httpd/trunk/modules/cache/mod_socache_shmcb.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_socache_shmcb.c?rev=645978&r1=645977&r2=645978&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/mod_socache_shmcb.c (original)
> +++ httpd/httpd/trunk/modules/cache/mod_socache_shmcb.c Tue Apr  8 08:47:48 2008
> @@ -348,16 +351,10 @@
>                   shm_segsize);
>      /* Discount the header */
>      shm_segsize -= sizeof(SHMCBHeader);
> -    /* Select the number of subcaches to create and how many indexes each
> -     * should contain based on the size of the memory (the header has already
> -     * been subtracted). Typical non-client-auth sslv3/tlsv1 sessions are
> -     * around 180 bytes (148 bytes data and 32 bytes for the id), so
> -     * erring to division by 150 helps ensure we would exhaust data
> -     * storage before index storage (except sslv2, where it's
> -     * *slightly* the other way). From there, we select the number of
> -     * subcaches to be a power of two, such that the number of indexes
> -     * per subcache at least twice the number of subcaches. */
> -    num_idx = (shm_segsize) / 150;
> +    /* Select index size based on average object size hints, if given. */
> +    avg_obj_size = hints && hints->avg_obj_size ? hints->avg_obj_size : 150;
> +    avg_id_len = hints && hints->avg_id_len ? hints->avg_id_len : 30;
> +    num_idx = (shm_segsize) / (avg_obj_size + avg_id_len);

Hm. Before the change the default factor was 1 / 150 now it is 1 / 180. Is
this correct?

Regards

RĂ¼diger