On 2013-11-25 18:31, Alan DeKok wrote:
Looks good. I'll commit a patch.
It should also be doing the CLEAR only once per second. It doesn't make sense to do it on every FIND. That's just unnecessary overhead.
Alan DeKok.
Hello Alan, Feeling stupid to ask this, but shouldn't you use some kind of locking while reading/writing data->last_clear? Do you rely on atomicity of int? now = time(NULL); if (data->last_clear < now) { data->last_clear = now; ... } Another questions is related to the "CLEAR" operation: do we really need to update "expired" records and then retrieve one from unassigned list? Instead we could take an address if it's unassigned or assigned but expired, something like: SELECT framedipaddress FROM ${ippool_table} WHERE pool_name = '%{control:Pool-Name}' AND expiry_time IS NULL OR expiry_time <= NOW() - INTERVAL 1 SECOND ORDER BY RAND() LIMIT 1 FOR UPDATE OR is inefficient here so we can change expiry_time from: `expiry_time` datetime DEFAULT NULL to `expiry_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' and later use the following query: SELECT framedipaddress FROM ${ippool_table} WHERE pool_name = '%{control:Pool-Name}' AND expiry_time <= NOW() - INTERVAL 1 SECOND ORDER BY RAND() LIMIT 1 FOR UPDATE Yes, I know I have covered mysql case only, but I believe the similar approach can be used with other databases. BR, -- George Chelidze Software Developer Magticom Ltd.