Changeset 207


Ignore:
Timestamp:
05/08/06 00:41:55 (4 years ago)
Author:
bart
Message:
  • Added directory hashing for md5 and inode based keys based on a patch

from <mattias at efterfesten.com>, default is 2 levels deep.

  • Renamed some left over MM based names to EA.
  • Increased default hash size for user and script to 512 for extra

performance.

Location:
eaccelerator/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • eaccelerator/trunk/ChangeLog

    r206 r207  
     12006-05-07  Bart Vanbrabant <bart.vanbrabant at zoeloelip.be> 
     2 
     3        * Added directory hashing for md5 and inode based keys based on a patch 
     4          from <mattias at efterfesten.com>, default is 2 levels deep. 
     5        * Renamed some left over MM based names to EA. 
     6        * Increased default hash size for user and script to 512 for extra  
     7          performance. 
     8 
    192006-05-04  Bart Vanbrabant <bart.vanbrabant at zoeloelip.be> 
    210 
  • eaccelerator/trunk/cache.c

    r201 r207  
    298298             * storing to shared memory  
    299299             */ 
    300             slot = q->hv & MM_USER_HASH_MAX; 
     300            slot = q->hv & EA_USER_HASH_MAX; 
    301301            hv = q->hv; 
    302302            EACCELERATOR_LOCK_RW(); 
     
    337337    xkey = build_key(key, key_len, &xlen TSRMLS_CC); 
    338338    hv = hash_mm(xkey, xlen); 
    339     slot = hv & MM_USER_HASH_MAX; 
     339    slot = hv & EA_USER_HASH_MAX; 
    340340 
    341341    if (eaccelerator_mm_instance != NULL && (where == eaccelerator_shm_and_disk  
     
    533533                where == eaccelerator_shm || where == eaccelerator_shm_only)) { 
    534534        hv = hash_mm(xkey, xlen); 
    535         slot = hv & MM_USER_HASH_MAX; 
     535        slot = hv & EA_USER_HASH_MAX; 
    536536 
    537537        EACCELERATOR_UNPROTECT(); 
     
    574574    EACCELERATOR_UNPROTECT(); 
    575575    EACCELERATOR_LOCK_RW(); 
    576     for (i = 0; i < MM_USER_HASH_SIZE; i++) { 
     576    for (i = 0; i < EA_USER_HASH_SIZE; i++) { 
    577577        mm_user_cache_entry **p = &eaccelerator_mm_instance->user_hash[i]; 
    578578        while (*p != NULL) { 
     
    618618    array_init(return_value); 
    619619 
    620     for (i = 0; i < MM_USER_HASH_SIZE; ++i) { 
     620    for (i = 0; i < EA_USER_HASH_SIZE; ++i) { 
    621621        p = eaccelerator_mm_instance->user_hash[i]; 
    622622        while(p != NULL) { 
  • eaccelerator/trunk/config.m4

    r204 r207  
    6666 
    6767AC_ARG_WITH(eaccelerator-info, 
    68 [  --without-eaccelerator-info                Do not compile the eAccelerator information functions],[ 
     68[  --without-eaccelerator-info              Do not compile the eAccelerator information functions],[ 
    6969  eaccelerator_info=$withval 
    7070],[ 
  • eaccelerator/trunk/ea_dasm.c

    r201 r207  
    514514                EACCELERATOR_LOCK_RD(); 
    515515                EACCELERATOR_PROTECT(); 
    516                 for (slot = 0; slot < MM_HASH_SIZE; slot++) { 
     516                for (slot = 0; slot < EA_HASH_SIZE; slot++) { 
    517517                        p = eaccelerator_mm_instance->hash[slot]; 
    518518                        while (p != NULL) { 
  • eaccelerator/trunk/ea_info.c

    r188 r207  
    227227        EACCELERATOR_UNPROTECT (); 
    228228        EACCELERATOR_LOCK_RW (); 
    229         for (i = 0; i < MM_HASH_SIZE; i++) { 
     229        for (i = 0; i < EA_HASH_SIZE; i++) { 
    230230                p = eaccelerator_mm_instance->hash[i]; 
    231231                while (p != NULL) { 
     
    244244                eaccelerator_mm_instance->hash[i] = NULL; 
    245245        } 
    246         for (i = 0; i < MM_USER_HASH_SIZE; i++) { 
     246        for (i = 0; i < EA_USER_HASH_SIZE; i++) { 
    247247                mm_user_cache_entry *p = eaccelerator_mm_instance->user_hash[i]; 
    248248                while (p != NULL) { 
     
    379379    array_init(return_value); 
    380380     
    381     for (i = 0; i < MM_HASH_SIZE; i++) { 
     381    for (i = 0; i < EA_HASH_SIZE; i++) { 
    382382        p = eaccelerator_mm_instance->hash[i]; 
    383383        while (p != NULL) { 
  • eaccelerator/trunk/eaccelerator.c

    r201 r207  
    144144  hv = hash_mm(key, strlen(key)); 
    145145#endif 
    146   slot = hv & MM_HASH_MAX; 
     146  slot = hv & EA_HASH_MAX; 
    147147 
    148148  EACCELERATOR_LOCK_RW(); 
     
    207207  unsigned int slot; 
    208208#ifdef EACCELERATOR_USE_INODE 
    209   slot = (x->st_dev + x->st_ino) & MM_HASH_MAX; 
     209  slot = (x->st_dev + x->st_ino) & EA_HASH_MAX; 
    210210#else 
    211211  x->hv = hash_mm(x->realfilename, strlen(x->realfilename)); 
    212   slot = x->hv & MM_HASH_MAX; 
     212  slot = x->hv & EA_HASH_MAX; 
    213213#endif 
    214214 
     
    368368*/ 
    369369 
     370static char num2hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 
     371 
    370372#ifdef EACCELERATOR_USE_INODE 
    371373static int eaccelerator_inode_key(char* s, dev_t dev, ino_t ino TSRMLS_DC) { 
    372   int n; 
    373   strncpy(s, EAG(cache_dir), MAXPATHLEN-1); 
    374   strlcat(s, "/eaccelerator-", MAXPATHLEN-1); 
     374  int n, i; 
     375  snprintf(s, MAXPATHLEN-1, "%s/", EAG(cache_dir)); 
    375376  n = strlen(s); 
     377  for (i = 1; i <= EACCELERATOR_HASH_LEVEL && n < MAXPATHLEN - 1; i++) { 
     378    s[n++] = num2hex[(ino >> (i*4)) & 0xf]; 
     379    s[n++] = '/'; 
     380  } 
     381  s[n] = 0; 
     382  strlcat(s, "eaccelerator-", MAXPATHLEN-1); 
     383  n += sizeof("eaccelerator-") - 1; 
    376384  while (dev > 0) { 
    377385    if (n >= MAXPATHLEN) return 0; 
     
    399407  PHP_MD5_CTX context; 
    400408  unsigned char digest[16]; 
     409  int i; 
     410  int n; 
    401411 
    402412  md5str[0] = '\0'; 
     
    405415  PHP_MD5Final(digest, &context); 
    406416  make_digest(md5str, digest); 
    407   snprintf(s, MAXPATHLEN-1, "%s%s%s", EAG(cache_dir), prefix, md5str); 
     417  snprintf(s, MAXPATHLEN-1, "%s/", EAG(cache_dir)); 
     418  n = strlen(s); 
     419  for (i = 0; i < EACCELERATOR_HASH_LEVEL && n < MAXPATHLEN - 1; i++) { 
     420    s[n++] = md5str[i]; 
     421    s[n++] = '/'; 
     422  } 
     423  s[n] = 0; 
     424  snprintf(s, MAXPATHLEN-1, "%s%s%s", s, prefix, md5str); 
    408425  return 1; 
    409426#else 
     
    437454  EACCELERATOR_LOCK_RW(); 
    438455  eaccelerator_mm_instance->last_prune = t; 
    439   for (i = 0; i < MM_HASH_SIZE; i++) { 
     456  for (i = 0; i < EA_HASH_SIZE; i++) { 
    440457    mm_cache_entry **p = &eaccelerator_mm_instance->hash[i]; 
    441458    while (*p != NULL) { 
     
    588605/******************************************************************************/ 
    589606/* Cache file functions.                                                                                                          */ 
    590 /* TODO: create cache subdirectories -> speed improvement highly used servers */ 
    591607/******************************************************************************/ 
    592608 
     
    729745    EACCELERATOR_FLOCK(f, LOCK_UN); 
    730746    close(f); 
     747  } else { 
     748    ea_debug_log("EACCELERATOR: Open for write failed for \"%s\": %s\n", s, strerror(errno)); 
    731749  } 
    732750  return ret; 
     
    19651983} 
    19661984 
     1985static void make_hash_dirs(char *fullpath, int lvl) { 
     1986  int i, j; 
     1987  int n = strlen(fullpath); 
     1988  mode_t old_umask = umask(0); 
     1989   
     1990  if (lvl < 1) 
     1991    return; 
     1992  if (fullpath[n-1] != '/') 
     1993    fullpath[n++] = '/'; 
     1994   
     1995  for (j = 0; j < 16; j++) { 
     1996    fullpath[n] = num2hex[j];        
     1997    fullpath[n+1] = 0; 
     1998    mkdir(fullpath, 0777); 
     1999    make_hash_dirs(fullpath, lvl-1); 
     2000  } 
     2001  fullpath[n+2] = 0; 
     2002  umask(old_umask); 
     2003} 
     2004 
     2005 
    19672006PHP_MINIT_FUNCTION(eaccelerator) { 
     2007  char fullpath[MAXPATHLEN]; 
     2008 
    19682009  if (type == MODULE_PERSISTENT) { 
    19692010#ifndef ZEND_WIN32 
    19702011    if (strcmp(sapi_module.name,"apache") == 0) { 
    1971       /* Is the parent process - init */ 
    1972 /* 
    1973       sleep(1); 
    1974       if (getppid() != 1) { 
    1975 */ 
    19762012      if (getpid() != getpgrp()) { 
    19772013        return SUCCESS; 
     
    19802016#endif 
    19812017#ifdef WITH_EACCELERATOR_LOADER 
    1982     if (zend_hash_exists(&module_registry, EACCELERATOR_LOADER_EXTENSION_NAME, sizeof(EACCELERATOR_LOADER_EXTENSION_NAME))) { 
    1983       zend_error(E_CORE_WARNING,"Extension \"%s\" is not need with \"%s\". Remove it from php.ini\n", EACCELERATOR_LOADER_EXTENSION_NAME, EACCELERATOR_EXTENSION_NAME); 
    1984       zend_hash_del(&module_registry, EACCELERATOR_LOADER_EXTENSION_NAME, sizeof(EACCELERATOR_LOADER_EXTENSION_NAME)); 
     2018    if (zend_hash_exists(&module_registry, EACCELERATOR_LOADER_EXTENSION_NAME,  
     2019                sizeof(EACCELERATOR_LOADER_EXTENSION_NAME))) { 
     2020      zend_error(E_CORE_WARNING,"Extension \"%s\" is not need with \"%s\". Remove it from php.ini\n",  
     2021              EACCELERATOR_LOADER_EXTENSION_NAME, EACCELERATOR_EXTENSION_NAME); 
     2022      zend_hash_del(&module_registry, EACCELERATOR_LOADER_EXTENSION_NAME,  
     2023              sizeof(EACCELERATOR_LOADER_EXTENSION_NAME)); 
    19852024    } 
    19862025#endif 
     
    20062045 
    20072046  ea_debug_init(TSRMLS_C); 
     2047 
     2048  snprintf(fullpath, MAXPATHLEN-1, "%s/", EAG(cache_dir)); 
     2049  make_hash_dirs(fullpath, EACCELERATOR_HASH_LEVEL); 
    20082050 
    20092051  if (type == MODULE_PERSISTENT && 
  • eaccelerator/trunk/eaccelerator.h

    r205 r207  
    148148#define EACCELERATOR_UNBLOCK_INTERRUPTIONS() HANDLE_UNBLOCK_INTERRUPTIONS() 
    149149 
    150 #define MM_HASH_SIZE      256 
    151 #define MM_USER_HASH_SIZE 256 
    152 #define MM_HASH_MAX       (MM_HASH_SIZE-1) 
    153 #define MM_USER_HASH_MAX  (MM_USER_HASH_SIZE-1) 
     150#define EACCELERATOR_HASH_LEVEL 2 
     151#define EA_HASH_SIZE      512 
     152#define EA_USER_HASH_SIZE 512 
     153 
     154#define EA_HASH_MAX       (EA_HASH_SIZE-1) 
     155#define EA_USER_HASH_MAX  (EA_USER_HASH_SIZE-1) 
    154156 
    155157#define eaccelerator_malloc(size)        mm_malloc_lock(eaccelerator_mm_instance->mm, size) 
     
    339341        mm_lock_entry *locks; 
    340342 
    341         mm_cache_entry *hash[MM_HASH_SIZE]; 
    342         mm_user_cache_entry *user_hash[MM_USER_HASH_SIZE]; 
     343        mm_cache_entry *hash[EA_HASH_SIZE]; 
     344        mm_user_cache_entry *user_hash[EA_USER_HASH_SIZE]; 
    343345} eaccelerator_mm; 
    344346 
Note: See TracChangeset for help on using the changeset viewer.