summaryrefslogtreecommitdiff
path: root/src/couch/test/eunit/couch_bt_engine_compactor_ev.erl
blob: 72b780a7fb16d68dc6a7c6aeb52d890e5c43718f (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
% 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_bt_engine_compactor_ev).

-export([
    init/0,
    terminate/0,
    clear/0,

    set_wait/1,
    set_crash/1,

    event/1
]).

-define(TAB, couch_db_updater_ev_tab).

init() ->
    ets:new(?TAB, [set, public, named_table]).

terminate() ->
    ets:delete(?TAB).

clear() ->
    ets:delete_all_objects(?TAB).

set_wait(Event) ->
    Self = self(),
    WaitFun = fun(_) ->
        receive
            {Self, go} ->
                Self ! {self(), ok}
        end,
        ets:delete(?TAB, Event)
    end,
    ContinueFun = fun(Pid) ->
        Pid ! {Self, go},
        receive
            {Pid, ok} -> ok
        end
    end,
    ets:insert(?TAB, {Event, WaitFun}),
    {ok, ContinueFun}.

set_crash(Event) ->
    Reason = {couch_db_updater_ev_crash, Event},
    CrashFun = fun(_) -> exit(Reason) end,
    ets:insert(?TAB, {Event, CrashFun}),
    {ok, Reason}.

event(Event) ->
    NewEvent =
        case Event of
            seq_init ->
                put(?MODULE, 0),
                Event;
            seq_copy ->
                Count = get(?MODULE),
                put(?MODULE, Count + 1),
                {seq_copy, Count};
            id_init ->
                put(?MODULE, 0),
                Event;
            id_copy ->
                Count = get(?MODULE),
                put(?MODULE, Count + 1),
                {id_copy, Count};
            md_copy_init ->
                put(?MODULE, 0),
                Event;
            md_copy_row ->
                Count = get(?MODULE),
                put(?MODULE, Count + 1),
                {md_copy_row, Count};
            _ ->
                Event
        end,
    handle_event(NewEvent).

handle_event(Event) ->
    try
        case ets:lookup(?TAB, Event) of
            [{Event, ActionFun}] ->
                ActionFun(Event);
            [] ->
                ok
        end
    catch
        error:badarg ->
            ok
    end.