From 3568b12529e6da52edffe99a818b6d3940d98e11 Mon Sep 17 00:00:00 2001 From: Megh Bhatt Date: Thu, 17 Sep 2015 10:20:54 -0700 Subject: [PATCH] Remove GetDiffStats() and instead iterate through the current map to send the accumulated counter and then clear it so that only new keys are sent in the statistics. Closes-Bug: #1494473 Change-Id: Ice58e1761a4200f8ad7b82bce81aba929a744950 --- src/analytics/collector.cc | 4 +- src/analytics/db_handler.cc | 2 +- src/analytics/diffstats.h | 38 ---------------- src/analytics/generator.cc | 6 +-- src/analytics/generator.h | 4 +- src/analytics/protobuf_server.cc | 56 +++++++++-------------- src/analytics/test/viz_message_test.cc | 33 ++++++-------- src/analytics/viz_message.cc | 63 +++++++++++--------------- src/analytics/viz_message.h | 11 ++--- src/gendb/cdb_if.cc | 1 - src/gendb/gendb_statistics.cc | 48 ++++++-------------- src/gendb/gendb_statistics.h | 10 +--- src/gendb/test/gendb_if_test.cc | 1 - 13 files changed, 88 insertions(+), 189 deletions(-) delete mode 100644 src/analytics/diffstats.h diff --git a/src/analytics/collector.cc b/src/analytics/collector.cc index deaf754e7d3..d8b94daf6d3 100644 --- a/src/analytics/collector.cc +++ b/src/analytics/collector.cc @@ -394,9 +394,9 @@ void Collector::GetGeneratorUVEInfo(vector &genlist) { const SandeshGenerator * const gen = gm_it->second; vector ssv; - gen->GetStatistics(ssv); + gen->GetStatistics(&ssv); vector lsv; - gen->GetStatistics(lsv); + gen->GetStatistics(&lsv); vector ssiv; SandeshStatsInfo ssi; ssi.set_hostname(Sandesh::source()); diff --git a/src/analytics/db_handler.cc b/src/analytics/db_handler.cc index f5cc90ddf93..36ac21d5a20 100644 --- a/src/analytics/db_handler.cc +++ b/src/analytics/db_handler.cc @@ -307,7 +307,7 @@ void DbHandler::GetSandeshStats(std::string *drop_level, *drop_level = Sandesh::LevelToString(drop_level_); if (vdropmstats) { tbb::mutex::scoped_lock lock(smutex_); - dropped_msg_stats_.Get(*vdropmstats); + dropped_msg_stats_.Get(vdropmstats); } } diff --git a/src/analytics/diffstats.h b/src/analytics/diffstats.h deleted file mode 100644 index aee6c130557..00000000000 --- a/src/analytics/diffstats.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. - */ - -#ifndef ANALYTICS_DIFFSTATS_H__ -#define ANALYTICS_DIFFSTATS_H__ - -#include - -template -void GetDiffStats(PtrMapType &stats_map, PtrMapType &old_stats_map, - std::vector &v_output_stats) { - // Send diffs - for (typename PtrMapType::const_iterator it = stats_map.begin(); - it != stats_map.end(); it++) { - // Get new stats - const ValueStatsType *nstats(it->second); - KeyType key(it->first); - typename PtrMapType::iterator oit = old_stats_map.find(key); - // If entry does not exist in old map, insert it - if (oit == old_stats_map.end()) { - oit = (old_stats_map.insert(key, new ValueStatsType)).first; - } - // Get old stats - ValueStatsType *ostats(oit->second); - // Subtract the old from new - ValueStatsType dstats(*nstats - *ostats); - // Update old - *ostats = *nstats; - // Populate diff stats - OutputStatsType output_stats; - dstats.Get(key, output_stats); - v_output_stats.push_back(output_stats); - } -} - -#endif // ANALYTICS_DIFFSTATS_H__ diff --git a/src/analytics/generator.cc b/src/analytics/generator.cc index be8faa93328..a34c00e510b 100644 --- a/src/analytics/generator.cc +++ b/src/analytics/generator.cc @@ -54,12 +54,12 @@ void Generator::UpdateStatistics(const VizMsg *vmsg) { statistics_.Update(vmsg); } -void Generator::GetStatistics(vector &ssv) const { +void Generator::GetStatistics(vector *ssv) const { tbb::mutex::scoped_lock lock(smutex_); statistics_.Get(ssv); } -void Generator::GetStatistics(vector &lsv) const { +void Generator::GetStatistics(vector *lsv) const { tbb::mutex::scoped_lock lock(smutex_); statistics_.Get(lsv); } @@ -68,7 +68,7 @@ void Generator::SendSandeshMessageStatistics() { vector smv; { tbb::mutex::scoped_lock lock(smutex_); - statistics_.Get(smv); + statistics_.Get(&smv); } SandeshMessageStat sms; sms.set_name(ToString()); diff --git a/src/analytics/generator.h b/src/analytics/generator.h index e06b9c891b5..dffd21bdbfa 100644 --- a/src/analytics/generator.h +++ b/src/analytics/generator.h @@ -33,8 +33,8 @@ class Generator { bool ReceiveSandeshMsg(const VizMsg *vmsg, bool rsc); void SendSandeshMessageStatistics(); - void GetStatistics(std::vector &ssv) const; - void GetStatistics(std::vector &lsv) const; + void GetStatistics(std::vector *ssv) const; + void GetStatistics(std::vector *lsv) const; private: void UpdateStatistics(const VizMsg *vmsg); diff --git a/src/analytics/protobuf_server.cc b/src/analytics/protobuf_server.cc index 3ec18cceada..b6a2d84d148 100644 --- a/src/analytics/protobuf_server.cc +++ b/src/analytics/protobuf_server.cc @@ -20,7 +20,6 @@ #include #include -#include "analytics/diffstats.h" #include "analytics/self_describing_message.pb.h" #include "analytics/protobuf_server.h" #include "analytics/protobuf_server_impl.h" @@ -491,15 +490,18 @@ class ProtobufServer::ProtobufServerImpl { } void GetRxDiff( std::vector *semsv) { - tbb::mutex::scoped_lock lock(mutex_); - // Send diffs - GetDiffStats(rx_stats_map_, o_rx_stats_map_, - *semsv); + GetRxInternal(semsv, true); } void GetRx( std::vector *semsv) { + GetRxInternal(semsv, false); + } + private: + class MessageInfo; + + void GetRxInternal( + std::vector *semsv, + bool clear_stats) { tbb::mutex::scoped_lock lock(mutex_); BOOST_FOREACH( const EndpointStatsMessageMap::value_type &esmm_value, @@ -507,12 +509,13 @@ class ProtobufServer::ProtobufServerImpl { const EndpointMessageKey &key(esmm_value.first); const MessageInfo *msg_info(esmm_value.second); SocketEndpointMessageStats sems; - msg_info->Get(key, sems); + msg_info->Get(key, &sems); semsv->push_back(sems); } + if (clear_stats) { + rx_stats_map_.clear(); + } } - private: - class MessageInfo; void Update(const boost::asio::ip::udp::endpoint &remote_endpoint, const std::string &message_name, uint64_t bytes, @@ -534,7 +537,7 @@ class ProtobufServer::ProtobufServerImpl { std::string> EndpointMessageKey; typedef boost::ptr_map EndpointStatsMessageMap; - EndpointStatsMessageMap rx_stats_map_, o_rx_stats_map_; + EndpointStatsMessageMap rx_stats_map_; tbb::mutex mutex_; // @@ -558,38 +561,21 @@ class ProtobufServer::ProtobufServerImpl { last_timestamp_ = UTCTimestampUsec(); } void Get(const EndpointMessageKey &key, - SocketEndpointMessageStats &sems) const { + SocketEndpointMessageStats *sems) const { const boost::asio::ip::udp::endpoint remote_endpoint( key.first); const std::string &message_name(key.second); std::stringstream ss; ss << remote_endpoint; - sems.set_endpoint_name(ss.str()); - sems.set_message_name(message_name); - sems.set_messages(messages_); - sems.set_bytes(bytes_); - sems.set_errors(errors_); - sems.set_last_timestamp(last_timestamp_); + sems->set_endpoint_name(ss.str()); + sems->set_message_name(message_name); + sems->set_messages(messages_); + sems->set_bytes(bytes_); + sems->set_errors(errors_); + sems->set_last_timestamp(last_timestamp_); } private: - friend MessageInfo operator+(const MessageInfo &a, - const MessageInfo &b) { - MessageInfo sum; - sum.messages_ = a.messages_ + b.messages_; - sum.bytes_ = a.bytes_ + b.bytes_; - sum.errors_ = a.errors_ + b.errors_; - return sum; - } - friend MessageInfo operator-(const MessageInfo &a, - const MessageInfo &b) { - MessageInfo diff; - diff.messages_ = a.messages_ - b.messages_; - diff.bytes_ = a.bytes_ - b.bytes_; - diff.errors_ = a.errors_ - b.errors_; - diff.last_timestamp_ = a.last_timestamp_ - b.last_timestamp_; - return diff; - } uint64_t messages_; uint64_t bytes_; uint64_t errors_; diff --git a/src/analytics/test/viz_message_test.cc b/src/analytics/test/viz_message_test.cc index 7f5f418cf30..1ea917e8f9c 100644 --- a/src/analytics/test/viz_message_test.cc +++ b/src/analytics/test/viz_message_test.cc @@ -132,21 +132,21 @@ TEST_F(VizMessageTest, Stats) { stats_.Update(&vmsgp); // Verify Gets - SandeshStats, SandeshLogLevelStats, SandeshMessageInfo std::vector vsstats; - stats_.Get(vsstats); + stats_.Get(&vsstats); ASSERT_EQ(1, vsstats.size()); EXPECT_STREQ("VNSwitchErrorMsg", vsstats[0].get_message_type().c_str()); EXPECT_EQ(1, vsstats[0].get_messages()); EXPECT_EQ(xmlmessage.size(), vsstats[0].get_bytes()); vsstats.clear(); std::vector vsllstats; - stats_.Get(vsllstats); + stats_.Get(&vsllstats); ASSERT_EQ(1, vsllstats.size()); EXPECT_STREQ("SYS_DEBUG", vsllstats[0].get_level().c_str()); EXPECT_EQ(1, vsllstats[0].get_messages()); EXPECT_EQ(xmlmessage.size(), vsllstats[0].get_bytes()); vsllstats.clear(); std::vector vsmi; - stats_.Get(vsmi); + stats_.Get(&vsmi); ASSERT_EQ(1, vsmi.size()); EXPECT_STREQ("VNSwitchErrorMsg", vsmi[0].get_type().c_str()); EXPECT_STREQ("SYS_DEBUG", vsmi[0].get_level().c_str()); @@ -156,19 +156,19 @@ TEST_F(VizMessageTest, Stats) { // Send same message, update stats stats_.Update(&vmsgp); // Verify updates - stats_.Get(vsstats); + stats_.Get(&vsstats); ASSERT_EQ(1, vsstats.size()); EXPECT_STREQ("VNSwitchErrorMsg", vsstats[0].get_message_type().c_str()); EXPECT_EQ(2, vsstats[0].get_messages()); EXPECT_EQ(xmlmessage.size() * 2, vsstats[0].get_bytes()); vsstats.clear(); - stats_.Get(vsllstats); + stats_.Get(&vsllstats); ASSERT_EQ(1, vsllstats.size()); EXPECT_STREQ("SYS_DEBUG", vsllstats[0].get_level().c_str()); EXPECT_EQ(2, vsllstats[0].get_messages()); EXPECT_EQ(xmlmessage.size() * 2, vsllstats[0].get_bytes()); vsllstats.clear(); - stats_.Get(vsmi); + stats_.Get(&vsmi); ASSERT_EQ(1, vsmi.size()); EXPECT_STREQ("VNSwitchErrorMsg", vsmi[0].get_type().c_str()); EXPECT_STREQ("SYS_DEBUG", vsmi[0].get_level().c_str()); @@ -194,7 +194,7 @@ TEST_F(VizMessageTest, Stats) { // Update stats stats_.Update(&vmsgp_object); // Verify Gets - SandeshStats, SandeshLogLevelStats, SandeshMessageInfo - stats_.Get(vsstats); + stats_.Get(&vsstats); ASSERT_EQ(2, vsstats.size()); EXPECT_STREQ("VNSwitchErrorMsg", vsstats[0].get_message_type().c_str()); EXPECT_STREQ("VNSwitchErrorMsgObject", vsstats[1].get_message_type().c_str()); @@ -204,23 +204,18 @@ TEST_F(VizMessageTest, Stats) { EXPECT_EQ(xmlmessage_object.size(), vsstats[1].get_bytes()); vsstats.clear(); // Only SYSTEM and SYSLOG have level - stats_.Get(vsllstats); + stats_.Get(&vsllstats); ASSERT_EQ(1, vsllstats.size()); EXPECT_STREQ("SYS_DEBUG", vsllstats[0].get_level().c_str()); EXPECT_EQ(2, vsllstats[0].get_messages()); EXPECT_EQ(xmlmessage.size() * 2, vsllstats[0].get_bytes()); vsllstats.clear(); - stats_.Get(vsmi); - ASSERT_EQ(2, vsmi.size()); - EXPECT_STREQ("VNSwitchErrorMsg", vsmi[0].get_type().c_str()); - EXPECT_STREQ("SYS_DEBUG", vsmi[0].get_level().c_str()); - // Diffs - EXPECT_EQ(0, vsmi[0].get_messages()); - EXPECT_EQ(0, vsmi[0].get_bytes()); - EXPECT_STREQ("VNSwitchErrorMsgObject", vsmi[1].get_type().c_str()); - EXPECT_STREQ("INVALID", vsmi[1].get_level().c_str()); - EXPECT_EQ(1, vsmi[1].get_messages()); - EXPECT_EQ(xmlmessage_object.size(), vsmi[1].get_bytes()); + stats_.Get(&vsmi); + ASSERT_EQ(1, vsmi.size()); + EXPECT_STREQ("VNSwitchErrorMsgObject", vsmi[0].get_type().c_str()); + EXPECT_STREQ("INVALID", vsmi[0].get_level().c_str()); + EXPECT_EQ(1, vsmi[0].get_messages()); + EXPECT_EQ(xmlmessage_object.size(), vsmi[0].get_bytes()); vsmi.clear(); // Delete message vmsgp_object.msg = NULL; diff --git a/src/analytics/viz_message.cc b/src/analytics/viz_message.cc index fa2e67fe58c..6673f831fdd 100644 --- a/src/analytics/viz_message.cc +++ b/src/analytics/viz_message.cc @@ -8,7 +8,6 @@ #include #include #include "collector_uve_types.h" -#include "analytics/diffstats.h" RuleMsg::RuleMsg(const VizMsg* vmsgp) : hdr(vmsgp->msg->GetHeader()), @@ -56,21 +55,6 @@ int RuleMsg::field_value(const std::string& field_id, std::string& type, std::st return field_value_recur(field_id, type, value, message_node_); } -// VizMsgStatistics -VizMsgStats operator+(const VizMsgStats &a, const VizMsgStats &b) { - VizMsgStats sum; - sum.messages = a.messages + b.messages; - sum.bytes = a.bytes + b.bytes; - return sum; -} - -VizMsgStats operator-(const VizMsgStats &a, const VizMsgStats &b) { - VizMsgStats diff; - diff.messages = a.messages - b.messages; - diff.bytes = a.bytes - b.bytes; - return diff; -} - void VizMsgStats::Update(const VizMsg *vmsg) { const SandeshHeader &header(vmsg->msg->GetHeader()); messages++; @@ -79,23 +63,23 @@ void VizMsgStats::Update(const VizMsg *vmsg) { } template -void GetStats(T &stats, const VizMsgStats *vmstats, K &key) { - stats.set_messages(vmstats->messages); - stats.set_bytes(vmstats->bytes); - stats.set_last_msg_timestamp(vmstats->last_msg_timestamp); +void GetStats(T *stats, const VizMsgStats *vmstats, const K &key) { + stats->set_messages(vmstats->messages); + stats->set_bytes(vmstats->bytes); + stats->set_last_msg_timestamp(vmstats->last_msg_timestamp); } template <> -void GetStats<>(SandeshMessageInfo &sminfo, - const VizMsgStats *vmstats, VizMsgStatistics::TypeLevelKey &key) { - sminfo.set_type(key.first); - sminfo.set_level(key.second); - sminfo.set_messages(vmstats->messages); - sminfo.set_bytes(vmstats->bytes); +void GetStats<>(SandeshMessageInfo *sminfo, + const VizMsgStats *vmstats, const VizMsgStatistics::TypeLevelKey &key) { + sminfo->set_type(key.first); + sminfo->set_level(key.second); + sminfo->set_messages(vmstats->messages); + sminfo->set_bytes(vmstats->bytes); } template -void VizMsgStats::Get(K &key, T &stats) const { +void VizMsgStats::Get(const K &key, T *stats) const { GetStats(stats, this, key); } @@ -130,32 +114,37 @@ void VizMsgStatistics::Update(const VizMsg *vmsg) { } // TypeMap -void VizMsgStatistics::Get(std::vector &ssv) const { +void VizMsgStatistics::Get(std::vector *ssv) const { for (TypeMap::const_iterator it = type_map.begin(); it != type_map.end(); it++) { SandeshStats sstats; sstats.set_message_type(it->first); const VizMsgStats *vmstats(it->second); - vmstats->Get(it->first, sstats); - ssv.push_back(sstats); + vmstats->Get(it->first, &sstats); + ssv->push_back(sstats); } } // LogLevelMap -void VizMsgStatistics::Get(std::vector &lsv) const { +void VizMsgStatistics::Get(std::vector *lsv) const { for (LevelMap::const_iterator it = level_map.begin(); it != level_map.end(); it++) { SandeshLogLevelStats lstats; lstats.set_level(it->first); const VizMsgStats *vmstats(it->second); - vmstats->Get(it->first, lstats); - lsv.push_back(lstats); + vmstats->Get(it->first, &lstats); + lsv->push_back(lstats); } } // TypeLevelMap -void VizMsgStatistics::Get(std::vector &smv) { - // Send diffs - GetDiffStats( - type_level_map, otype_level_map, smv); +void VizMsgStatistics::Get(std::vector *smv) { + for (TypeLevelMap::const_iterator it = type_level_map.begin(); + it != type_level_map.end(); it++) { + const VizMsgStats *vmstats(it->second); + SandeshMessageInfo smi; + vmstats->Get(it->first, &smi); + smv->push_back(smi); + } + type_level_map.clear(); } diff --git a/src/analytics/viz_message.h b/src/analytics/viz_message.h index 1d8c466b204..c795bb92716 100644 --- a/src/analytics/viz_message.h +++ b/src/analytics/viz_message.h @@ -37,9 +37,7 @@ struct VizMsgStats { VizMsgStats() : messages(0), bytes(0), last_msg_timestamp(0) {} void Update(const VizMsg *vmsg); - template void Get(K &key, T &stats) const; - friend VizMsgStats operator+(const VizMsgStats &a, const VizMsgStats &b); - friend VizMsgStats operator-(const VizMsgStats &a, const VizMsgStats &b); + template void Get(const K &key, T *stats) const; uint64_t messages; uint64_t bytes; @@ -50,9 +48,9 @@ struct VizMsgStatistics { VizMsgStatistics() {} void Update(const VizMsg *vmsg); - void Get(std::vector &ssv) const; - void Get(std::vector &lsv) const; - void Get(std::vector &sms); + void Get(std::vector *ssv) const; + void Get(std::vector *lsv) const; + void Get(std::vector *sms); typedef boost::ptr_map TypeMap; TypeMap type_map; @@ -63,7 +61,6 @@ struct VizMsgStatistics { typedef std::pair TypeLevelKey; typedef boost::ptr_map TypeLevelMap; TypeLevelMap type_level_map; - TypeLevelMap otype_level_map; }; /* generic message for ruleeng processing */ diff --git a/src/gendb/cdb_if.cc b/src/gendb/cdb_if.cc index 58f2cb5fbe6..fdadd964c08 100644 --- a/src/gendb/cdb_if.cc +++ b/src/gendb/cdb_if.cc @@ -6,7 +6,6 @@ #include #include -#include "analytics/diffstats.h" #include #include #include diff --git a/src/gendb/gendb_statistics.cc b/src/gendb/gendb_statistics.cc index 83e858eea7e..93ea3d3cbe9 100644 --- a/src/gendb/gendb_statistics.cc +++ b/src/gendb/gendb_statistics.cc @@ -2,34 +2,10 @@ // Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. // -#include #include "gendb_statistics.h" namespace GenDb { -// TableStats -GenDb::DbTableStatistics::TableStats operator+( - const GenDb::DbTableStatistics::TableStats &a, - const GenDb::DbTableStatistics::TableStats &b) { - GenDb::DbTableStatistics::TableStats sum; - sum.num_reads_ = a.num_reads_ + b.num_reads_; - sum.num_read_fails_ = a.num_read_fails_ + b.num_read_fails_; - sum.num_writes_ = a.num_writes_ + b.num_writes_; - sum.num_write_fails_ = a.num_write_fails_ + b.num_write_fails_; - return sum; -} - -GenDb::DbTableStatistics::TableStats operator-( - const GenDb::DbTableStatistics::TableStats &a, - const GenDb::DbTableStatistics::TableStats &b) { - GenDb::DbTableStatistics::TableStats diff; - diff.num_reads_ = a.num_reads_ - b.num_reads_; - diff.num_read_fails_ = a.num_read_fails_ - b.num_read_fails_; - diff.num_writes_ = a.num_writes_ - b.num_writes_; - diff.num_write_fails_ = a.num_write_fails_ - b.num_write_fails_; - return diff; -} - void GenDb::DbTableStatistics::TableStats::Update(bool write, bool fail) { if (write) { if (fail) { @@ -47,12 +23,12 @@ void GenDb::DbTableStatistics::TableStats::Update(bool write, bool fail) { } void GenDb::DbTableStatistics::TableStats::Get(const std::string &table_name, - DbTableInfo &info) const { - info.set_table_name(table_name); - info.set_reads(num_reads_); - info.set_read_fails(num_read_fails_); - info.set_writes(num_writes_); - info.set_write_fails(num_write_fails_); + DbTableInfo *info) const { + info->set_table_name(table_name); + info->set_reads(num_reads_); + info->set_read_fails(num_read_fails_); + info->set_writes(num_writes_); + info->set_write_fails(num_write_fails_); } // DbTableStatistics @@ -67,10 +43,14 @@ void GenDb::DbTableStatistics::Update(const std::string &table_name, } void GenDb::DbTableStatistics::Get(std::vector *vdbti) { - // Send diffs - GetDiffStats( - table_stats_map_, otable_stats_map_, *vdbti); + for (TableStatsMap::const_iterator it = table_stats_map_.begin(); + it != table_stats_map_.end(); it++) { + const TableStats *table_stats(it->second); + GenDb::DbTableInfo dbti; + table_stats->Get(it->first, &dbti); + vdbti->push_back(dbti); + } + table_stats_map_.clear(); } } // namespace GenDb diff --git a/src/gendb/gendb_statistics.h b/src/gendb/gendb_statistics.h index acf7543ed3d..bb53546848e 100644 --- a/src/gendb/gendb_statistics.h +++ b/src/gendb/gendb_statistics.h @@ -27,7 +27,7 @@ class DbTableStatistics { } void Update(bool write, bool fail); void Get(const std::string &table_name, - GenDb::DbTableInfo &dbti) const; + GenDb::DbTableInfo *dbti) const; uint64_t num_reads_; uint64_t num_read_fails_; @@ -35,16 +35,8 @@ class DbTableStatistics { uint64_t num_write_fails_; }; - friend DbTableStatistics::TableStats operator+( - const DbTableStatistics::TableStats &a, - const DbTableStatistics::TableStats &b); - friend DbTableStatistics::TableStats operator-( - const DbTableStatistics::TableStats &a, - const DbTableStatistics::TableStats &b); - typedef boost::ptr_map TableStatsMap; TableStatsMap table_stats_map_; - TableStatsMap otable_stats_map_; }; } // namespace GenDb diff --git a/src/gendb/test/gendb_if_test.cc b/src/gendb/test/gendb_if_test.cc index f3875333e85..9b64101649d 100644 --- a/src/gendb/test/gendb_if_test.cc +++ b/src/gendb/test/gendb_if_test.cc @@ -580,7 +580,6 @@ static void PopulateDbDataValueVec(GenDb::DbDataValueVec *dbv, size_t *vsize) { } static GenDb::NewCol* CreateNewColNoSql(size_t *csize) { - size_t size(0); GenDb::DbDataValueVec *name(new GenDb::DbDataValueVec); PopulateDbDataValueVec(name, csize); GenDb::DbDataValueVec *value(new GenDb::DbDataValueVec);