You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/07/31 23:25:31 UTC

[43/50] folsom commit: updated refs/heads/import-master to 4824aec

Added ability to resize sliding window


Project: http://git-wip-us.apache.org/repos/asf/couchdb-folsom/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-folsom/commit/5694f42d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-folsom/tree/5694f42d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-folsom/diff/5694f42d

Branch: refs/heads/import-master
Commit: 5694f42dff1f0b732a081cca3a29a96a7064d08e
Parents: 66071d9
Author: Vasco <va...@vas.io>
Authored: Sat Jan 4 18:45:35 2014 +0000
Committer: Vasco <va...@vas.io>
Committed: Sat Jan 4 18:45:35 2014 +0000

----------------------------------------------------------------------
 rebar                               | Bin 101515 -> 135173 bytes
 src/folsom_sample_slide.erl         |   7 +++-
 src/folsom_sample_slide_server.erl  |   9 +++++-
 src/folsom_sample_slide_uniform.erl |   7 +++-
 test/folsom_sample_slide_test.erl   |  53 ++++++++++++++++++++++++++++++-
 5 files changed, 72 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-folsom/blob/5694f42d/rebar
----------------------------------------------------------------------
diff --git a/rebar b/rebar
index 77abae6..860c19e 100755
Binary files a/rebar and b/rebar differ

http://git-wip-us.apache.org/repos/asf/couchdb-folsom/blob/5694f42d/src/folsom_sample_slide.erl
----------------------------------------------------------------------
diff --git a/src/folsom_sample_slide.erl b/src/folsom_sample_slide.erl
index 631d821..b82acf9 100644
--- a/src/folsom_sample_slide.erl
+++ b/src/folsom_sample_slide.erl
@@ -28,7 +28,8 @@
          update/2,
          get_values/1,
          moment/0,
-         trim/2
+         trim/2,
+	 resize/2
         ]).
 
 -include("folsom.hrl").
@@ -47,6 +48,10 @@ update(#slide{reservoir = Reservoir} = Sample, Value) ->
     ets:insert(Reservoir, {{Moment, Rnd}, Value}),
     Sample.
 
+resize(Sample, NewSize) ->
+    folsom_sample_slide_server:resize(Sample#slide.server, NewSize),
+    Sample#slide{window = NewSize}.
+
 get_values(#slide{window = Window, reservoir = Reservoir}) ->
     Oldest = moment() - Window,
     ets:select(Reservoir, [{{{'$1','_'},'$2'},[{'>=', '$1', Oldest}],['$2']}]).

http://git-wip-us.apache.org/repos/asf/couchdb-folsom/blob/5694f42d/src/folsom_sample_slide_server.erl
----------------------------------------------------------------------
diff --git a/src/folsom_sample_slide_server.erl b/src/folsom_sample_slide_server.erl
index 5986918..f02b4a2 100644
--- a/src/folsom_sample_slide_server.erl
+++ b/src/folsom_sample_slide_server.erl
@@ -31,7 +31,7 @@
 -behaviour(gen_server).
 
 %% API
--export([start_link/3, stop/1]).
+-export([start_link/3, stop/1, resize/2]).
 
 -record(state, {sample_mod,  reservoir, window}).
 
@@ -48,6 +48,13 @@ stop(Pid) ->
 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}.

http://git-wip-us.apache.org/repos/asf/couchdb-folsom/blob/5694f42d/src/folsom_sample_slide_uniform.erl
----------------------------------------------------------------------
diff --git a/src/folsom_sample_slide_uniform.erl b/src/folsom_sample_slide_uniform.erl
index 1d0204c..d99373f 100644
--- a/src/folsom_sample_slide_uniform.erl
+++ b/src/folsom_sample_slide_uniform.erl
@@ -28,7 +28,8 @@
          update/2,
          get_values/1,
          moment/0,
-         trim/2
+         trim/2,
+	 resize/2
         ]).
 
 -include("folsom.hrl").
@@ -53,6 +54,10 @@ update(#slide_uniform{reservoir = Reservoir, size = Size} = Sample0, Value) ->
     end,
     Sample.
 
+resize(Sample, NewSize) ->
+    folsom_sample_slide_server:resize(Sample#slide.server, NewSize),
+    Sample#slide{window = NewSize}.
+
 maybe_update(Reservoir, {{_Moment, Rnd}, _Value}=Obj, Size) when Rnd =< Size ->
     ets:insert(Reservoir, Obj);
 maybe_update(_Reservoir, _Obj, _Size) ->

http://git-wip-us.apache.org/repos/asf/couchdb-folsom/blob/5694f42d/test/folsom_sample_slide_test.erl
----------------------------------------------------------------------
diff --git a/test/folsom_sample_slide_test.erl b/test/folsom_sample_slide_test.erl
index fa31a0e..dc08d95 100644
--- a/test/folsom_sample_slide_test.erl
+++ b/test/folsom_sample_slide_test.erl
@@ -27,7 +27,9 @@
 -include("folsom.hrl").
 
 -define(HISTO, test_slide).
+-define(HISTO2, test_slide2).
 -define(WINDOW, 30).
+-define(DOUBLE_WINDOW, 60).
 -define(RUNTIME, 90).
 -define(READINGS, 10).
 
@@ -41,7 +43,9 @@ slide_test_() ->
      [{"Create sliding window",
        fun create/0},
       {"test sliding window",
-       {timeout, 30, fun exercise/0}}
+       {timeout, 30, fun exercise/0}},
+      {"resize sliding window",
+       {timeout, 30, fun resize_window/0}}
      ]}.
 
 create() ->
@@ -87,6 +91,53 @@ exercise() ->
     check_table(Slide, []),
     ok.
 
+resize_window() ->
+    %% create a new histogram
+    %% will leave the trim server running, as resize() needs it
+    ok = folsom_metrics:new_histogram(?HISTO2, slide, ?WINDOW),
+    #histogram{sample=Slide} = folsom_metrics_histogram:get_value(?HISTO2),
+    Moments = lists:seq(1, ?RUNTIME ),
+    %% pump in 90 seconds worth of readings
+    Moment = lists:foldl(fun(_X, Tick) ->
+                                 Tock = tick(Tick),
+                                 [folsom_sample_slide:update(Slide, N) ||
+                                     N <- lists:duplicate(?READINGS, Tock)],
+                                 Tock end,
+                         0,
+                         Moments),
+    %% are all readings in the table?
+    check_table(Slide, Moments),
+    
+    %% get values only returns last ?WINDOW seconds
+    ExpectedValues = lists:sort(lists:flatten([lists:duplicate(?READINGS, N) ||
+                                                  N <- lists:seq(?RUNTIME - ?WINDOW, ?RUNTIME)])),
+    Values = lists:sort(folsom_sample_slide:get_values(Slide)),
+    ?assertEqual(ExpectedValues, Values),
+
+    %%resize the sliding window
+    NewSlide = folsom_sample_slide:resize(Slide, ?DOUBLE_WINDOW),
+
+    %% get values only returns last ?WINDOW*2 seconds
+    NewExpectedValues = lists:sort(lists:flatten([lists:duplicate(?READINGS, N) ||
+                                                  N <- lists:seq(?RUNTIME - ?DOUBLE_WINDOW, ?RUNTIME)])),
+    NewValues = lists:sort(folsom_sample_slide:get_values(NewSlide)),
+    ?assertEqual(NewExpectedValues, NewValues),
+    
+    
+    %% trim the table
+    Trimmed = folsom_sample_slide:trim(NewSlide#slide.reservoir, ?DOUBLE_WINDOW),
+    ?assertEqual((?RUNTIME - ?DOUBLE_WINDOW - 1) * ?READINGS, Trimmed),
+    check_table(NewSlide, lists:seq(?RUNTIME - ?DOUBLE_WINDOW, ?RUNTIME)),
+    %% increment the clock past the window
+    tick(Moment, ?DOUBLE_WINDOW*2),
+    %% get values should be empty
+    ?assertEqual([], folsom_sample_slide:get_values(NewSlide)),
+    %% trim, and table should be empty
+    Trimmed2 = folsom_sample_slide:trim(NewSlide#slide.reservoir, ?DOUBLE_WINDOW),
+    ?assertEqual((?RUNTIME * ?READINGS) - ((?RUNTIME - ?DOUBLE_WINDOW - 1) * ?READINGS), Trimmed2),
+    check_table(NewSlide, []),
+    ok.
+
 tick(Moment0, IncrBy) ->
     Moment = Moment0 + IncrBy,
     meck:expect(folsom_utils, now_epoch, fun() ->