blob: 3fea9a03c73c56b5e9b0dab6e8feb775d23ade02 (
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
102
103
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2016 Red Hat Inc
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/
#ifndef COMMAND_TABLE_H_
#define COMMAND_TABLE_H_
#include "messages/MCommand.h"
class CommandOp
{
public:
ConnectionRef con;
ceph_tid_t tid;
std::vector<std::string> cmd;
bufferlist inbl;
Context *on_finish;
bufferlist *outbl;
std::string *outs;
MCommand::ref get_message(const uuid_d &fsid) const
{
auto m = MCommand::create(fsid);
m->cmd = cmd;
m->set_data(inbl);
m->set_tid(tid);
return m;
}
CommandOp(const ceph_tid_t t) : tid(t), on_finish(nullptr),
outbl(nullptr), outs(nullptr) {}
CommandOp() : tid(0), on_finish(nullptr), outbl(nullptr), outs(nullptr) {}
};
/**
* Hold client-side state for a collection of in-flight commands
* to a remote service.
*/
template<typename T>
class CommandTable
{
protected:
ceph_tid_t last_tid;
std::map<ceph_tid_t, T> commands;
public:
CommandTable()
: last_tid(0)
{}
~CommandTable()
{
ceph_assert(commands.empty());
}
T& start_command()
{
ceph_tid_t tid = last_tid++;
commands.insert(std::make_pair(tid, T(tid)) );
return commands.at(tid);
}
const std::map<ceph_tid_t, T> &get_commands() const
{
return commands;
}
bool exists(ceph_tid_t tid) const
{
return commands.count(tid) > 0;
}
T& get_command(ceph_tid_t tid)
{
return commands.at(tid);
}
void erase(ceph_tid_t tid)
{
commands.erase(tid);
}
void clear() {
commands.clear();
}
};
#endif
|