private static GraphiteWriter getGraphiteWriter(OutputStream out, List<String> typeNames) throws Exception { GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(2003).addTypeNames(typeNames).build(); writer.setPool(pool); return writer; }
@Override public GPCatalogConnectorStore build() throws Exception { Preconditions.checkNotNull(serverUrl, "CSW Server URL must " + "not be null."); GPPoolConnectorKey keyConnector = super.proxyConfiguration != null ? new GPPoolConnectorKey(serverUrl, securityConnector, proxyConfiguration, version) : new GPPoolConnectorKey(serverUrl, securityConnector, version); GPCatalogConnectorStore catalogStore = catalogConnectoPool.borrowObject(keyConnector); catalogConnectoPool.returnObject(keyConnector, catalogStore); return catalogStore; }
@Test public void socketInvalidatedWhenError() throws Exception { GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); UnflushableByteArrayOutputStream out = new UnflushableByteArrayOutputStream(); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(2003).build(); writer.setPool(pool); writer.doWrite(dummyServer(), dummyQuery(), dummyResults()); Mockito.verify(pool) .invalidateObject(Matchers.any(InetSocketAddress.class), Matchers.eq(socket)); Mockito.verify(pool, Mockito.never()) .returnObject(Matchers.any(InetSocketAddress.class), Matchers.eq(socket)); }
@Override public void invalidateObject(RConnection connection) throws Exception { Field hostField = connection.getClass().getDeclaredField("host"); hostField.setAccessible(true); String host = (String) hostField.get(connection); keyedConnectionPool.invalidateObject(host, connection); hostQueue.put(host); }
public synchronized String getDebugInfo() { StringBuilder builder = new StringBuilder(); builder.append("Hosts: ").append(StringUtils.join(hosts, ", ")).append("\n"); builder.append("Num connections per host: ").append(numConnections).append("\n"); builder.append("\n"); for (String host : hosts) { builder.append(host).append(": "); builder.append(keyedConnectionPool.getNumActive(host)).append(" active; "); builder.append(keyedConnectionPool.getNumIdle(host)).append(" idle.\n"); } builder.append("\n"); builder.append("Total: "); builder.append(this.getNumActive()).append(" active; "); builder.append(this.getNumIdle()).append(" idle.\n"); builder.append("\n"); builder.append("Queue: ").append(StringUtils.join(hostQueue.toArray(), ", ")); return builder.toString(); }
@Test public void booleanAsNumberWorks() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(123).setBooleanAsNumber(true).build(); writer.setPool(pool); writer.doWrite(dummyServer(), dummyQuery(), singleTrueResult()); // check that the booleanAsNumber property was picked up from the JSON assertThat(out.toString()) .startsWith("servers.host_example_net_4321.VerboseMemory.Verbose 1 0"); }
public RserveConnectionPool(String[] hosts, int numConnections) { this.hosts = hosts; this.numConnections = numConnections; final RserveConnectionFactory keyedConnectionFactory = new RserveConnectionFactory(); final GenericKeyedObjectPool.Config config = new GenericKeyedObjectPool.Config(); config.maxActive = numConnections; config.maxIdle = numConnections; config.minIdle = numConnections; config.whenExhaustedAction = GenericKeyedObjectPool.WHEN_EXHAUSTED_BLOCK; config.testOnBorrow = true; config.testOnReturn = true; config.testWhileIdle = true; config.timeBetweenEvictionRunsMillis = 1000; // enables eviction thread config.minEvictableIdleTimeMillis = -1; // disable eviction due to idle time config.numTestsPerEvictionRun = -1; // test all idle objects config.lifo = false; keyedConnectionPool = new GenericKeyedObjectPool<String, RConnection>(keyedConnectionFactory, config); // Initialise keyed object pool with each host for (String host : hosts) { keyedConnectionPool.preparePool(host, false); } // Initialise blocking queue with elements representing potential host connections. // There are n elements per host, where n is the number of connections permitted per host. // When connections are obtained, we take the host from the head of the queue and use this as // the key to the pool. // When connections are released, we return the host to the tail of the queue so future // connections can be obtained. // This implements a first-available-first-used (or first-in-first-out) model for host // connections. hostQueue = new ArrayBlockingQueue<String>(hosts.length * numConnections, true); for (String host : hosts) { for (int i = 0; i < numConnections; i++) { hostQueue.add(host); } } }
private synchronized void registerPool(String username, String password) throws javax.naming.NamingException { Map pools = (Map) dsInstanceMap.get(instanceKey); PoolKey key = getPoolKey(username); if (!pools.containsKey(key)) { int maxActive = getDefaultMaxActive(); int maxIdle = getDefaultMaxIdle(); int maxWait = getDefaultMaxWait(); // The source of physical db connections ConnectionPoolDataSource cpds = this.cpds; if (cpds == null) { Context ctx = null; if (jndiEnvironment == null) { ctx = new InitialContext(); } else { ctx = new InitialContext(jndiEnvironment); } cpds = (ConnectionPoolDataSource) ctx.lookup(dataSourceName); } Object whicheverPool = null; if (perUserMaxActive != null && perUserMaxActive.containsKey(username)) { Integer userMax = getPerUserMaxActive(username); if (userMax != null) { maxActive = userMax.intValue(); } userMax = getPerUserMaxIdle(username); if (userMax != null) { maxIdle = userMax.intValue(); } userMax = getPerUserMaxWait(username); if (userMax != null) { maxWait = userMax.intValue(); } // Create an object pool to contain our PooledConnections GenericObjectPool pool = new GenericObjectPool(null); pool.setMaxActive(maxActive); pool.setMaxIdle(maxIdle); pool.setMaxWait(maxWait); pool.setWhenExhaustedAction(getWhenExhausted(maxActive, maxWait)); pool.setTestOnBorrow(getTestOnBorrow()); pool.setTestOnReturn(getTestOnReturn()); pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis()); pool.setNumTestsPerEvictionRun(getNumTestsPerEvictionRun()); pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); pool.setTestWhileIdle(getTestWhileIdle()); // Set up the factory we will use (passing the pool associates // the factory with the pool, so we do not have to do so // explicitly) new CPDSConnectionFactory(cpds, pool, validationQuery, username, password); whicheverPool = pool; } else { // use default pool // Create an object pool to contain our PooledConnections GenericKeyedObjectPool pool = new GenericKeyedObjectPool(null); pool.setMaxActive(maxActive); pool.setMaxIdle(maxIdle); pool.setMaxWait(maxWait); pool.setWhenExhaustedAction(getWhenExhausted(maxActive, maxWait)); pool.setTestOnBorrow(getTestOnBorrow()); pool.setTestOnReturn(getTestOnReturn()); pool.setTimeBetweenEvictionRunsMillis(getTimeBetweenEvictionRunsMillis()); pool.setNumTestsPerEvictionRun(getNumTestsPerEvictionRun()); pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); pool.setTestWhileIdle(getTestWhileIdle()); // Set up the factory we will use (passing the pool associates // the factory with the pool, so we do not have to do so // explicitly) new KeyedCPDSConnectionFactory(cpds, pool, validationQuery); whicheverPool = pool; } // pools is a FastHashMap set to put the pool in a thread-safe way pools.put(key, whicheverPool); } }
@Override public int getNumActive() throws UnsupportedOperationException { return keyedConnectionPool.getNumActive(); }
@Override public RConnection borrowObject() throws Exception, NoSuchElementException, IllegalStateException { String host = hostQueue.take(); return keyedConnectionPool.borrowObject(host); }
@Override public void close() throws Exception { keyedConnectionPool.close(); }
@Override public void clear() throws Exception, UnsupportedOperationException { keyedConnectionPool.clear(); }