Skip to content

Commit 033d39b

Browse files
Michael Feromikefero
authored andcommitted
CPP-722/CPP-723 - Inightful Monitoring (Insights) integration
* Build/Configuration changes * windows: Adding 'version' to the linker for DSE builds * Added `name()` for auth provider identification * Added getters for missing configuration options * Added getters for DCAware options (used in config anti patterns) * Added DSE version to mockssandra * Required for enabling Insights * Added DSE server version to host and control connector * Moved `Disable` integration test into unit test * test: Fix CentOS 6 build issues This also fixes an issue with mockssandra requests that contain wait actions. The request was being deleted before the wait could finish and now the request instance is a SharedRefPtr to ensure the entire lifetime of the object.
1 parent a4b493f commit 033d39b

41 files changed

Lines changed: 2564 additions & 83 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ set(DSE_INCLUDES ${DSE_INCLUDES} ${CASS_INCLUDES})
131131

132132
# Build up libraries
133133
set(DSE_LIBS ${CASS_LIBS})
134+
if(WIN32)
135+
set(DSE_LIBS ${DSE_LIBS} version) # Required for GetFileVersionInfo/GetFileVersionSize usage
136+
endif()
134137

135138
# Kerberos
136139
find_package(Kerberos REQUIRED)
@@ -168,6 +171,7 @@ set(DSE_ALL_SOURCE_FILES
168171
# tests.
169172
list(REMOVE_ITEM DSE_ALL_SOURCE_FILES
170173
"${PROJECT_SOURCE_DIR}/cpp-driver/src/driver_info.cpp"
174+
"${PROJECT_SOURCE_DIR}/cpp-driver/src/monitor_reporting.cpp"
171175
"${PROJECT_SOURCE_DIR}/cpp-driver/src/protocol.cpp")
172176
set(CASS_EXCLUDED_UNIT_TEST_FILES "test_protocol_version.cpp")
173177

cpp-driver/gtests/src/integration/objects/user_type.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ class UserType : public Object<CassUserType, cass_user_type_free> {
198198
}
199199

200200
// Create the user type from the data type
201-
Object::set(cass_user_type_new_from_data_type(data_type));
201+
Object<CassUserType, cass_user_type_free>::set(
202+
cass_user_type_new_from_data_type(data_type));
202203
}
203204
};
204205

cpp-driver/gtests/src/unit/main.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,7 @@ int main(int argc, char* argv[]) {
156156
// Initialize the Google testing framework
157157
testing::InitGoogleTest(&argc, argv);
158158

159-
160-
// Add a bootstrap mechanism for program start and finish
159+
// Add listeners for program start and finish events
161160
testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners();
162161

163162
#if defined(_WIN32) && defined(_DEBUG)

cpp-driver/gtests/src/unit/mockssandra.cpp

Lines changed: 142 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ using cass::ScopedMutex;
3434
using cass::OStringStream;
3535

3636
#define SSL_BUF_SIZE 8192
37-
#define SERVER_VERSION "3.11.2"
37+
#define CASSANDRA_VERSION "3.11.4"
38+
#define DSE_VERSION "6.7.1"
39+
#define DSE_CASSANDRA_VERSION "4.0.0.671"
3840

3941
namespace mockssandra {
4042

@@ -1265,10 +1267,18 @@ Action::Builder& Action::Builder::system_local() {
12651267
return execute(new SystemLocal());
12661268
}
12671269

1270+
Action::Builder& Action::Builder::system_local_dse() {
1271+
return execute(new SystemLocalDse());
1272+
}
1273+
12681274
Action::Builder& Action::Builder::system_peers() {
12691275
return execute(new SystemPeers());
12701276
}
12711277

1278+
Action::Builder& Action::Builder::system_peers_dse() {
1279+
return execute(new SystemPeersDse());
1280+
}
1281+
12721282
Action::Builder& Action::Builder::system_traces() {
12731283
return execute(new SystemTraces());
12741284
}
@@ -1345,14 +1355,9 @@ Request::Request(int8_t version, int8_t flags, int16_t stream, int8_t opcode,
13451355
, body_(body)
13461356
, client_(client)
13471357
, timer_action_(NULL) {
1348-
client->add(this);
13491358
(void)flags_; // TODO: Implement custom payload etc.
13501359
}
13511360

1352-
Request::~Request() {
1353-
client_->remove(this);
1354-
}
1355-
13561361
void Request::write(int8_t opcode, const String& body) {
13571362
write(stream_, opcode, body);
13581363
}
@@ -1369,6 +1374,7 @@ void Request::error(int32_t code, const String& message) {
13691374
}
13701375

13711376
void Request::wait(uint64_t timeout, const Action* action) {
1377+
inc_ref();
13721378
timer_action_ = action;
13731379
timer_.start(client_->server()->loop(), timeout,
13741380
cass::bind_callback(&Request::on_timeout, this));
@@ -1420,6 +1426,7 @@ Hosts Request::hosts() const {
14201426

14211427
void Request::on_timeout(Timer* timer) {
14221428
timer_action_->run_next(this);
1429+
dec_ref();
14231430
}
14241431

14251432
void SendError::on_run(Request* request) const {
@@ -1505,21 +1512,20 @@ void ClientOptions::on_run(Request* request) const {
15051512
QueryParameters params;
15061513
if (!request->decode_query(&query, &params)) {
15071514
request->error(ERROR_PROTOCOL_ERROR, "Invalid query message");
1508-
} else {
1509-
if (query == CLIENT_OPTIONS_QUERY) {
1510-
ResultSet::Builder builder("client", "options");
1511-
Row::Builder row_builder;
1512-
for (Options::const_iterator it = request->client()->options().begin(),
1513-
end = request->client()->options().end(); it != end; ++it) {
1514-
builder.column((*it).first, Type::text());
1515-
row_builder.text((*it).second);
1516-
}
1517-
ResultSet client_options = builder.row(row_builder.build()).build();
1518-
1519-
request->write(OPCODE_RESULT, client_options.encode(request->version()));
1515+
} else if (query == CLIENT_OPTIONS_QUERY) {
1516+
ResultSet::Builder builder("client", "options");
1517+
Row::Builder row_builder;
1518+
for (Options::const_iterator it = request->client()->options().begin(),
1519+
end = request->client()->options().end(); it != end; ++it) {
1520+
builder.column((*it).first, Type::text());
1521+
row_builder.text((*it).second);
15201522
}
1523+
ResultSet client_options = builder.row(row_builder.build()).build();
1524+
1525+
request->write(OPCODE_RESULT, client_options.encode(request->version()));
1526+
} else {
1527+
run_next(request);
15211528
}
1522-
run_next(request);
15231529
}
15241530

15251531
void SystemLocal::on_run(Request* request) const {
@@ -1543,7 +1549,43 @@ void SystemLocal::on_run(Request* request) const {
15431549
.text(request->client()->server()->address().to_string())
15441550
.text(host.dc)
15451551
.text(host.rack)
1546-
.text(SERVER_VERSION)
1552+
.text(CASSANDRA_VERSION)
1553+
.inet(request->client()->server()->address())
1554+
.text(host.partitioner)
1555+
.collection(Collection::text(host.tokens))
1556+
.build())
1557+
.build();
1558+
1559+
request->write(OPCODE_RESULT, local_rs.encode(request->version()));
1560+
} else {
1561+
run_next(request);
1562+
}
1563+
}
1564+
1565+
void SystemLocalDse::on_run(Request* request) const {
1566+
String query;
1567+
QueryParameters params;
1568+
if (!request->decode_query(&query, &params)) {
1569+
request->error(ERROR_PROTOCOL_ERROR, "Invalid query message");
1570+
} else if (query.find(SELECT_LOCAL) != String::npos) {
1571+
const Host& host(request->host(request->address()));
1572+
1573+
ResultSet local_rs
1574+
= ResultSet::Builder("system", "local")
1575+
.column("key", Type::text())
1576+
.column("data_center", Type::text())
1577+
.column("rack", Type::text())
1578+
.column("dse_version", Type::text())
1579+
.column("release_version", Type::text())
1580+
.column("rpc_address", Type::inet())
1581+
.column("partitioner", Type::text())
1582+
.column("tokens", Type::list(Type::text()))
1583+
.row(Row::Builder()
1584+
.text(request->client()->server()->address().to_string())
1585+
.text(host.dc)
1586+
.text(host.rack)
1587+
.text(DSE_VERSION)
1588+
.text(DSE_CASSANDRA_VERSION)
15471589
.inet(request->client()->server()->address())
15481590
.text(host.partitioner)
15491591
.collection(Collection::text(host.tokens))
@@ -1586,7 +1628,80 @@ void SystemPeers::on_run(Request* request) const {
15861628
.inet(host.address)
15871629
.text(host.dc)
15881630
.text(host.rack)
1589-
.text(SERVER_VERSION)
1631+
.text(CASSANDRA_VERSION)
1632+
.inet(host.address)
1633+
.collection(Collection::text(host.tokens))
1634+
.build());
1635+
}
1636+
ResultSet peers_rs = peers_builder.build();
1637+
request->write(OPCODE_RESULT, peers_rs.encode(request->version()));
1638+
} else {
1639+
pos += where_clause.size();
1640+
size_t end_pos = query.find("'", pos);
1641+
if (end_pos == String::npos) {
1642+
request->error(ERROR_INVALID_QUERY, "Invalid WHERE clause");
1643+
return;
1644+
}
1645+
1646+
String ip = query.substr(pos, end_pos - pos);
1647+
Address address;
1648+
if (!Address::from_string(ip, request->address().port(), &address)) {
1649+
request->error(ERROR_INVALID_QUERY, "Invalid inet address in WHERE clause");
1650+
return;
1651+
}
1652+
1653+
const Host& host(request->host(address));
1654+
ResultSet peers_rs
1655+
= peers_builder
1656+
.row(Row::Builder()
1657+
.inet(host.address)
1658+
.text(host.dc)
1659+
.text(host.rack)
1660+
.text(CASSANDRA_VERSION)
1661+
.inet(host.address)
1662+
.collection(Collection::text(host.tokens))
1663+
.build())
1664+
.build();
1665+
request->write(OPCODE_RESULT, peers_rs.encode(request->version()));
1666+
}
1667+
} else {
1668+
run_next(request);
1669+
}
1670+
}
1671+
1672+
void SystemPeersDse::on_run(Request* request) const {
1673+
String query;
1674+
QueryParameters params;
1675+
if (!request->decode_query(&query, &params)) {
1676+
request->error(ERROR_PROTOCOL_ERROR, "Invalid query message");
1677+
} else if (query.find(SELECT_PEERS) != String::npos) {
1678+
const String where_clause(" WHERE peer = '");
1679+
ResultSet::Builder peers_builder
1680+
= ResultSet::Builder("system", "peers")
1681+
.column("peer", Type::inet())
1682+
.column("data_center", Type::text())
1683+
.column("rack", Type::text())
1684+
.column("dse_version", Type::text())
1685+
.column("release_version", Type::text())
1686+
.column("rpc_address", Type::inet())
1687+
.column("tokens", Type::list(Type::text()));
1688+
1689+
size_t pos = query.find(where_clause);
1690+
if (pos == String::npos) {
1691+
Hosts hosts(request->hosts());
1692+
for (Hosts::const_iterator it = hosts.begin(),
1693+
end = hosts.end(); it != end; ++it) {
1694+
const Host& host(*it);
1695+
if (host.address == request->address()) {
1696+
continue;
1697+
}
1698+
peers_builder
1699+
.row(Row::Builder()
1700+
.inet(host.address)
1701+
.text(host.dc)
1702+
.text(host.rack)
1703+
.text(DSE_VERSION)
1704+
.text(DSE_CASSANDRA_VERSION)
15901705
.inet(host.address)
15911706
.collection(Collection::text(host.tokens))
15921707
.build());
@@ -1615,7 +1730,7 @@ void SystemPeers::on_run(Request* request) const {
16151730
.inet(host.address)
16161731
.text(host.dc)
16171732
.text(host.rack)
1618-
.text(SERVER_VERSION)
1733+
.text(CASSANDRA_VERSION)
16191734
.inet(host.address)
16201735
.collection(Collection::text(host.tokens))
16211736
.build())
@@ -1830,8 +1945,9 @@ int32_t ProtocolHandler::decode_frame(ClientConnection* client, const char* fram
18301945
version_ > request_handler_->highest_supported_protocol_version()) {
18311946
// Respond using the highest supported protocol that the server
18321947
// supports (don't use the request's version because it's not supported)
1833-
request_handler_->invalid_protocol(new Request(request_handler_->highest_supported_protocol_version(),
1834-
flags_, stream_, opcode_, String(), client));
1948+
Request::Ptr request(new Request(request_handler_->highest_supported_protocol_version(),
1949+
flags_, stream_, opcode_, String(), client));
1950+
request_handler_->invalid_protocol(request.get());
18351951
return len - remaining;
18361952
}
18371953
state_ = HEADER;
@@ -1875,13 +1991,8 @@ int32_t ProtocolHandler::decode_frame(ClientConnection* client, const char* fram
18751991
}
18761992

18771993
void ProtocolHandler::decode_body(ClientConnection* client, const char* body, int32_t len) {
1878-
request_handler_->run(new Request(version_, flags_, stream_, opcode_, String(body, len), client));
1879-
}
1880-
1881-
ClientConnection::~ClientConnection() {
1882-
while(!requests_.is_empty()) {
1883-
delete requests_.front(); // Removes itself from the list
1884-
}
1994+
Request::Ptr request(new Request(version_, flags_, stream_, opcode_, String(body, len), client));
1995+
request_handler_->run(request.get());
18851996
}
18861997

18871998
void ClientConnection::on_read(const char* data, size_t len) {

cpp-driver/gtests/src/unit/mockssandra.hpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,9 @@ struct Action {
618618
Builder& client_options();
619619

620620
Builder& system_local();
621+
Builder& system_local_dse();
621622
Builder& system_peers();
623+
Builder& system_peers_dse();
622624
Builder& system_traces();
623625

624626
Builder& use_keyspace(const String& keyspace);
@@ -696,11 +698,13 @@ struct Predicate : public Action {
696698
};
697699

698700

699-
class Request : public List<Request>::Node {
701+
class Request : public List<Request>::Node
702+
, public RefCounted<Request> {
700703
public:
704+
typedef SharedRefPtr<Request> Ptr;
705+
701706
Request(int8_t version, int8_t flags, int16_t stream, int8_t opcode,
702707
const String& body, ClientConnection* client);
703-
~Request();
704708

705709
int8_t version() const { return version_; }
706710
int16_t stream() const { return stream_; }
@@ -841,10 +845,18 @@ struct SystemLocal : public Action {
841845
virtual void on_run(Request* request) const;
842846
};
843847

848+
struct SystemLocalDse : public Action {
849+
virtual void on_run(Request* request) const;
850+
};
851+
844852
struct SystemPeers : public Action {
845853
virtual void on_run(Request* request) const;
846854
};
847855

856+
struct SystemPeersDse : public Action {
857+
virtual void on_run(Request* request) const;
858+
};
859+
848860
struct SystemTraces : public Action {
849861
virtual void on_run(Request* request) const;
850862
};
@@ -969,7 +981,6 @@ class RequestHandler {
969981
} else {
970982
invalid_opcode_->run(request);
971983
}
972-
delete request;
973984
}
974985

975986
private:
@@ -1024,13 +1035,8 @@ class ClientConnection : public internal::ClientConnection {
10241035
, protocol_version_(-1)
10251036
, is_registered_for_events_(false) { }
10261037

1027-
~ClientConnection();
1028-
10291038
virtual void on_read(const char* data, size_t len);
10301039

1031-
void add(Request* request) { requests_.add_to_back(request); }
1032-
void remove(Request* request) { requests_.remove(request); }
1033-
10341040
const Cluster* cluster() const { return cluster_; }
10351041

10361042
int protocol_version() const { return protocol_version_; }
@@ -1044,7 +1050,6 @@ class ClientConnection : public internal::ClientConnection {
10441050
private:
10451051
ProtocolHandler handler_;
10461052
const Cluster* cluster_;
1047-
List<Request> requests_;
10481053
int protocol_version_;
10491054
bool is_registered_for_events_;
10501055
Options options_;

0 commit comments

Comments
 (0)