Changeset 3e48d2ee in github


Ignore:
Timestamp:
Nov 21, 2008 1:19:30 PM (4 years ago)
Author:
alecpl <alec@…>
Branches:
master, HEAD, courier-fix, dev-browser-capabilities, pdo, release-0.6, release-0.7, release-0.8
Children:
dcf780a
Parents:
be7d3b6
Message:
  • Increase speed of session destroy and garbage clean up
  • Fix session timeout when DB server got clock skew (#1485490)
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • CHANGELOG

    rbe7d3b6 r3e48d2ee  
    55---------- 
    66- Fix 'cache' table cleanup on session destroy (#1485516) 
     7- Increase speed of session destroy and garbage clean up 
     8- Fix session timeout when DB server got clock skew (#1485490) 
    79 
    8102008/11/19 (alec) 
  • SQL/mssql.initial.sql

    r84d06ed r3e48d2ee  
    197197GO 
    198198 
     199 CREATE  INDEX [IX_session_changed] ON [dbo].[session]([changed]) ON [PRIMARY] 
     200GO 
     201 
    199202ALTER TABLE [dbo].[users] ADD  
    200203        CONSTRAINT [DF_users_username] DEFAULT ('') FOR [username], 
  • SQL/mysql.initial.sql

    rc98f3b5 r3e48d2ee  
    7474  `ip` VARCHAR(40) NOT NULL default '', 
    7575  `vars` text NOT NULL, 
    76   PRIMARY KEY  (`sess_id`) 
     76  PRIMARY KEY  (`sess_id`), 
     77  INDEX `changed_index` (`changed`)  
    7778); 
    7879 
  • SQL/mysql.update.sql

    rbe7d3b6 r3e48d2ee  
    3939    ON DELETE CASCADE 
    4040    ON UPDATE CASCADE; 
     41 
     42ALTER TABLE `session` 
     43    ADD INDEX `changed_index` (`changed`); 
  • SQL/mysql5.initial.sql

    rbe7d3b6 r3e48d2ee  
    1515 `ip` varchar(40) NOT NULL, 
    1616 `vars` text NOT NULL, 
    17  PRIMARY KEY(`sess_id`) 
     17 PRIMARY KEY(`sess_id`), 
     18 INDEX `changed_index` (`changed`) 
    1819) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; 
    1920 
  • SQL/postgres.initial.sql

    rbe7d3b6 r3e48d2ee  
    4343); 
    4444 
     45CREATE INDEX session_changed_idx ON session (changed); 
    4546 
    4647 
  • SQL/postgres.update.sql

    rbe7d3b6 r3e48d2ee  
    2626 
    2727ALTER TABLE cache DROP CONSTRAINT cache_session_id_fkey; 
    28 ALTER TABLE cache ADD FOREIGN KEY (session_id) REFERENCES session(sess_id) ON DELETE CASCADE ON UPDATE CASCADE; 
    29 CREATE INDEX cache_session_id_idx ON "cache" (session_id); 
     28ALTER TABLE cache ADD FOREIGN KEY (session_id) REFERENCES session (sess_id) ON DELETE CASCADE ON UPDATE CASCADE; 
     29 
     30CREATE INDEX cache_session_id_idx ON cache (session_id); 
     31CREATE INDEX session_changed_idx ON session (changed); 
  • SQL/sqlite.initial.sql

    rc98f3b5 r3e48d2ee  
    9898); 
    9999 
     100CREATE INDEX ix_session_changed ON session (changed); 
    100101 
    101102-- -------------------------------------------------------- 
  • SQL/sqlite.update.sql

    rc98f3b5 r3e48d2ee  
    3030 
    3131CREATE INDEX ix_messages_created ON messages (created); 
     32 
     33-- Updates from version 0.2-beta 
     34 
     35CREATE INDEX ix_session_changed ON session (changed); 
  • program/include/rcube_imap.php

    rbe7d3b6 r3e48d2ee  
    21472147      $this->db->query( 
    21482148        "UPDATE ".get_table_name('cache')." 
    2149          SET    created=".$this->db->now().", data=?, session_id=? 
     2149         SET    created=". $this->db->fromunixtime(time()).", data=?, session_id=? 
    21502150         WHERE  user_id=? 
    21512151         AND    cache_key=?", 
     
    21612161        "INSERT INTO ".get_table_name('cache')." 
    21622162         (created, user_id, cache_key, data, session_id) 
    2163          VALUES (".$this->db->now().", ?, ?, ?, ?)", 
     2163         VALUES (".$this->db->fromunixtime(time()).", ?, ?, ?, ?)", 
    21642164        $_SESSION['user_id'], 
    21652165        $key, 
     
    23752375        "INSERT INTO ".get_table_name('messages')." 
    23762376         (user_id, del, cache_key, created, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers, structure) 
    2377          VALUES (?, 0, ?, ".$this->db->now().", ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?, ?)", 
     2377         VALUES (?, 0, ?, ".$this->db->fromunixtime(time()).", ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?, ?)", 
    23782378        $_SESSION['user_id'], 
    23792379        $key, 
  • program/include/session.inc

    ra2740628 r3e48d2ee  
    7676    $key); 
    7777 
     78  $now = $DB->fromunixtime(time()); 
     79 
    7880  if ($DB->num_rows($sql_result)) { 
    7981    $DB->query( 
    8082      "UPDATE " . get_table_name('session') . " 
    81        SET    vars=?, changed=" . $DB->now() . " 
     83       SET    vars=?, changed= " . $now . " 
    8284       WHERE  sess_id=?", 
    8385      $vars, 
     
    8890      "INSERT INTO " . get_table_name('session') . " 
    8991       (sess_id, vars, ip, created, changed) 
    90        VALUES (?, ?, ?, ".$DB->now().", ".$DB->now().")", 
     92       VALUES (?, ?, ?, " . $now . ", " . $now .")", 
    9193      $key, 
    9294      $vars, 
     
    108110  } 
    109111 
     112  $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key); 
     113 
     114  // delete session entries in cache table 
     115  // on databases wthout foreign keys 
     116  if ($rcmail->config->get('enable_caching') && $DB->db_provider != 'pgsql') { 
     117    $DB->query("DELETE FROM " . get_table_name('cache') . " WHERE session_id=?", $key); 
     118  } 
     119 
     120  return true; 
     121} 
     122 
     123 
     124// garbage collecting function 
     125function rcube_sess_gc($maxlifetime) 
     126{ 
     127  $rcmail = rcmail::get_instance(); 
     128  $DB = $rcmail->get_dbh(); 
     129 
     130  if ($DB->is_error()) { 
     131    return false; 
     132  } 
     133 
     134  $now = $DB->fromunixtime(time() - $maxlifetime); 
     135 
    110136  // delete session entries in cache table 
    111137  if ($rcmail->config->get('enable_caching')) { 
    112     $DB->query("DELETE FROM " . get_table_name('cache') . " WHERE session_id=?", $key); 
    113   } 
    114                
    115   $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key); 
    116  
    117   return true; 
    118 } 
    119  
    120  
    121 // garbage collecting function 
    122 function rcube_sess_gc($maxlifetime) 
    123 { 
    124   $rcmail = rcmail::get_instance(); 
    125   $DB = $rcmail->get_dbh(); 
    126  
    127   if ($DB->is_error()) { 
    128     return false; 
    129   } 
    130  
    131   if ($rcmail->config->get('enable_caching')) { 
    132     // get all expired sessions 
    133     $sql_result = $DB->query( 
    134         "SELECT sess_id 
    135         FROM " . get_table_name('session') . " 
    136         WHERE " . $DB->unixtimestamp($DB->now())."-".$DB->unixtimestamp('changed') . " > ?", 
    137         $maxlifetime); 
    138                                     
    139     $exp_sessions = array(); 
    140     while ($sql_arr = $DB->fetch_assoc($sql_result)) { 
    141       $exp_sessions[] = $sql_arr['sess_id']; 
     138 
     139    // on databases wthout foreign keys... 
     140    if($DB->db_provider != 'pgsql') { 
     141 
     142      // get all expired sessions 
     143      $sql_result = $DB->query( 
     144        "SELECT sess_id FROM " . get_table_name('session') . " 
     145            WHERE changed < " . $now); 
     146 
     147      $exp_sessions = array(); 
     148      while ($sql_arr = $DB->fetch_assoc($sql_result)) { 
     149        $exp_sessions[] = $sql_arr['sess_id']; 
     150      } 
     151 
     152      if (sizeof($exp_sessions)) { 
     153        $exp_sessions = "'" . join("','", $exp_sessions) . "'"; 
     154        // delete session cache records 
     155        $DB->query("DELETE FROM " . get_table_name('cache') . " 
     156            WHERE session_id IN (" . $exp_sessions . ")"); 
     157      } 
    142158    } 
    143  
    144     if (sizeof($exp_sessions)) { 
    145       $exp_sessions = "'" . join("','", $exp_sessions) . "'"; 
    146       // delete session cache records 
    147       $DB->query("DELETE FROM " . get_table_name('cache') . " 
    148             WHERE session_id IN (" . $exp_sessions . ")"); 
    149  
    150       // delete session records 
    151       $DB->query("DELETE FROM " . get_table_name('session') . " 
    152             WHERE sess_id IN (" . $exp_sessions . ")"); 
    153     } 
    154  
    155159    // also run message cache GC 
    156160    rcmail_message_cache_gc(); 
    157    
    158   } else { 
    159     // just delete all expired sessions 
    160     $DB->query("DELETE FROM " . get_table_name('session') . " 
    161         WHERE " . $DB->unixtimestamp($DB->now())."-".$DB->unixtimestamp('changed') . " > ?", 
    162         $maxlifetime); 
    163   } 
     161  } 
     162 
     163  // just delete all expired sessions 
     164  $DB->query("DELETE FROM " . get_table_name('session') . " 
     165    WHERE changed < " . $now); 
    164166 
    165167  rcmail_temp_gc(); 
Note: See TracChangeset for help on using the changeset viewer.