2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
19 * Copyright 2017 ScyllaDB
22 #include <seastar/util/alloc_failure_injector.hh>
23 #include <seastar/util/backtrace.hh>
24 #include <seastar/util/log.hh>
25 #include <seastar/util/defer.hh>
30 static logger
log("failure_injector");
32 thread_local alloc_failure_injector the_alloc_failure_injector
;
34 void alloc_failure_injector::fail() {
37 if (log
.is_enabled(log_level::trace
)) {
38 log
.trace("Failing at {}", current_backtrace());
43 void alloc_failure_injector::run_with_callback(noncopyable_function
<void()> callback
, noncopyable_function
<void()> to_run
) {
44 auto restore
= defer([this, prev
= std::exchange(_on_alloc_failure
, std::move(callback
))] () mutable {
45 _on_alloc_failure
= std::move(prev
);
50 void with_allocation_failures(noncopyable_function
<void()> func
) {
51 auto& injector
= memory::local_failure_injector();
55 injector
.fail_after(i
++);
58 } catch (const std::bad_alloc
&) {
61 } while (injector
.failed());