summaryrefslogtreecommitdiff
path: root/src/couch_replicator/src/couch_replicator_stats.erl
blob: cd62949e9e339663c4fc35ec93c9ca8cfa1030bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
% Licensed 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.

-module(couch_replicator_stats).

-export([
    new/0,
    new/1,
    get/2,
    increment/2,
    sum_stats/2
]).

-export([
    missing_checked/1,
    missing_found/1,
    docs_read/1,
    docs_written/1,
    doc_write_failures/1
]).

new() ->
    orddict:new().

new(Initializers0) when is_list(Initializers0) ->
    Initializers1 = lists:filtermap(fun fmap/1, Initializers0),
    orddict:from_list(Initializers1).

missing_checked(Stats) ->
    get(missing_checked, Stats).

missing_found(Stats) ->
    get(missing_found, Stats).

docs_read(Stats) ->
    get(docs_read, Stats).

docs_written(Stats) ->
    get(docs_written, Stats).

doc_write_failures(Stats) ->
    get(doc_write_failures, Stats).

get(Field, Stats) ->
    case orddict:find(Field, Stats) of
        {ok, Value} ->
            Value;
        error ->
            0
    end.

increment(Field, Stats) ->
    orddict:update_counter(Field, 1, Stats).

sum_stats(S1, S2) ->
    orddict:merge(fun(_, V1, V2) -> V1+V2 end, S1, S2).


% Handle initializing from a status object which uses same values but different
% field names.
fmap({revisions_checked, V})       -> {true, {missing_checked, V}};
fmap({missing_revisions_found, V}) -> {true, {missing_found, V}};
fmap({missing_checked, _})         -> true;
fmap({missing_found, _})           -> true;
fmap({docs_read, _})               -> true;
fmap({docs_written, _})            -> true;
fmap({doc_write_failures, _})      -> true;
fmap({_, _})                       -> false.