Skip to content

Commit

Permalink
Feature:
Browse files Browse the repository at this point in the history
1. Added the parameter location_expire_period_time to set the active
    expiration time of the location cache. The value range is [0s, 30d],
    the default is 0
 2. show proxyroute supports printing location cache expiration time
 3. Distinguish between business requests and internal, full-time
    requests, and business request parameter control
 4. When the business request is enabled_cached_server = true, the
    Partition is not random

Bugfix:
 1. Fix core issue when obproxy::omt::ObResourceUnitTableProcessor::inc_conn
 2. Fix the problem that the route cannot be routed when establishing
    a connection with a cluster id
 3. Fix the timestamp accuracy modification caused the old version of
    the observer to be inaccurate routing
 4. Fix the Sharding scenario, the select table name of the sub-database
    and sub-table is case-sensitive, resulting in an error report
 5. Fix the Sharding scenario, the select of sub-database and sub-table
    will be intercepted and unsupported syntax problem
 6. Fixed an issue where a single SQL was sent multiple times, causing
    the SQL to take more than 40ms
 7. Fix the rslist method, specify 127.0.0.1 to start obproxy, in the
    server failure scenario, more than 3 times, the connection fails to be
    established
 8. Fixed the issue that if the cluster scheduled task fails more than
    10 times, the blacklist will be invalid
 9. Fixed the problem that OBProxy still thinks the connection is
    successful when the server hangs up
 10. Fixed the problem that the cluster scheduled task failed more than
     10 times, causing it to remain in the blacklist
 11. Fix the problem that COM_CHANGE_USER will be disconnected
  • Loading branch information
guangshu.wgs committed Aug 24, 2022
2 parents 99faebf + b54918f commit 6dc6c66
Show file tree
Hide file tree
Showing 40 changed files with 289 additions and 157 deletions.
7 changes: 4 additions & 3 deletions configure.ac
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
AC_INIT([OceanBase],
[3.2.3],
[3.2.3.5],
[wgs13579@gmail.com],
[obproxy-ce],
[http://oceanbase.taobao.org/])

obapi_version="3.2.3"
obapi_version="3.2.3.5"
AC_SUBST(obapi_version)

AC_DISABLE_STATIC
Expand Down Expand Up @@ -106,7 +106,8 @@
[with perf (default is NO)]),
[
if test "$withval" = "yes"; then
# 下面参数为使用gperftools的选项,目前未用tcmalloc
# The following parameters are options for using gperftools,
# currently not using tcmalloc
# test_perf=yes
# AM_CXXFLAGS="${AM_CXXFLAGS} -D__NEED_PERF__"
# AM_LDFLAGS="${AM_LDFLAGS} -lprofiler"
Expand Down
2 changes: 1 addition & 1 deletion deps/3rd/obproxy.el7.aarch64.deps
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ obdevtools-flex-2.5.35-3.el7.aarch64.rpm
obdevtools-llvm-11.0.1-40.el7.aarch64.rpm

[release]
oceanbase-ce-devel-3.1.3-10000102022030411.el7.aarch64.rpm
oceanbase-ce-devel-3.1.3-10100032022041510.el7.aarch64.rpm
2 changes: 1 addition & 1 deletion deps/3rd/obproxy.el7.x86_64.deps
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ obdevtools-flex-2.5.35-3.el7.x86_64.rpm
obdevtools-llvm-11.0.1-40.el7.x86_64.rpm

[release]
oceanbase-ce-devel-3.1.3-10000102022030411.el7.x86_64.rpm
oceanbase-ce-devel-3.1.3-10100032022041510.el7.x86_64.rpm
2 changes: 1 addition & 1 deletion deps/3rd/obproxy.el8.aarch64.deps
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ obdevtools-flex-2.5.35-10.el8.aarch64.rpm
obdevtools-llvm-11.0.1-40.el8.aarch64.rpm

[release]
oceanbase-ce-devel-3.1.3-10000102022030411.el8.aarch64.rpm
oceanbase-ce-devel-3.1.3-10100032022041510.el8.aarch64.rpm
2 changes: 1 addition & 1 deletion deps/3rd/obproxy.el8.x86_64.deps
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ obdevtools-flex-2.5.35-3.el8.x86_64.rpm
obdevtools-llvm-11.0.1-40.el8.x86_64.rpm

[release]
oceanbase-ce-devel-3.1.3-10000102022030411.el8.x86_64.rpm
oceanbase-ce-devel-3.1.3-10100032022041510.el8.x86_64.rpm
2 changes: 1 addition & 1 deletion rpm/obproxy-ce-VER.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.2.3
3.2.3.5
2 changes: 1 addition & 1 deletion script/deploy/obproxyd.sh
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ function check_opt()
OBPROXY_OPT_LOCAL="${OBPROXY_OPT_LOCAL},$OBPROXY_EXTRA_OPT"
fi

OBPROXY_OPT_LOCAL=",enable_cached_server=false,enable_get_rslist_remote=true,monitor_stat_dump_interval=1s,enable_qos=true,enable_standby=false,query_digest_time_threshold=2ms,monitor_cost_ms_unit=true,enable_strict_kernel_release=false,enable_proxy_scramble=true,work_thread_num=$WORK_THREAD_NUM,proxy_mem_limited='2G',log_dir_size_threshold=10G${OBPROXY_OPT_LOCAL}"
OBPROXY_OPT_LOCAL=",enable_cached_server=true,enable_get_rslist_remote=true,monitor_stat_dump_interval=1s,enable_qos=true,enable_standby=false,query_digest_time_threshold=2ms,monitor_cost_ms_unit=true,enable_strict_kernel_release=false,enable_proxy_scramble=true,work_thread_num=$WORK_THREAD_NUM,proxy_mem_limited='2G',log_dir_size_threshold=10G${OBPROXY_OPT_LOCAL}"
}

# change to the path where this script locates.
Expand Down
24 changes: 21 additions & 3 deletions src/common/ob_accuracy.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ class ObAccuracy
ObAccuracy(ObPrecision precision, ObScale scale) { set_precision(precision); set_scale(scale); }
ObAccuracy(ObLength length, ObPrecision precision, ObScale scale)
{ set_length(length); set_precision(precision); set_scale(scale); }
ObAccuracy(const ObAccuracy &other) { accuracy_ = other.accuracy_; }
ObAccuracy(bool valid, ObLength length, ObPrecision precision, ObScale scale) :
valid_(valid), length_(length), precision_(precision), scale_(scale) {}
ObAccuracy(const ObAccuracy &other) { accuracy_ = other.accuracy_; valid_ = other.valid_; }

OB_INLINE void set_accuracy(const ObAccuracy &accuracy) { accuracy_ = accuracy.accuracy_; }
OB_INLINE void set_accuracy(const int64_t &accuracy) { accuracy_ = accuracy; }
OB_INLINE void set_length(ObLength length) { length_ = length; }
Expand All @@ -47,12 +50,19 @@ class ObAccuracy
OB_INLINE ObLength get_length() const { return length_; }
OB_INLINE ObPrecision get_precision() const { return precision_; }
OB_INLINE ObScale get_scale() const { return scale_; }
OB_INLINE void reset() { accuracy_ = -1; }

/*
* the default length, precision, scale is different in each type
*/
OB_INLINE void reset() { valid_ = false; length_ = -1; precision_ = -1; scale_ = -1; }
OB_INLINE bool is_valid() const { return valid_; }

public:
OB_INLINE ObAccuracy &operator =(const ObAccuracy &other)
{
if (this != &other) {
accuracy_ = other.accuracy_;
valid_ = other.valid_;
}
return *this;
}
Expand All @@ -71,9 +81,17 @@ class ObAccuracy
public:
TO_STRING_KV(N_LENGTH, length_,
N_PRECISION, precision_,
N_SCALE, scale_);
N_SCALE, scale_,
K_(valid));
NEED_SERIALIZE_AND_DESERIALIZE;

public:
/*
* whether we get the accuracy from server or not
* it is not recommend to judge the init status by value, the init value of different type is different
* the valid value of <len, pre, scale> is as the same as the mysql/oracle document defined
*/
bool valid_;
union
{
int64_t accuracy_;
Expand Down
63 changes: 30 additions & 33 deletions src/common/ob_obj_cast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4126,39 +4126,36 @@ int obj_accuracy_check(ObCastCtx &cast_ctx,
{
int ret = OB_SUCCESS;

LOG_DEBUG("obj_accuracy_check before", K(obj), K(accuracy), K(cs_type));

switch (obj.get_type_class()) {
case ObFloatTC: {
ret = float_range_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObDoubleTC: {
ret = double_check_precision(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObNumberTC: {
ret = number_range_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObDateTimeTC: {
ret = datetime_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObOTimestampTC: {
ret = otimestamp_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObTimeTC: {
ret = time_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObStringTC: {
ret = string_length_check(cast_ctx, accuracy, cs_type, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
default: {
break;
if (accuracy.is_valid()) {
LOG_DEBUG("obj_accuracy_check before", K(obj), K(accuracy), K(cs_type));
switch (obj.get_type_class()) {
case ObFloatTC: {
ret = float_range_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObDoubleTC: {
ret = double_check_precision(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObNumberTC: {
ret = number_range_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObDateTimeTC: {
ret = datetime_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObOTimestampTC: {
ret = otimestamp_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
case ObTimeTC: {
ret = time_scale_check(cast_ctx, accuracy, obj, buf_obj, res_obj, cast_ctx.cast_mode_);
break;
}
default: {
break;
}
}
}

Expand Down
64 changes: 59 additions & 5 deletions src/obproxy/cmd/ob_show_route_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ enum
OB_RC_LAST_VALID,
OB_RC_LAST_ACCESS,
OB_RC_LAST_UPDATE,
OB_RC_EXPIRE_TIME,
OB_RC_RELATIVE_EXPIRE_TIME,
OB_RC_SERVER_ADDR,
OB_RC_MAX_ROUTE_COLUMN_ID,
};
Expand All @@ -69,6 +71,8 @@ const ObProxyColumnSchema ROUTE_COLUMN_ARRAY[OB_RC_MAX_ROUTE_COLUMN_ID] = {
ObProxyColumnSchema::make_schema(OB_RC_LAST_VALID, "last_valid_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RC_LAST_ACCESS, "last_access_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RC_LAST_UPDATE, "last_update_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RC_EXPIRE_TIME, "expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RC_RELATIVE_EXPIRE_TIME, "relative_expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RC_SERVER_ADDR, "server addr", OB_MYSQL_TYPE_VARCHAR),
};

Expand All @@ -84,6 +88,8 @@ enum
OB_RPC_LAST_VALID,
OB_RPC_LAST_ACCESS,
OB_RPC_LAST_UPDATE,
OB_RPC_EXPIRE_TIME,
OB_RPC_RELATIVE_EXPIRE_TIME,
OB_RPC_SERVER_ADDR,
OB_RPC_MAX_ROUTE_COLUMN_ID,
};
Expand All @@ -98,6 +104,8 @@ const ObProxyColumnSchema ROUTE_PARTITION_COLUMN_ARRAY[OB_RPC_MAX_ROUTE_COLUMN_I
ObProxyColumnSchema::make_schema(OB_RPC_LAST_VALID, "last_valid_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RPC_LAST_ACCESS, "last_access_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RPC_LAST_UPDATE, "last_update_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RPC_EXPIRE_TIME, "expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RPC_RELATIVE_EXPIRE_TIME, "relative_expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RPC_SERVER_ADDR, "server addr", OB_MYSQL_TYPE_VARCHAR),
};

Expand All @@ -119,6 +127,8 @@ enum
OB_RRC_LAST_VALID,
OB_RRC_LAST_ACCESS,
OB_RRC_LAST_UPDATE,
OB_RRC_EXPIRE_TIME,
OB_RRC_RELATIVE_EXPIRE_TIME,
OB_RRC_ROUTE_SQL,
OB_RRC_MAX_ROUTE_COLUMN_ID,
};
Expand All @@ -138,11 +148,14 @@ const ObProxyColumnSchema ROUTE_ROUTINE_COLUMN_ARRAY[OB_RRC_MAX_ROUTE_COLUMN_ID]
ObProxyColumnSchema::make_schema(OB_RRC_LAST_VALID, "last_valid_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RRC_LAST_ACCESS, "last_access_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RRC_LAST_UPDATE, "last_update_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RRC_EXPIRE_TIME, "expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RRC_RELATIVE_EXPIRE_TIME, "relative_expire_time", OB_MYSQL_TYPE_VARCHAR),
ObProxyColumnSchema::make_schema(OB_RRC_ROUTE_SQL, "route_sql", OB_MYSQL_TYPE_VARCHAR),
};

int extract_entry_time(const ObRouteEntry &entry, char *create_timebuf, char *valid_timebuf,
char *access_timebuf, char *update_timebuf, const uint32_t buf_len);
char *access_timebuf, char *update_timebuf, char *expire_timebuf,
char *relative_expire_timebuf, const uint32_t buf_len);

ObShowRouteHandler::ObShowRouteHandler(ObContinuation *cont, ObMIOBuffer *buf,
const ObInternalCmdInfo &info)
Expand Down Expand Up @@ -534,15 +547,19 @@ int ObShowRouteHandler::dump_table_item(const ObTableEntry &entry)
char valid_timebuf[buf_len];
char access_timebuf[buf_len];
char update_timebuf[buf_len];
char expire_timebuf[buf_len];
char relative_expire_timebuf[buf_len];

if (OB_FAIL(extract_entry_time(entry, create_timebuf, valid_timebuf, access_timebuf,
update_timebuf, buf_len))) {
update_timebuf, expire_timebuf, relative_expire_timebuf, buf_len))) {
WARN_ICMD("fail to extract_entry_time", K(entry), K(ret));
} else {
cells[OB_RC_CREATE].set_varchar(create_timebuf);
cells[OB_RC_LAST_VALID].set_varchar(valid_timebuf);
cells[OB_RC_LAST_ACCESS].set_varchar(access_timebuf);
cells[OB_RC_LAST_UPDATE].set_varchar(update_timebuf);
cells[OB_RC_EXPIRE_TIME].set_varchar(expire_timebuf);
cells[OB_RC_RELATIVE_EXPIRE_TIME].set_varchar(relative_expire_timebuf);

row.cells_ = cells;
row.count_ = OB_RC_MAX_ROUTE_COLUMN_ID;
Expand All @@ -558,7 +575,8 @@ int ObShowRouteHandler::dump_table_item(const ObTableEntry &entry)
}

int extract_entry_time(const ObRouteEntry &entry, char *create_timebuf, char *valid_timebuf,
char *access_timebuf, char *update_timebuf, const uint32_t buf_len)
char *access_timebuf, char *update_timebuf, char *expire_timebuf,
char *relative_expire_time, const uint32_t buf_len)
{
int ret = OB_SUCCESS;
struct tm struct_tm;
Expand Down Expand Up @@ -621,6 +639,34 @@ int extract_entry_time(const ObRouteEntry &entry, char *create_timebuf, char *va
}
}
}
if (OB_SUCC(ret)) {
time_us = usec_to_sec(entry.get_time_for_expired());
if (OB_ISNULL(localtime_r(&time_us, &struct_tm))) {
ret = OB_ERR_UNEXPECTED;
WARN_ICMD("fail to converts the calendar time timep to broken-time representation", K(time_us), K(ret));
} else {
strftime_len = strftime(expire_timebuf, buf_len, "%Y-%m-%d %H:%M:%S", &struct_tm);
if (OB_UNLIKELY(strftime_len <= 0) || OB_UNLIKELY(strftime_len >= buf_len)) {
ret = OB_BUF_NOT_ENOUGH;
WARN_ICMD("timebuf is not enough", K(strftime_len), "timebuf length", buf_len,
K(expire_timebuf), K(ret));
}
}
}
if (OB_SUCC(ret)) {
time_us = usec_to_sec(get_global_table_cache().get_cache_expire_time_us());
if (OB_ISNULL(localtime_r(&time_us, &struct_tm))) {
ret = OB_ERR_UNEXPECTED;
WARN_ICMD("fail to converts the calendar time timep to broken-time representation", K(time_us), K(ret));
} else {
strftime_len = strftime(relative_expire_time, buf_len, "%Y-%m-%d %H:%M:%S", &struct_tm);
if (OB_UNLIKELY(strftime_len <= 0) || OB_UNLIKELY(strftime_len >= buf_len)) {
ret = OB_BUF_NOT_ENOUGH;
WARN_ICMD("timebuf is not enough", K(strftime_len), "timebuf length", buf_len,
K(expire_timebuf), K(ret));
}
}
}
return ret;
}

Expand Down Expand Up @@ -668,15 +714,19 @@ int ObShowRouteHandler::dump_partition_item(const ObPartitionEntry &entry)
char valid_timebuf[buf_len];
char access_timebuf[buf_len];
char update_timebuf[buf_len];
char expire_timebuf[buf_len];
char relative_expire_timebuf[buf_len];

if (OB_FAIL(extract_entry_time(entry, create_timebuf, valid_timebuf, access_timebuf,
update_timebuf, buf_len))) {
update_timebuf, expire_timebuf, relative_expire_timebuf, buf_len))) {
WARN_ICMD("fail to extract_entry_time", K(entry), K(ret));
} else {
cells[OB_RPC_CREATE].set_varchar(create_timebuf);
cells[OB_RPC_LAST_VALID].set_varchar(valid_timebuf);
cells[OB_RPC_LAST_ACCESS].set_varchar(access_timebuf);
cells[OB_RPC_LAST_UPDATE].set_varchar(update_timebuf);
cells[OB_RPC_EXPIRE_TIME].set_varchar(expire_timebuf);
cells[OB_RPC_RELATIVE_EXPIRE_TIME].set_varchar(relative_expire_timebuf);

row.cells_ = cells;
row.count_ = OB_RPC_MAX_ROUTE_COLUMN_ID;
Expand Down Expand Up @@ -715,15 +765,19 @@ int ObShowRouteHandler::dump_routine_item(const ObRoutineEntry &entry)
char valid_timebuf[buf_len];
char access_timebuf[buf_len];
char update_timebuf[buf_len];
char expire_timebuf[buf_len];
char relative_expire_timebuf[buf_len];

if (OB_FAIL(extract_entry_time(entry, create_timebuf, valid_timebuf, access_timebuf,
update_timebuf, buf_len))) {
update_timebuf, expire_timebuf, relative_expire_timebuf, buf_len))) {
WARN_ICMD("fail to extract_entry_time", K(entry), K(ret));
} else {
cells[OB_RRC_CREATE].set_varchar(create_timebuf);
cells[OB_RRC_LAST_VALID].set_varchar(valid_timebuf);
cells[OB_RRC_LAST_ACCESS].set_varchar(access_timebuf);
cells[OB_RRC_LAST_UPDATE].set_varchar(update_timebuf);
cells[OB_RRC_EXPIRE_TIME].set_varchar(expire_timebuf);
cells[OB_RRC_RELATIVE_EXPIRE_TIME].set_varchar(relative_expire_timebuf);

row.cells_ = cells;
row.count_ = OB_RRC_MAX_ROUTE_COLUMN_ID;
Expand Down
2 changes: 1 addition & 1 deletion src/obproxy/engine/ob_proxy_operator_table_scan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ int ObProxyTableScanOp::set_index_for_expr(ObProxyExpr *expr)
} else {
ObString &table_name = expr_column->get_table_name();
ObString &column_name = expr_column->get_column_name();
if ((table_name.empty() || field.tname_.prefix_match(table_name))
if ((table_name.empty() || field.tname_.prefix_case_match(table_name))
&& 0 == column_name.case_compare(field.cname_)) {
expr->set_index(i);
expr->set_accuracy(field.accuracy_);
Expand Down
7 changes: 4 additions & 3 deletions src/obproxy/iocore/net/ob_unix_net_vconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ namespace obproxy
namespace net
{

// A block size is 8k, and 2 blocks can transmit 16k data, which meets the requirements
static const int64_t NET_MAX_IOV = 2;
static const int64_t NET_MAX_IOV = 16;

static inline ObNetState &get_net_state_by_vio(ObVIO &vio)
{
Expand Down Expand Up @@ -1013,7 +1012,9 @@ ObVIO *ObUnixNetVConnection::do_io_write(
// SSL_read maybe trigger write and SSL_write maybe trigger read
// so reenable write
if (nbytes > 0 && (!write_.enabled_ || using_ssl_)) {
write_.triggered_ = true;
if (using_ssl_) {
write_.triggered_ = true;
}
write_.vio_.reenable();
}
} else {
Expand Down
1 change: 0 additions & 1 deletion src/obproxy/obutils/ob_congestion_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@ class ObCongestionManager : public CongestionTable
ObCongestionZoneState *get_zone_state(const common::ObString &zone_name);
bool is_base_servers_added() const { return is_base_servers_added_; }
void set_base_servers_added() { is_base_servers_added_ = true; }
void clear_base_servers_added() { is_base_servers_added_ = false; }
bool is_congestion_avail();
int update_tc_congestion_map(ObCongestionEntry &entry);
DECLARE_TO_STRING;
Expand Down
Loading

0 comments on commit 6dc6c66

Please sign in to comment.