From 0c6ac7e491fc155559ae74ca65e29f37890b5ab6 Mon Sep 17 00:00:00 2001 From: Daniil Fedotov Date: Wed, 20 Sep 2017 15:56:52 +0100 Subject: [PATCH] Fix segmented cache expiration timeouts. --- .../src/rabbit_auth_cache_ets_segmented.erl | 13 +++++-------- .../test/rabbit_auth_cache_SUITE.erl | 7 +++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/deps/rabbitmq_auth_backend_cache/src/rabbit_auth_cache_ets_segmented.erl b/deps/rabbitmq_auth_backend_cache/src/rabbit_auth_cache_ets_segmented.erl index ab4cc3df06..b470cd2535 100644 --- a/deps/rabbitmq_auth_backend_cache/src/rabbit_auth_cache_ets_segmented.erl +++ b/deps/rabbitmq_auth_backend_cache/src/rabbit_auth_cache_ets_segmented.erl @@ -65,8 +65,7 @@ init([SegmentSize]) -> handle_call({get_write_segment, Expiration}, _From, State = #state{segments = Segments, segment_size = SegmentSize}) -> - NewBoundary = new_boundary(Expiration, SegmentSize), - [{_, Segment} | _] = NewSegments = maybe_add_segment(NewBoundary, Segments), + [{_, Segment} | _] = NewSegments = maybe_add_segment(Expiration, SegmentSize, Segments), {reply, Segment, State#state{segments = NewSegments}}; handle_call(get_segment_tables, _From, State = #state{segments = Segments}) -> {_, Valid} = partition_expired_segments(Segments), @@ -95,18 +94,16 @@ partition_expired_segments(Segments) -> fun({Boundary, _}) -> rabbit_auth_cache:expired(Boundary) end, Segments). -maybe_add_segment(Boundary, OldSegments) -> +maybe_add_segment(Expiration, SegmentSize, OldSegments) -> case OldSegments of - [{OldBoundary, _}|_] when OldBoundary > Boundary -> + [{OldBoundary, _}|_] when OldBoundary > Expiration -> OldSegments; _ -> + NewBoundary = Expiration + SegmentSize, Segment = ets:new(segment, [set, public]), - [{Boundary, Segment} | OldSegments] + [{NewBoundary, Segment} | OldSegments] end. -new_boundary(Expiration, SegmentSize) -> - ((Expiration div SegmentSize) * SegmentSize) + SegmentSize. - get_from_segments(Key) -> Tables = gen_server2:call(?MODULE, get_segment_tables), lists:flatmap( diff --git a/deps/rabbitmq_auth_backend_cache/test/rabbit_auth_cache_SUITE.erl b/deps/rabbitmq_auth_backend_cache/test/rabbit_auth_cache_SUITE.erl index a2fbe89295..8593b9ca13 100644 --- a/deps/rabbitmq_auth_backend_cache/test/rabbit_auth_cache_SUITE.erl +++ b/deps/rabbitmq_auth_backend_cache/test/rabbit_auth_cache_SUITE.erl @@ -164,8 +164,11 @@ random_timing(Config, MaxTTL, Parallel) -> Value = {tuple_with, N, TTL}, {error, not_found} = AuthCacheModule:get(Key), ok = AuthCacheModule:put(Key, Value, TTL), - {ok, Value} = AuthCacheModule:get(Key), - % 20ms expiry error + case AuthCacheModule:get(Key) of + {ok, Value} -> ok; + Other -> error({Other, Value}) + end, + % expiry error timer:sleep(TTL + 40), {error, not_found} = AuthCacheModule:get(Key), Pid ! {ok, self(), Ref}