coopernurse / node-pool

Generic resource pooling for node.js
2.38k stars 259 forks source link

Is it possible to have a callback when the minimum number of connections is created? #93

Open abh1kg opened 9 years ago

abh1kg commented 9 years ago

Pretty cool module, I must say. I am using it for a project of mine and I couldn't find out whether it's really possible or not. Can the pool call a custom callback when the minimum number of connections are created?

Example: I am using the following piece of code to create the pool. Would it be possible to have a callback executed when the minimum number of connections (in this case, 3) is created?

var pool = gp.Pool({
        name : 'connection_pool',
        validate : function(client) {
            console.log('INFO- Validate called:' + (!client.hadError && client.readyState === 'connected'));
            return (!client.hadError && client.readyState === 'connected');
        },
        destroy : function(client) {
            // if the client is already closed don't call end
            if (!client.hadError && client.readyState !== 'closed') {
                client.end();
            }
        },
        max : 25,
        min : 3,
        idleTimeoutMillis : 30000,
        log : false,
        refreshIdle : true,
        create : function(callback) {
            options.autoReconnect = true;
            var client = hdb.createClient(options);
            client.hadError = false;
            client.once('error', function onerror(err) {
                console.error('Client error:', err);
                client.hadError = true;
            });
            client.connect(function(err) {
                if (err) {
                    return console.error("Error:" + err);
                }
            });
            callback(null, client);
        }
    });
sandfox commented 9 years ago

Currently it's not possible at the moment although in theory it could be added. Whats your use case for it?

abh1kg commented 9 years ago

@sandfox : I am building a service on Cloud Foundry PaaS, which initializes the pool with the minimum number of connections. The service is an HTTP component, which uses the pool for connection resource handling. I want to make it certain that unless the minimum connections have been created, HTTP calls must be blocked (or a maintenance error is returned). Without a callback, I am currently not finding a way to do this.

sandfox commented 9 years ago

Sounds like a good reason. At the moment the only ways to achieve that (that I can think of) without library changes is to poll the pool and check pool.getPoolSize() to see how "full" it is. It's not exactly a clean solution though and has plenty of room for being needlessly slow.

Alternatively (and I think this is the better option) you could add some code inside your create function that did something like incrementing a counter for you and once that counter crossed a threshold (the min pool size), you could then do some other action (e.g call a callback to allow your http server to start accepting connections).

Otherwise it's going to mean adding some event emitters / callbacks to the pool for events like "resource created" etc, but I'm not sure I'm going to have time to do that in the near future.

abh1kg commented 9 years ago

@sandfox: The counter-increment code inside the 'create' function is how I am doing this now. Probably a good way to achieve this but a callback would certainly be smoother.

t3hmrman commented 5 years ago

4 years later, it seems like this issue could be relatively easily solved by adding a custom Event for this? The library is EventEmitter-enabled right now and an an .emit near the minimum regulating code seems like all it would take?