@@ -55,80 +55,77 @@ public ObjectPoolPartition(ObjectPool<T> pool, PoolConfig config,
55
55
this .totalCount = 0 ;
56
56
this .log = new CustomLogger (name , host );
57
57
this .takeSemaphore = new Semaphore (config .getMaxSize (), true );
58
- for (int i = 0 ; i < config .getMinSize (); i ++) {
59
- try {
60
- T object = objectFactory .create (host , socketTimeout , connectTimeout );
61
- objectQueue .add (new Poolable <>(object , pool , host ));
62
- totalCount ++;
63
- }
64
- catch (Exception e ) {
65
- log .warn ("Error in initializing pool, error: " + e );
58
+ try {
59
+ for (int i = 0 ; i < config .getMinSize (); i ++) {
60
+ T object = objectFactory .create (host , socketTimeout , connectTimeout );
61
+ objectQueue .add (new Poolable <>(object , pool , host ));
62
+ totalCount ++;
66
63
}
67
64
}
65
+ catch (Exception e ) {
66
+ // skipping logging the exception as factories are already logging.
67
+ }
68
68
}
69
69
70
70
public void returnObject (Poolable <T > object )
71
71
{
72
- takeSemaphore . release ();
73
- if (!objectFactory .validate (object .getObject ())) {
74
- log .debug (String .format ("Invalid object...removing: %s " , object ));
75
- decreaseObject (object );
76
- return ;
77
- }
72
+ try {
73
+ if (!objectFactory .validate (object .getObject ())) {
74
+ log .debug (String .format ("Invalid object...removing: %s " , object ));
75
+ decreaseObject (object );
76
+ return ;
77
+ }
78
78
79
- log .debug (String .format ("Returning object: %s to queue. Queue size: %d" , object , objectQueue .size ()));
80
- if (!objectQueue .offer (object )) {
81
- log .warn ("Created more objects than configured. Created=" + totalCount + " QueueSize=" + objectQueue .size ());
82
- decreaseObject (object );
79
+ log .debug (String .format ("Returning object: %s to queue. Queue size: %d" , object , objectQueue .size ()));
80
+ if (!objectQueue .offer (object )) {
81
+ log .warn ("Created more objects than configured. Created=" + totalCount + " QueueSize=" + objectQueue .size ());
82
+ decreaseObject (object );
83
+ }
84
+ }
85
+ finally {
86
+ takeSemaphore .release ();
83
87
}
84
88
}
85
89
86
90
public Poolable <T > getObject (boolean blocking )
87
91
{
88
- try {
89
- takeSemaphore .tryAcquire (config .getMaxWaitMilliseconds (), TimeUnit .MILLISECONDS );
90
- }
91
- catch (InterruptedException e ) {
92
- e .printStackTrace ();
93
- throw new RuntimeException ("Cannot get a free object from the pool" );
94
- }
95
-
96
92
Poolable <T > object ;
97
- if (blocking ) {
98
- try {
93
+ try {
94
+ if (blocking ) {
95
+ takeSemaphore .acquire ();
99
96
object = objectQueue .take ();
100
97
}
101
- catch (InterruptedException e ) {
102
- throw new RuntimeException (e ); // will never happen
98
+ else {
99
+ takeSemaphore .tryAcquire (config .getMaxWaitMilliseconds (), TimeUnit .MILLISECONDS );
100
+ object = tryGetObject ();
103
101
}
102
+ object .setLastAccessTs (System .currentTimeMillis ());
104
103
}
105
- else
106
- {
107
- object = tryGetObject ( objectQueue . poll () );
104
+ catch ( Exception e ) {
105
+ takeSemaphore . release ();
106
+ throw new RuntimeException ( "Cannot get a free object from the pool" , e );
108
107
}
109
- object .setLastAccessTs (System .currentTimeMillis ());
110
108
return object ;
111
109
}
112
110
113
- private Poolable <T > tryGetObject (Poolable < T > poolable )
111
+ private Poolable <T > tryGetObject () throws Exception
114
112
{
113
+ Poolable <T > poolable = objectQueue .poll ();
115
114
if (poolable == null )
116
115
{
117
116
try {
118
117
T object = objectFactory .create (host , socketTimeout , connectTimeout );
119
118
poolable = new Poolable <>(object , pool , host );
120
119
totalCount ++;
121
- log .debug (String .format ("Increased pool size by %d, to new size: %d, current queue size: %d, delta: %d" ,
122
- 1 , totalCount , objectQueue .size (), 1 ));
120
+ log .debug (String .format ("Added a connection, new totalCount: %d, queueSize: %d" , totalCount , objectQueue .size ()));
123
121
}
124
122
catch (Exception e ) {
125
- log .warn (String .format ("Unable to increase pool size. Pool state: totalCount=%d queueSize=%d delta=%d" , totalCount , objectQueue .size (), 1 ), e );
126
- // objectToReturn is not on the queue hence untracked, clean it up before forwarding exception
123
+ log .warn (String .format ("Unable create a connection. Pool state: totalCount=%d queueSize=%d" , totalCount , objectQueue .size ()), e );
127
124
if (poolable != null ) {
128
125
objectFactory .destroy (poolable .getObject ());
129
126
poolable .destroy ();
130
127
}
131
- throw new RuntimeException ( e ) ;
128
+ throw e ;
132
129
}
133
130
}
134
131
return poolable ;
0 commit comments