You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Bernd Eckenfels (JIRA)" <ji...@apache.org> on 2014/09/04 06:46:51 UTC
[jira] [Commented] (POOL-276) Validation code invoked on unexpected
timing.
[ https://issues.apache.org/jira/browse/POOL-276?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14120952#comment-14120952 ]
Bernd Eckenfels commented on POOL-276:
--------------------------------------
The sequence is:
{code}
1409804599167 main Created 0 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804599229 main Wrapped 0 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804599229 main Validated 1 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804599229 main Borrowed 1 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804602256 Timer-0 Returning 1 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804602256 main Validated 2 379cbef5-3e40-4f39-af5f-ac3e76506e81
1409804602256 main Borrowed Again 2 379cbef5-3e40-4f39-af5f-ac3e76506e81
{code}
Discussion on [commons-user|http://mail-archives.apache.org/mod_mbox/commons-user/201409.mbox/%3CCADQ45ZFFpUuW0qBtUi0OwbuZ9ePfGtCp2eKcEYxskRn6QAM8%2Bg%40mail.gmail.com%3E].
> Validation code invoked on unexpected timing.
> ---------------------------------------------
>
> Key: POOL-276
> URL: https://issues.apache.org/jira/browse/POOL-276
> Project: Commons Pool
> Issue Type: Bug
> Affects Versions: 2.2
> Environment: jdk1.7.0_55 on CentOS6
> Reporter: Noriyuki Torii
>
> I found BasePooledObjectFactory.validateObject() of commons-pool sometimes called on unexpected timing.
> I've configured the pool so as to the validateObject() would be invoked only on instance creation, but sometimes it was invoked for "non-fresh" instance on borrowing.
> Reproduction code below.
> {code}
> import java.io.*;
> import java.util.*;
> import org.apache.commons.pool2.*;
> import org.apache.commons.pool2.impl.*;
> public class reproduction
> {
> private static class MyPooledObj
> {
> volatile int i = 0;
> final String uuid = UUID.randomUUID().toString();
> }
> private static class MyFactory extends BasePooledObjectFactory<MyPooledObj>
> {
> @Override
> public MyPooledObj create() {
> return new MyPooledObj();
> }
> @Override
> public PooledObject<MyPooledObj> wrap(MyPooledObj o) {
> return new DefaultPooledObject<MyPooledObj>(o);
> }
> @Override
> public boolean validateObject(PooledObject<MyPooledObj> o) {
> MyPooledObj myobj = o.getObject();
> synchronized (myobj) {
> myobj.i++;
> }
> System.out.println("Validated.");
> return true;
> }
> }
> public static void main(String[] args)
> throws Exception
> {
> GenericObjectPoolConfig poolCfg = new GenericObjectPoolConfig() ;
> poolCfg.setMaxTotal(1);
> poolCfg.setMaxIdle(1);
> poolCfg.setBlockWhenExhausted(true);
> poolCfg.setMaxWaitMillis(10000);
> poolCfg.setTestOnCreate(true); // should be validated only on creation
> poolCfg.setTestOnBorrow(false);
> poolCfg.setTestOnReturn(false);
> poolCfg.setTestWhileIdle(false);
> final GenericObjectPool<MyPooledObj> pool =
> new GenericObjectPool<MyPooledObj>(new MyFactory(), poolCfg);
> final MyPooledObj o = pool.borrowObject();
> System.out.printf("%d: %s\n", o.i, o.uuid);
> Timer t = new Timer();
> t.schedule
> (new TimerTask() {
> public void run() {
> pool.returnObject(o);
> }
> }, 3000);
> // validation will occur again for non-fresh instance,
> // confirmed on commons-pool2-2.2 with jdk1.7.0_55
> MyPooledObj o2 = pool.borrowObject();
> System.out.printf("%d: %s\n", o2.i, o2.uuid);
> pool.returnObject(o2);
> pool.close();
> t.cancel();
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)