int mount(const std::string &mount_root, const UserPerm& perms,
bool require_mds=false, const std::string &fs_name="");
void unmount();
+ bool is_unmounting() const {
+ return mount_state.check_current_state(CLIENT_UNMOUNTING);
+ }
+ bool is_mounted() const {
+ return mount_state.check_current_state(CLIENT_MOUNTED);
+ }
+ bool is_mounting() const {
+ return mount_state.check_current_state(CLIENT_MOUNTING);
+ }
+ bool is_initialized() const {
+ return initialize_state.check_current_state(CLIENT_INITIALIZED);
+ }
void abort_conn();
void set_uuid(const std::string& uuid);
struct mount_state_t : public RWRefState<state_t> {
public:
- bool is_valid_state(state_t state) override {
+ bool is_valid_state(state_t state) const override {
switch (state) {
case Client::CLIENT_MOUNTING:
case Client::CLIENT_MOUNTED:
}
}
- int check_reader_state(state_t require) override {
+ int check_reader_state(state_t require) const override {
if (require == Client::CLIENT_MOUNTING &&
(state == Client::CLIENT_MOUNTING || state == Client::CLIENT_MOUNTED))
return true;
}
/* The state migration check */
- int check_writer_state(state_t require) override {
+ int check_writer_state(state_t require) const override {
if (require == Client::CLIENT_MOUNTING &&
state == Client::CLIENT_UNMOUNTED)
return true;
struct initialize_state_t : public RWRefState<state_t> {
public:
- bool is_valid_state(state_t state) override {
+ bool is_valid_state(state_t state) const override {
switch (state) {
case Client::CLIENT_NEW:
case Client::CLIENT_INITIALIZING:
}
}
- int check_reader_state(state_t require) override {
+ int check_reader_state(state_t require) const override {
if (require == Client::CLIENT_INITIALIZED &&
state >= Client::CLIENT_INITIALIZED)
return true;
}
/* The state migration check */
- int check_writer_state(state_t require) override {
+ int check_writer_state(state_t require) const override {
if (require == Client::CLIENT_INITIALIZING &&
(state == Client::CLIENT_NEW))
return true;
};
struct mount_state_t mount_state;
- bool is_unmounting() {
- return mount_state.check_current_state(CLIENT_UNMOUNTING);
- }
- bool is_mounted() {
- return mount_state.check_current_state(CLIENT_MOUNTED);
- }
- bool is_mounting() {
- return mount_state.check_current_state(CLIENT_MOUNTING);
- }
-
struct initialize_state_t initialize_state;
- bool is_initialized() {
- return initialize_state.check_current_state(CLIENT_INITIALIZED);
- }
private:
struct C_Readahead : public Context {
* Then the check_reader_state() should return truth if the
* state is already in mouting or mounted state.
*/
- virtual int check_reader_state(T require) = 0;
+ virtual int check_reader_state(T require) const = 0;
/*
* User defined method to check whether the "require" state
*
* This will usually be the state migration check.
*/
- virtual int check_writer_state(T require) = 0;
+ virtual int check_writer_state(T require) const = 0;
/*
* User defined method to check whether the "require"
* state is valid or not.
*/
- virtual bool is_valid_state(T require) = 0;
+ virtual bool is_valid_state(T require) const = 0;
- int64_t get_state() {
+ int64_t get_state() const {
std::scoped_lock l{lock};
return state;
}
- bool check_current_state(T require) {
+ bool check_current_state(T require) const {
ceph_assert(is_valid_state(require));
std::scoped_lock l{lock};
virtual ~RWRefState() {}
private:
- ceph::mutex lock;
+ mutable ceph::mutex lock;
ceph::condition_variable cond;
uint64_t reader_cnt = 0;
};
* Whether the "require" state is in the proper range of
* the states.
*/
- bool is_state_satisfied() {
+ bool is_state_satisfied() const {
return satisfied;
}
/*
* For current state whether we are the first writer or not
*/
- bool is_first_writer() {
+ bool is_first_writer() const {
return first_writer;
}