1 /**
2  *    Copyright (C) 2020-present MongoDB, Inc.
3  *
4  *    This program is free software: you can redistribute it and/or modify
5  *    it under the terms of the Server Side Public License, version 1,
6  *    as published by MongoDB, Inc.
7  *
8  *    This program is distributed in the hope that it will be useful,
9  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
10  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  *    Server Side Public License for more details.
12  *
13  *    You should have received a copy of the Server Side Public License
14  *    along with this program. If not, see
15  *    <http://www.mongodb.com/licensing/server-side-public-license>.
16  *
17  *    As a special exception, the copyright holders give permission to link the
18  *    code of portions of this program with the OpenSSL library under certain
19  *    conditions as described in each individual source file and distribute
20  *    linked combinations including the program with the OpenSSL library. You
21  *    must comply with the Server Side Public License in all respects for
22  *    all of the code used other than as permitted herein. If you modify file(s)
23  *    with this exception, you may extend this exception to your version of the
24  *    file(s), but you are not obligated to do so. If you do not wish to do so,
25  *    delete this exception statement from your version. If you delete this
26  *    exception statement from all source files in the program, then also delete
27  *    it in the license file.
28  */
29 
30 #pragma once
31 
32 #include "mongo/db/operation_context.h"
33 
34 namespace mongo {
35 namespace repl {
36 
37 /**
38  * Allows non-local writes despite _canAcceptNonLocalWrites being false on a single OperationContext
39  * while in scope.
40  *
41  * Resets to original value when leaving scope so it is safe to nest.
42  */
43 class AllowNonLocalWritesBlock {
44     AllowNonLocalWritesBlock(const AllowNonLocalWritesBlock&) = delete;
45     AllowNonLocalWritesBlock& operator=(const AllowNonLocalWritesBlock&) = delete;
46 
47 public:
48     AllowNonLocalWritesBlock(OperationContext* opCtx);
49     ~AllowNonLocalWritesBlock();
50 
51 private:
52     OperationContext* const _opCtx;
53     const bool _initialState;
54 };
55 
56 bool alwaysAllowNonLocalWrites(const OperationContext* opCtx);
57 
58 }  // namespace repl
59 }  // namespace mongo
60