@@ -82,7 +82,7 @@ handle_call({defer_delete, Dirname, IterGeneration, Files}, _From, State) ->
82
82
handle_call ({queue_length }, _From , State ) ->
83
83
{reply , queue :len (State # state .q ), State , ? TIMEOUT };
84
84
handle_call ({testonly__delete_trigger }, _From , State ) ->
85
- {reply , ok , check_status (State ), ? TIMEOUT };
85
+ {reply , ok , delete_ready_files (State ), ? TIMEOUT };
86
86
handle_call (_Request , _From , State ) ->
87
87
Reply = unknown_request ,
88
88
{reply , Reply , State , ? TIMEOUT }.
@@ -91,7 +91,7 @@ handle_cast(_Msg, State) ->
91
91
{noreply , State , ? TIMEOUT }.
92
92
93
93
handle_info (timeout , State ) ->
94
- {noreply , check_status (State ), ? TIMEOUT };
94
+ {noreply , delete_ready_files (State ), ? TIMEOUT };
95
95
handle_info (_Info , State ) ->
96
96
{noreply , State , ? TIMEOUT }.
97
97
@@ -105,29 +105,37 @@ code_change(_OldVsn, State, _Extra) ->
105
105
% %% Internal functions
106
106
% %%===================================================================
107
107
108
- check_status (S ) ->
108
+ delete_ready_files (S ) ->
109
+ delete_ready_files (S , queue :new ()).
110
+
111
+ delete_ready_files (S , PendingQ ) ->
109
112
case queue :out (S # state .q ) of
110
113
{empty , _ } ->
111
- S ;
112
- {{value , {Dirname , IterGeneration , Files }}, NewQ } ->
114
+ S # state { q = PendingQ } ;
115
+ {{value , {Dirname , IterGeneration , Files } = Entry }, NewQ } ->
113
116
{_ , KeyDir } = bitcask_nifs :keydir_new (Dirname ),
114
117
try
115
118
116
119
{_ ,_ ,_ ,IterStatus ,_ } = bitcask_nifs :keydir_info (KeyDir ),
117
- CleanAndGo = fun () ->
118
- delete_files (Files ),
119
- bitcask_nifs :keydir_release (KeyDir ),
120
- check_status (S # state {q = NewQ })
121
- end ,
122
- case IterStatus of
123
- {_ , _ , false , _ } ->
124
- CleanAndGo ();
125
- {CurGen , _ , true , _ } when CurGen > IterGeneration ->
126
- CleanAndGo ();
127
- _ ->
128
- % % Do nothing, ignore NewQ
129
- S
120
+ ReadyToDelete =
121
+ case IterStatus of
122
+ {_ , _ , false , _ } ->
123
+ true ;
124
+ {CurGen , _ , true , _ } when CurGen > IterGeneration ->
125
+ true ;
126
+ _ ->
127
+ false
128
+ end ,
129
+ S2 = S # state {q = NewQ },
130
+ case ReadyToDelete of
131
+ true ->
132
+ delete_files (Files ),
133
+ bitcask_nifs :keydir_release (KeyDir ),
134
+ delete_ready_files (S2 , PendingQ );
135
+ false ->
136
+ delete_ready_files (S2 , queue :in (Entry , PendingQ ))
130
137
end
138
+
131
139
catch _X :_Y ->
132
140
% % Not sure what problem was: keydir is no longer
133
141
% % valid, or a problem deleting files, but in any
0 commit comments