blob: f02b4a2d452e83588ee34260fbe7469f6d00f799 [file] [log] [blame]
%% -------------------------------------------------------------------
%%
%% Copyright (c) 2011 Basho Technologies, Inc.
%%
%% This file is provided to you under the Apache License,
%% Version 2.0 (the "License"); you may not use this file
%% except in compliance with the License. You may obtain
%% a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing,
%% software distributed under the License is distributed on an
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
%% KIND, either express or implied. See the License for the
%% specific language governing permissions and limitations
%% under the License.
%%
%% -------------------------------------------------------------------
%%%-------------------------------------------------------------------
%%% File: folsom_sample_slide_server.erl
%%% @author Russell Brown <russelldb@basho.com>
%%% @doc
%%% Serialization point for folsom_sample_slide. Handles
%%% pruning of older smaples. One started per histogram.
%%% See folsom.hrl, folsom_sample_slide, folsom_sample_slide_sup
%%% @end
%%%-----------------------------------------------------------------
-module(folsom_sample_slide_server).
-behaviour(gen_server).
%% API
-export([start_link/3, stop/1, resize/2]).
-record(state, {sample_mod, reservoir, window}).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start_link(SampleMod, Reservoir, Window) ->
gen_server:start_link(?MODULE, [SampleMod, Reservoir, Window], []).
stop(Pid) ->
gen_server:cast(Pid, stop).
init([SampleMod, Reservoir, Window]) ->
{ok, #state{sample_mod = SampleMod, reservoir = Reservoir, window = Window}, timeout(Window)}.
resize(Pid, NewWindow) ->
gen_server:call(Pid, {resize, NewWindow}).
handle_call({resize, NewWindow}, _From, State) ->
NewState = State#state{window=NewWindow},
Reply = ok,
{reply, Reply, NewState, timeout(NewWindow)};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(stop, State) ->
{stop, normal, State};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(timeout, State=#state{sample_mod = SampleMod, reservoir = Reservoir, window = Window}) ->
SampleMod:trim(Reservoir, Window),
{noreply, State, timeout(Window)};
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
timeout(Window) ->
timer:seconds(Window) div 2.