mirror of
https://github.com/valitydev/cache.git
synced 2024-11-06 09:55:20 +00:00
rotate chunk if chunk quota exeeded
This commit is contained in:
parent
0c290e12b7
commit
36ea69e896
@ -237,13 +237,6 @@ evict(#cache{}=S) ->
|
|||||||
heap = cache_heap:alloc(cache_heap:free(Cell, S#cache.heap))
|
heap = cache_heap:alloc(cache_heap:free(Cell, S#cache.heap))
|
||||||
}.
|
}.
|
||||||
|
|
||||||
drop(#cache{}=S) ->
|
|
||||||
Cell = cache_heap:last(S#cache.heap),
|
|
||||||
?DEBUG("cache ~p: free cell ~p~n", [S#cache.name, Cell]),
|
|
||||||
S#cache{
|
|
||||||
heap = cache_heap:free(Cell, S#cache.heap)
|
|
||||||
}.
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
%%
|
%%
|
||||||
quota(#cache{}=S) ->
|
quota(#cache{}=S) ->
|
||||||
@ -255,23 +248,23 @@ quota(#cache{}=S) ->
|
|||||||
maybe_size_quota(#cache{quota_size=undefined}=S) ->
|
maybe_size_quota(#cache{quota_size=undefined}=S) ->
|
||||||
S;
|
S;
|
||||||
maybe_size_quota(S) ->
|
maybe_size_quota(S) ->
|
||||||
case lists:sum(cache_heap:size(S#cache.heap)) of
|
Quota = S#cache.quota_size div S#cache.n,
|
||||||
Size when Size > S#cache.quota_size ->
|
[Head | _] = cache_heap:cells(S#cache.heap),
|
||||||
maybe_size_quota(drop(S));
|
case ets:info(Head, size) of
|
||||||
|
Val when Val >= Quota ->
|
||||||
|
evict(S);
|
||||||
_ ->
|
_ ->
|
||||||
S#cache{
|
S
|
||||||
heap = cache_heap:talloc(S#cache.n, S#cache.heap)
|
|
||||||
}
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
maybe_memory_quota(#cache{quota_memory=undefined}=S) ->
|
maybe_memory_quota(#cache{quota_memory=undefined}=S) ->
|
||||||
S;
|
S;
|
||||||
maybe_memory_quota(S) ->
|
maybe_memory_quota(S) ->
|
||||||
case lists:sum(cache_heap:memory(S#cache.heap)) of
|
Quota = S#cache.quota_size div S#cache.n,
|
||||||
Size when Size > S#cache.quota_memory ->
|
[Head | _] = cache_heap:cells(S#cache.heap),
|
||||||
maybe_memory_quota(drop(S));
|
case ets:info(Head, memory) of
|
||||||
|
Val when Val >= Quota ->
|
||||||
|
evict(S);
|
||||||
_ ->
|
_ ->
|
||||||
S#cache{
|
S
|
||||||
heap = cache_heap:talloc(S#cache.n, S#cache.heap)
|
|
||||||
}
|
|
||||||
end.
|
end.
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
-module(cache_heap).
|
-module(cache_heap).
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
new/1, alloc/1, talloc/2, free/1, free/2,
|
new/1, alloc/1, free/1, free/2,
|
||||||
cells/1, size/1, memory/1, last/1, first/1
|
cells/1, size/1, memory/1, last/1, first/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
@ -45,17 +45,6 @@ alloc(#heap{}=H) ->
|
|||||||
cells = [create() | H#heap.cells]
|
cells = [create() | H#heap.cells]
|
||||||
}.
|
}.
|
||||||
|
|
||||||
% tail alloc
|
|
||||||
talloc(N, #heap{}=H)
|
|
||||||
when length(H#heap.cells) < N ->
|
|
||||||
talloc(N,
|
|
||||||
H#heap{
|
|
||||||
cells = H#heap.cells ++ [create()]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
talloc(_, #heap{}=H) ->
|
|
||||||
H.
|
|
||||||
|
|
||||||
create() ->
|
create() ->
|
||||||
ets:new(undefined, [set, protected]).
|
ets:new(undefined, [set, protected]).
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user