Skip to content
This repository has been archived by the owner on Sep 18, 2021. It is now read-only.

Commit

Permalink
allow AutoDisablingDatabaseFactory to be configured. and test.
Browse files Browse the repository at this point in the history
  • Loading branch information
Robey Pointer committed Nov 12, 2010
1 parent a2df2c2 commit e87e42e
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 6 deletions.
Expand Up @@ -6,8 +6,8 @@ import org.apache.commons.pool.impl.{GenericObjectPool, StackKeyedObjectPoolFact
import com.twitter.xrayspecs.Duration

class ApachePoolingDatabaseFactory(
minOpenConnections: Int,
maxOpenConnections: Int,
val minOpenConnections: Int,
val maxOpenConnections: Int,
checkConnectionHealthWhenIdleFor: Duration,
maxWaitForConnectionReservation: Duration,
checkConnectionHealthOnReservation: Boolean,
Expand Down
Expand Up @@ -6,7 +6,7 @@ import com.twitter.xrayspecs.TimeConversions._
import java.sql.{Connection, SQLException, SQLIntegrityConstraintViolationException}


class AutoDisablingDatabaseFactory(databaseFactory: DatabaseFactory, disableErrorCount: Int, disableDuration: Duration) extends DatabaseFactory {
class AutoDisablingDatabaseFactory(val databaseFactory: DatabaseFactory, val disableErrorCount: Int, val disableDuration: Duration) extends DatabaseFactory {
def apply(dbhosts: List[String], dbname: String, username: String, password: String, urlOptions: Map[String, String]) = {
new AutoDisablingDatabase(
databaseFactory(dbhosts, dbname, username, password, urlOptions),
Expand Down
6 changes: 6 additions & 0 deletions src/main/scala/com/twitter/querulous/database/Database.scala
Expand Up @@ -38,6 +38,12 @@ object DatabaseFactory {
config("size_max").toInt)
}

config.getConfigMap("disable").foreach { disableConfig =>
factory = new AutoDisablingDatabaseFactory(factory,
disableConfig("error_count").toInt,
disableConfig("seconds").toInt.seconds)
}

new MemoizingDatabaseFactory(factory)
}
}
Expand Down
Expand Up @@ -2,7 +2,7 @@ package com.twitter.querulous.database

import scala.collection.mutable

class MemoizingDatabaseFactory(databaseFactory: DatabaseFactory) extends DatabaseFactory {
class MemoizingDatabaseFactory(val databaseFactory: DatabaseFactory) extends DatabaseFactory {
private val databases = new mutable.HashMap[String, Database] with mutable.SynchronizedMap[String, Database]

def apply(dbhosts: List[String], dbname: String, username: String, password: String, urlOptions: Map[String, String]) = synchronized {
Expand Down
Expand Up @@ -9,7 +9,7 @@ import net.lag.logging.Logger

class SqlDatabaseTimeoutException(msg: String, val timeout: Duration) extends SQLException(msg)

class TimingOutDatabaseFactory(databaseFactory: DatabaseFactory, poolSize: Int, queueSize: Int, openTimeout: Duration, initialTimeout: Duration, maxConnections: Int) extends DatabaseFactory {
class TimingOutDatabaseFactory(val databaseFactory: DatabaseFactory, val poolSize: Int, queueSize: Int, openTimeout: Duration, initialTimeout: Duration, maxConnections: Int) extends DatabaseFactory {
def apply(dbhosts: List[String], dbname: String, username: String, password: String, urlOptions: Map[String, String]) = {
val dbLabel = if (dbname != null) dbname else "(null)"

Expand Down
28 changes: 27 additions & 1 deletion src/test/scala/com/twitter/querulous/unit/DatabaseSpec.scala
Expand Up @@ -4,7 +4,7 @@ import java.sql.{PreparedStatement, Connection, Types}
import org.apache.commons.dbcp.{DelegatingConnection => DBCPConnection}
import com.mysql.jdbc.{ConnectionImpl => MySQLConnection}
import java.util.Properties
import net.lag.configgy.Configgy
import net.lag.configgy.{Config, Configgy}
import org.specs.Specification
import org.specs.mock.{ClassMocker, JMocker}
import com.twitter.xrayspecs.TimeConversions._
Expand Down Expand Up @@ -44,6 +44,32 @@ class DatabaseSpec extends Specification with JMocker with ClassMocker {
}
}

"DatabaseFactory" should {
"fromConfig" in {
val poolConfig = Config.fromMap(Map("size_min" -> "0", "size_max" -> "12",
"test_idle_msec" -> "1000", "test_on_borrow" -> "false", "max_wait" -> "100",
"min_evictable_idle_msec" -> "5000"))
val timeoutConfig = Config.fromMap(Map("pool_size" -> "10", "queue_size" -> "7",
"open" -> "100", "initialize" -> "77"))
val disableConfig = Config.fromMap(Map("error_count" -> "99", "seconds" -> "34"))
poolConfig.setConfigMap("timeout", timeoutConfig)
poolConfig.setConfigMap("disable", disableConfig)

val factory = DatabaseFactory.fromConfig(poolConfig, None)
factory must haveClass[MemoizingDatabaseFactory]
val factory2 = factory.asInstanceOf[MemoizingDatabaseFactory].databaseFactory
factory2 must haveClass[AutoDisablingDatabaseFactory]
factory2.asInstanceOf[AutoDisablingDatabaseFactory].disableErrorCount mustEqual 99
val factory3 = factory2.asInstanceOf[AutoDisablingDatabaseFactory].databaseFactory
factory3 must haveClass[TimingOutDatabaseFactory]
factory3.asInstanceOf[TimingOutDatabaseFactory].poolSize mustEqual 10
val factory4 = factory3.asInstanceOf[TimingOutDatabaseFactory].databaseFactory
factory4 must haveClass[ApachePoolingDatabaseFactory]
factory4.asInstanceOf[ApachePoolingDatabaseFactory].minOpenConnections mustEqual 0
factory4.asInstanceOf[ApachePoolingDatabaseFactory].maxOpenConnections mustEqual 12
}
}

"SingleConnectionDatabaseFactory" should {
val factory = new SingleConnectionDatabaseFactory(defaultProps)
testFactory(factory)
Expand Down

0 comments on commit e87e42e

Please sign in to comment.