Thank you for the very clear and detailed explanation of how the pool works.   
I think I'll give Pelops a try.

Todd

________________________________
From: Dominic Williams [mailto:thedwilli...@googlemail.com]
Sent: Monday, June 14, 2010 8:16 AM
To: user@cassandra.apache.org
Subject: Re: Pelops - a new Java client library paradigm

Hi, re: pools and detecting node failure...

Pooling is handled by ThriftPool. This class maintains a separate NodeContext 
object for each known node. This in turn maintains a pool of connections to its 
node.

Each NodeContext has a single "poolRefiller" object/thread, which runs either 
when signalled, or every ~2s, whichever is the sooner. Whenever it runs, the 
first thing it does is check which of its existing pooled connections are open. 
This is necessary for it to correctly calculate the number of new connections 
to open (assuming it has to)

To check whether a connection is open, it calls TTransport.isOpen, which is 
TSocket.isOpen, which is Socket.isConnected. If a connection is not open, then 
it is binned.

Therefore, pretty quickly if a node has failed, the NodeContext will not be 
holding any connections to it. This causes the NodeContext.isAvailable method 
to return false. When this is the case, that node is not considered by 
ThriftPool when it is seeking to return a connection to an operand (Mutator, 
Selector, KeyDeletor etc object)

The pool refiller thread keeps on trying to create connections to a node, even 
after all connections to it have failed. When/if it becomes available again, 
then as soon as a connection is made NodeContext.isAvailable will return true 
and it comes "back online" for the purposes of the operands.

NOTE: Some of my colleagues were working on Windows machines separated from our 
local development servers by low-end NAT routers. After some period using this 
Cassandra, inside Pelops even though TSocket.isOpen was returning true, when an 
operand tried using connections they were getting a timeout or other network 
exception. Calling setKeepAlive(true) on the underlying socket does not prevent 
this (although this option is best set because in general it should force 
timely detection of connection failure). Hector also experienced similar 
problems and we adopt a similar response - by default you'll see that Pelops 
sets Policy.getKillNodeConnsOnException() to true by default. What this means 
is that if a network exception is thrown when an operand interacts with a node, 
the NodeContext destroys all pooled connections to that node on the basis that 
the general failure of connections to that node may not be detectable because 
of the network setup. Of course, not many people will be running their 
Cassandra clients from Windows behind NAT in production, but the option is set 
by default because otherwise a segment of developers trying the library will 
experience persistent problems due to this network (and/or Thrift) strangeness 
and in production we are ourselves will switch it off (although note the worse 
downside is that the occasional network error to a node will cause the 
refreshing of its pool)

Hope this makes sense.
Best, Dominic

On 14 June 2010 15:32, Kochheiser,Todd W - TO-DITT1 
<twkochhei...@bpa.gov<mailto:twkochhei...@bpa.gov>> wrote:
Great API that looks easy and intuitive to use.  Regarding your connection pool 
implementation, how does it handle failed/crashed nodes?  Will the pool 
auto-detect failed nodes via a "tester" thread or will a failed node, and hence 
its pooled connection(s), be removed only when they are used?  Conversely, how 
will the pool be repopulated once the failed/crashed node becomes available?

Todd

________________________________
From: Dominic Williams 
[mailto:thedwilli...@googlemail.com<mailto:thedwilli...@googlemail.com>]
Sent: Friday, June 11, 2010 7:05 AM
To: user@cassandra.apache.org<mailto:user@cassandra.apache.org>
Subject: Re: Pelops - a new Java client library paradigm

Hi good question.

The scalability of Pelops is dependent on Cassandra, not the library itself. 
The library aims to provide an more effective access layer on top of the Thrift 
API.

The library does perform connection pooling, and you can control the size of 
the pool and other parameters using a policy object. But connection pooling 
itself does not increase scalability, only efficiency.

Hope this helps.
BEst, Dominic

On 11 June 2010 14:47, Ian Soboroff 
<isobor...@gmail.com<mailto:isobor...@gmail.com>> wrote:
Sounds nice.  Can you say something about the scales at which you've used this 
library?  Both write and read load?  Size of clusters and size of data?

Ian

On Fri, Jun 11, 2010 at 9:41 AM, Dominic Williams 
<thedwilli...@googlemail.com<mailto:thedwilli...@googlemail.com>> wrote:
Pelops is a new high quality Java client library for Cassandra.

It has a design that:
* reveals the full power of Cassandra through an elegant "Mutator and Selector" 
paradigm
* generates better, cleaner, less bug prone code
* reduces the learning curve for new users
* drives rapid application development
* encapsulates advanced pooling algorithms

An article introducing Pelops can be found at
http://ria101.wordpress.com/2010/06/11/pelops-the-beautiful-cassandra-database-client-for-java/

Thanks for reading.
Best, Dominic



Reply via email to