All pastes #2126811 Raw Edit

Someone

public text v1 · immutable
#2126811 ·published 2012-03-11 13:11 UTC
rendered paste body
<?php
require_once('settings/Config.class.php');
require_once('lib/RedisClient.class.php');
require_once('lib/Pool/ConnectionHandler.class.php');
require_once('lib/Monitoring/PinbaClient.class.php');

class RedisMapper {
  private $pool = array();

  private static $globalRedis = null;
  private static $instance = null;

  public static function getRedis($node_id) {
    return self::$instance->_getRedis($node_id);
  }
  
  public function _getRedis($node_id) {
    if(!array_key_exists($node_id, $this->pool)) {
      Daemon::log('Unknown node: '.$node_id);
      Daemon::log(Debug::Dump(array_keys($this->pool)));
      Daemon::log(Debug::backtrace());
      return false;
    }

    $obj = null;
    $timer = PinbaClient::createCmdExecTimer('RedisPoolSearch')->start();
    $s = sizeof($this->pool[$node_id]);
    $l = $s - 1;
    $acq_r = null;
    for($i = 0; $i < $s; ++$i) {
      if($this->pool[$node_id][$i]->acquire()) {
        $obj = $this->pool[$node_id][$i];
        break;
      }

      if($i == $l) {
        $i = 0;
        usleep(100); // FIXME: we need in this usleep call?
      }
    }
    $timer->stop();
    
    $obj->ping();
    return $obj;
  }

  private static function connect(array $conf) {
    $redis = null;
    if(array_key_exists('socket', $conf)) {
      $redis = new RedisClient(null, null, $conf['socket'], $conf['db']);
    }
    else {
      $redis = new RedisClient($conf['host'], $conf['port'], null, $conf['db']);
    }
    $redis->connect();
    return $redis;
  }

  public static function getPersistent($node_id) {
    if(!array_key_exists($node_id, Config::getRedisNodes())) {
      Daemon::log('Unknown node: '.$node_id);
      Daemon::log(Debug::Dump(array_keys(self::$pool)));
      Daemon::log(Debug::backtrace());
      return false;
    }

    return self::connect(Config::getRedisNodeParams($node_id));
  }

  public static function init() {
    self::$instance = new RedisMapper();
    self::$instance->_init();
  }

  public function __construct() {
  }

  public function _init() {
    $nodes = array_keys(Config::getRedisNodes());
    $params = array();
    foreach($nodes as $id) {
      $this->pool[$id] = array();
      $params = Config::getRedisNodeParams($id);
      for($i = 0; $i < $params['max_connections']; ++$i) {
        $this->pool[$id][] = ConnectionHandler::getCHandler(self::connect($params), ConnectionHandler::REDIS_LOCK_PREFIX);
      }
    }
  }

  public static function tearDown() {
    self::$instance->_tearDown();
    self::$instance = null;
  }

  public function _tearDown() {
    $keys = array_keys($this->pool);
    for($i = 0, $s = sizeof($this->pool); $i < $s; ++$i) {
      for($j = 0, $l = sizeof($this->pool[$keys[$i]]); $j < $l; ++$j) {
        if($this->pool[$keys[$i]][$j] instanceof ConnectionHandler) {
          $this->pool[$keys[$i]][$j]->tearDown();
          $this->pool[$keys[$i]][$j] = null;
        }
      }
    }

    $this->pool = null;
  }
}