mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-26 05:11:33 +01:00
BUG/MINOR: 51d: Aligns Pattern cache implementation with HAProxy best practices.
Malloc continues to be used for the creation of cache entries. The implementation has been enhanced ready for production deployment. A new method to free cache entries created in 51d.c has been added to ensure memory is released correctly. This should be backported to 1.6.
This commit is contained in:
parent
82a9d76f15
commit
c9dfa24808
37
src/51d.c
37
src/51d.c
@ -127,23 +127,52 @@ static int _51d_conv_check(struct arg *arg, struct sample_conv *conv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FIFTYONEDEGREES_H_PATTERN_INCLUDED
|
#ifdef FIFTYONEDEGREES_H_PATTERN_INCLUDED
|
||||||
|
static void _51d_lru_free(void *cache_entry)
|
||||||
|
{
|
||||||
|
struct chunk *ptr = cache_entry;
|
||||||
|
|
||||||
|
if (!ptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
free(ptr->str);
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocates memory freeing space in the cache if necessary.
|
||||||
|
*/
|
||||||
|
static void *_51d_malloc(int size)
|
||||||
|
{
|
||||||
|
void *ptr = malloc(size);
|
||||||
|
|
||||||
|
if (!ptr) {
|
||||||
|
/* free the oldest 10 entries from lru to free up some memory
|
||||||
|
* then try allocating memory again */
|
||||||
|
lru64_kill_oldest(_51d_lru_tree, 10);
|
||||||
|
ptr = malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* Insert the data associated with the sample into the cache as a fresh item.
|
/* Insert the data associated with the sample into the cache as a fresh item.
|
||||||
*/
|
*/
|
||||||
static void _51d_insert_cache_entry(struct sample *smp, struct lru64 *lru, void* domain)
|
static void _51d_insert_cache_entry(struct sample *smp, struct lru64 *lru, void* domain)
|
||||||
{
|
{
|
||||||
struct chunk *cache_entry = (struct chunk*)malloc(sizeof(struct chunk));
|
struct chunk *cache_entry = _51d_malloc(sizeof(struct chunk));
|
||||||
|
|
||||||
if (!cache_entry)
|
if (!cache_entry)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cache_entry->str = malloc(smp->data.u.str.len + 1);
|
cache_entry->str = _51d_malloc(smp->data.u.str.len + 1);
|
||||||
if (!cache_entry->str)
|
if (!cache_entry->str) {
|
||||||
|
free(cache_entry);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(cache_entry->str, smp->data.u.str.str, smp->data.u.str.len);
|
memcpy(cache_entry->str, smp->data.u.str.str, smp->data.u.str.len);
|
||||||
cache_entry->str[smp->data.u.str.len] = 0;
|
cache_entry->str[smp->data.u.str.len] = 0;
|
||||||
cache_entry->len = smp->data.u.str.len;
|
cache_entry->len = smp->data.u.str.len;
|
||||||
lru64_commit(lru, cache_entry, domain, 0, free);
|
lru64_commit(lru, cache_entry, domain, 0, _51d_lru_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieves the data from the cache and sets the sample data to this string.
|
/* Retrieves the data from the cache and sets the sample data to this string.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user