Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
B
brpc
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
brpc
Commits
a13730a4
Commit
a13730a4
authored
May 07, 2019
by
helei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add explicit key word
parent
cc6642bd
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
141 additions
and
85 deletions
+141
-85
adaptive_connection_type.h
src/brpc/adaptive_connection_type.h
+5
-5
adaptive_max_concurrency.h
src/brpc/adaptive_max_concurrency.h
+7
-7
adaptive_protocol_type.h
src/brpc/adaptive_protocol_type.h
+7
-7
server.cpp
src/brpc/server.cpp
+66
-66
brpc_adaptive_class_unittest.cpp
test/brpc_adaptive_class_unittest.cpp
+56
-0
No files found.
src/brpc/adaptive_connection_type.h
View file @
a13730a4
// Copyright (c) 2015 Baidu, Inc.
// Copyright (c) 2015 Baidu, Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// You may obtain a copy of the License at
//
//
// http://www.apache.org/licenses/LICENSE-2.0
// http://www.apache.org/licenses/LICENSE-2.0
//
//
// Unless required by applicable law or agreed to in writing, software
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...
@@ -38,7 +38,7 @@ const char* ConnectionTypeToString(ConnectionType);
...
@@ -38,7 +38,7 @@ const char* ConnectionTypeToString(ConnectionType);
// Assignable by both ConnectionType and names.
// Assignable by both ConnectionType and names.
class
AdaptiveConnectionType
{
class
AdaptiveConnectionType
{
public
:
public
:
AdaptiveConnectionType
()
:
_type
(
CONNECTION_TYPE_UNKNOWN
),
_error
(
false
)
{}
AdaptiveConnectionType
()
:
_type
(
CONNECTION_TYPE_UNKNOWN
),
_error
(
false
)
{}
AdaptiveConnectionType
(
ConnectionType
type
)
:
_type
(
type
),
_error
(
false
)
{}
AdaptiveConnectionType
(
ConnectionType
type
)
:
_type
(
type
),
_error
(
false
)
{}
~
AdaptiveConnectionType
()
{}
~
AdaptiveConnectionType
()
{}
...
@@ -52,7 +52,7 @@ public:
...
@@ -52,7 +52,7 @@ public:
operator
ConnectionType
()
const
{
return
_type
;
}
operator
ConnectionType
()
const
{
return
_type
;
}
const
char
*
name
()
const
{
return
ConnectionTypeToString
(
_type
);
}
const
char
*
name
()
const
{
return
ConnectionTypeToString
(
_type
);
}
bool
has_error
()
const
{
return
_error
;
}
bool
has_error
()
const
{
return
_error
;
}
private
:
private
:
ConnectionType
_type
;
ConnectionType
_type
;
// Since this structure occupies 8 bytes in 64-bit machines anyway,
// Since this structure occupies 8 bytes in 64-bit machines anyway,
...
...
src/brpc/adaptive_max_concurrency.h
View file @
a13730a4
// Copyright (c) 2014 Baidu, Inc.G
// Copyright (c) 2014 Baidu, Inc.G
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// You may obtain a copy of the License at
...
@@ -27,13 +27,13 @@ namespace brpc {
...
@@ -27,13 +27,13 @@ namespace brpc {
class
AdaptiveMaxConcurrency
{
class
AdaptiveMaxConcurrency
{
public
:
public
:
AdaptiveMaxConcurrency
();
explicit
AdaptiveMaxConcurrency
();
AdaptiveMaxConcurrency
(
int
max_concurrency
);
explicit
AdaptiveMaxConcurrency
(
int
max_concurrency
);
AdaptiveMaxConcurrency
(
const
butil
::
StringPiece
&
value
);
explicit
AdaptiveMaxConcurrency
(
const
butil
::
StringPiece
&
value
);
// Non-trivial destructor to prevent AdaptiveMaxConcurrency from being
// Non-trivial destructor to prevent AdaptiveMaxConcurrency from being
// passed to variadic arguments without explicit type conversion.
// passed to variadic arguments without explicit type conversion.
// eg:
// eg:
// printf("%d", options.max_concurrency) // compile error
// printf("%d", options.max_concurrency) // compile error
// printf("%s", options.max_concurrency.value().c_str()) // ok
// printf("%s", options.max_concurrency.value().c_str()) // ok
~
AdaptiveMaxConcurrency
()
{}
~
AdaptiveMaxConcurrency
()
{}
...
...
src/brpc/adaptive_protocol_type.h
View file @
a13730a4
// Copyright (c) 2015 Baidu, Inc.
// Copyright (c) 2015 Baidu, Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// You may obtain a copy of the License at
//
//
// http://www.apache.org/licenses/LICENSE-2.0
// http://www.apache.org/licenses/LICENSE-2.0
//
//
// Unless required by applicable law or agreed to in writing, software
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...
@@ -38,9 +38,9 @@ const char* ProtocolTypeToString(ProtocolType);
...
@@ -38,9 +38,9 @@ const char* ProtocolTypeToString(ProtocolType);
// Assignable by both ProtocolType and names.
// Assignable by both ProtocolType and names.
class
AdaptiveProtocolType
{
class
AdaptiveProtocolType
{
public
:
public
:
AdaptiveProtocolType
()
:
_type
(
PROTOCOL_UNKNOWN
)
{}
explicit
AdaptiveProtocolType
()
:
_type
(
PROTOCOL_UNKNOWN
)
{}
AdaptiveProtocolType
(
ProtocolType
type
)
:
_type
(
type
)
{}
explicit
AdaptiveProtocolType
(
ProtocolType
type
)
:
_type
(
type
)
{}
~
AdaptiveProtocolType
()
{}
~
AdaptiveProtocolType
()
{}
void
operator
=
(
ProtocolType
type
)
{
void
operator
=
(
ProtocolType
type
)
{
...
@@ -77,7 +77,7 @@ public:
...
@@ -77,7 +77,7 @@ public:
bool
has_param
()
const
{
return
!
_param
.
empty
();
}
bool
has_param
()
const
{
return
!
_param
.
empty
();
}
const
std
::
string
&
param
()
const
{
return
_param
;
}
const
std
::
string
&
param
()
const
{
return
_param
;
}
private
:
private
:
ProtocolType
_type
;
ProtocolType
_type
;
std
::
string
_name
;
std
::
string
_name
;
...
...
src/brpc/server.cpp
View file @
a13730a4
// Copyright (c) 2014 Baidu, Inc.
// Copyright (c) 2014 Baidu, Inc.
//
//
// Licensed under the Apache License, Version 2.0 (the "License");
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// You may obtain a copy of the License at
//
//
// http://www.apache.org/licenses/LICENSE-2.0
// http://www.apache.org/licenses/LICENSE-2.0
//
//
// Unless required by applicable law or agreed to in writing, software
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...
@@ -133,7 +133,7 @@ ServerOptions::ServerOptions()
...
@@ -133,7 +133,7 @@ ServerOptions::ServerOptions()
,
bthread_init_fn
(
NULL
)
,
bthread_init_fn
(
NULL
)
,
bthread_init_args
(
NULL
)
,
bthread_init_args
(
NULL
)
,
bthread_init_count
(
0
)
,
bthread_init_count
(
0
)
,
internal_port
(
-
1
)
,
internal_port
(
-
1
)
,
has_builtin_services
(
true
)
,
has_builtin_services
(
true
)
,
http_master_service
(
NULL
)
,
http_master_service
(
NULL
)
,
health_reporter
(
NULL
)
,
health_reporter
(
NULL
)
...
@@ -271,12 +271,12 @@ std::string Server::ServerPrefix() const {
...
@@ -271,12 +271,12 @@ std::string Server::ServerPrefix() const {
void
*
Server
::
UpdateDerivedVars
(
void
*
arg
)
{
void
*
Server
::
UpdateDerivedVars
(
void
*
arg
)
{
const
int64_t
start_us
=
butil
::
cpuwide_time_us
();
const
int64_t
start_us
=
butil
::
cpuwide_time_us
();
Server
*
server
=
static_cast
<
Server
*>
(
arg
);
Server
*
server
=
static_cast
<
Server
*>
(
arg
);
const
std
::
string
prefix
=
server
->
ServerPrefix
();
const
std
::
string
prefix
=
server
->
ServerPrefix
();
std
::
vector
<
SocketId
>
conns
;
std
::
vector
<
SocketId
>
conns
;
std
::
vector
<
SocketId
>
internal_conns
;
std
::
vector
<
SocketId
>
internal_conns
;
server
->
_nerror_bvar
.
expose_as
(
prefix
,
"error"
);
server
->
_nerror_bvar
.
expose_as
(
prefix
,
"error"
);
bvar
::
PassiveStatus
<
timeval
>
uptime_st
(
bvar
::
PassiveStatus
<
timeval
>
uptime_st
(
...
@@ -284,10 +284,10 @@ void* Server::UpdateDerivedVars(void* arg) {
...
@@ -284,10 +284,10 @@ void* Server::UpdateDerivedVars(void* arg) {
bvar
::
PassiveStatus
<
std
::
string
>
start_time_st
(
bvar
::
PassiveStatus
<
std
::
string
>
start_time_st
(
prefix
,
"start_time"
,
PrintStartTime
,
server
);
prefix
,
"start_time"
,
PrintStartTime
,
server
);
bvar
::
PassiveStatus
<
int32_t
>
nconn_st
(
bvar
::
PassiveStatus
<
int32_t
>
nconn_st
(
prefix
,
"connection_count"
,
GetConnectionCount
,
server
);
prefix
,
"connection_count"
,
GetConnectionCount
,
server
);
bvar
::
PassiveStatus
<
int32_t
>
nservice_st
(
bvar
::
PassiveStatus
<
int32_t
>
nservice_st
(
prefix
,
"service_count"
,
GetServiceCount
,
server
);
prefix
,
"service_count"
,
GetServiceCount
,
server
);
...
@@ -339,7 +339,7 @@ void* Server::UpdateDerivedVars(void* arg) {
...
@@ -339,7 +339,7 @@ void* Server::UpdateDerivedVars(void* arg) {
}
}
}
}
last_time
=
butil
::
gettimeofday_us
();
last_time
=
butil
::
gettimeofday_us
();
// Update stats of accepted sockets.
// Update stats of accepted sockets.
if
(
server
->
_am
)
{
if
(
server
->
_am
)
{
server
->
_am
->
ListConnections
(
&
conns
);
server
->
_am
->
ListConnections
(
&
conns
);
...
@@ -388,7 +388,7 @@ Server::Server(ProfilerLinker)
...
@@ -388,7 +388,7 @@ Server::Server(ProfilerLinker)
,
_derivative_thread
(
INVALID_BTHREAD
)
,
_derivative_thread
(
INVALID_BTHREAD
)
,
_keytable_pool
(
NULL
)
,
_keytable_pool
(
NULL
)
,
_concurrency
(
0
)
{
,
_concurrency
(
0
)
{
BAIDU_CASSERT
(
offsetof
(
Server
,
_concurrency
)
%
64
==
0
,
BAIDU_CASSERT
(
offsetof
(
Server
,
_concurrency
)
%
64
==
0
,
Server_concurrency_must_be_aligned_by_cacheline
);
Server_concurrency_must_be_aligned_by_cacheline
);
}
}
...
@@ -411,7 +411,7 @@ Server::~Server() {
...
@@ -411,7 +411,7 @@ Server::~Server() {
delete
_options
.
http_master_service
;
delete
_options
.
http_master_service
;
_options
.
http_master_service
=
NULL
;
_options
.
http_master_service
=
NULL
;
delete
_am
;
delete
_am
;
_am
=
NULL
;
_am
=
NULL
;
delete
_internal_am
;
delete
_internal_am
;
...
@@ -422,7 +422,7 @@ Server::~Server() {
...
@@ -422,7 +422,7 @@ Server::~Server() {
delete
_global_restful_map
;
delete
_global_restful_map
;
_global_restful_map
=
NULL
;
_global_restful_map
=
NULL
;
if
(
!
_options
.
pid_file
.
empty
())
{
if
(
!
_options
.
pid_file
.
empty
())
{
unlink
(
_options
.
pid_file
.
c_str
());
unlink
(
_options
.
pid_file
.
c_str
());
}
}
...
@@ -513,7 +513,7 @@ int Server::AddBuiltinServices() {
...
@@ -513,7 +513,7 @@ int Server::AddBuiltinServices() {
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
BthreadsService
))
{
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
BthreadsService
))
{
LOG
(
ERROR
)
<<
"Fail to add BthreadsService"
;
LOG
(
ERROR
)
<<
"Fail to add BthreadsService"
;
return
-
1
;
return
-
1
;
}
}
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
IdsService
))
{
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
IdsService
))
{
LOG
(
ERROR
)
<<
"Fail to add IdsService"
;
LOG
(
ERROR
)
<<
"Fail to add IdsService"
;
return
-
1
;
return
-
1
;
...
@@ -521,7 +521,7 @@ int Server::AddBuiltinServices() {
...
@@ -521,7 +521,7 @@ int Server::AddBuiltinServices() {
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
SocketsService
))
{
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
SocketsService
))
{
LOG
(
ERROR
)
<<
"Fail to add SocketsService"
;
LOG
(
ERROR
)
<<
"Fail to add SocketsService"
;
return
-
1
;
return
-
1
;
}
}
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
GetFaviconService
))
{
if
(
AddBuiltinService
(
new
(
std
::
nothrow
)
GetFaviconService
))
{
LOG
(
ERROR
)
<<
"Fail to add GetFaviconService"
;
LOG
(
ERROR
)
<<
"Fail to add GetFaviconService"
;
return
-
1
;
return
-
1
;
...
@@ -601,7 +601,7 @@ int Server::InitializeOnce() {
...
@@ -601,7 +601,7 @@ int Server::InitializeOnce() {
return
0
;
return
0
;
}
}
GlobalInitializeOrDie
();
GlobalInitializeOrDie
();
if
(
_status
!=
UNINITIALIZED
)
{
if
(
_status
!=
UNINITIALIZED
)
{
return
0
;
return
0
;
}
}
...
@@ -690,7 +690,7 @@ static bool CreateConcurrencyLimiter(const AdaptiveMaxConcurrency& amc,
...
@@ -690,7 +690,7 @@ static bool CreateConcurrencyLimiter(const AdaptiveMaxConcurrency& amc,
return
true
;
return
true
;
}
}
static
AdaptiveMaxConcurrency
g_default_max_concurrency_of_method
=
0
;
static
AdaptiveMaxConcurrency
g_default_max_concurrency_of_method
(
0
)
;
int
Server
::
StartInternal
(
const
butil
::
ip_t
&
ip
,
int
Server
::
StartInternal
(
const
butil
::
ip_t
&
ip
,
const
PortRange
&
port_range
,
const
PortRange
&
port_range
,
...
@@ -710,7 +710,7 @@ int Server::StartInternal(const butil::ip_t& ip,
...
@@ -710,7 +710,7 @@ int Server::StartInternal(const butil::ip_t& ip,
if
(
st
!=
READY
)
{
if
(
st
!=
READY
)
{
if
(
st
==
RUNNING
)
{
if
(
st
==
RUNNING
)
{
LOG
(
ERROR
)
<<
"Server["
<<
version
()
<<
"] is already running on "
LOG
(
ERROR
)
<<
"Server["
<<
version
()
<<
"] is already running on "
<<
_listen_addr
;
<<
_listen_addr
;
}
else
{
}
else
{
LOG
(
ERROR
)
<<
"Can't start Server["
<<
version
()
LOG
(
ERROR
)
<<
"Can't start Server["
<<
version
()
<<
"] which is "
<<
status_str
(
status
());
<<
"] which is "
<<
status_str
(
status
());
...
@@ -780,7 +780,7 @@ int Server::StartInternal(const butil::ip_t& ip,
...
@@ -780,7 +780,7 @@ int Server::StartInternal(const butil::ip_t& ip,
_keytable_pool
=
NULL
;
_keytable_pool
=
NULL
;
return
-
1
;
return
-
1
;
}
}
if
(
_options
.
thread_local_data_factory
)
{
if
(
_options
.
thread_local_data_factory
)
{
_tl_options
.
thread_local_data_factory
=
_options
.
thread_local_data_factory
;
_tl_options
.
thread_local_data_factory
=
_options
.
thread_local_data_factory
;
if
(
bthread_key_create2
(
&
_tl_options
.
tls_key
,
DestroyServerTLS
,
if
(
bthread_key_create2
(
&
_tl_options
.
tls_key
,
DestroyServerTLS
,
...
@@ -872,7 +872,7 @@ int Server::StartInternal(const butil::ip_t& ip,
...
@@ -872,7 +872,7 @@ int Server::StartInternal(const butil::ip_t& ip,
}
}
_concurrency
=
0
;
_concurrency
=
0
;
if
(
_options
.
has_builtin_services
&&
if
(
_options
.
has_builtin_services
&&
_builtin_service_count
<=
0
&&
_builtin_service_count
<=
0
&&
AddBuiltinServices
()
!=
0
)
{
AddBuiltinServices
()
!=
0
)
{
...
@@ -926,7 +926,7 @@ int Server::StartInternal(const butil::ip_t& ip,
...
@@ -926,7 +926,7 @@ int Server::StartInternal(const butil::ip_t& ip,
it
->
second
.
status
->
SetConcurrencyLimiter
(
cl
);
it
->
second
.
status
->
SetConcurrencyLimiter
(
cl
);
}
}
}
}
// Create listening ports
// Create listening ports
if
(
port_range
.
min_port
>
port_range
.
max_port
)
{
if
(
port_range
.
min_port
>
port_range
.
max_port
)
{
LOG
(
ERROR
)
<<
"Invalid port_range=["
<<
port_range
.
min_port
<<
'-'
LOG
(
ERROR
)
<<
"Invalid port_range=["
<<
port_range
.
min_port
<<
'-'
...
@@ -1016,7 +1016,7 @@ int Server::StartInternal(const butil::ip_t& ip,
...
@@ -1016,7 +1016,7 @@ int Server::StartInternal(const butil::ip_t& ip,
}
}
sockfd
.
release
();
sockfd
.
release
();
}
}
PutPidFileIfNeeded
();
PutPidFileIfNeeded
();
// Launch _derivative_thread.
// Launch _derivative_thread.
...
@@ -1090,7 +1090,7 @@ int Server::Stop(int timeout_ms) {
...
@@ -1090,7 +1090,7 @@ int Server::Stop(int timeout_ms) {
return
-
1
;
return
-
1
;
}
}
_status
=
STOPPING
;
_status
=
STOPPING
;
LOG
(
INFO
)
<<
"Server["
<<
version
()
<<
"] is going to quit"
;
LOG
(
INFO
)
<<
"Server["
<<
version
()
<<
"] is going to quit"
;
if
(
_am
)
{
if
(
_am
)
{
...
@@ -1120,7 +1120,7 @@ int Server::Join() {
...
@@ -1120,7 +1120,7 @@ int Server::Join() {
// this pool in _derivative_thread which does not quit yet.
// this pool in _derivative_thread which does not quit yet.
_session_local_data_pool
->
Reset
(
NULL
);
_session_local_data_pool
->
Reset
(
NULL
);
}
}
if
(
_keytable_pool
)
{
if
(
_keytable_pool
)
{
// Destroy _keytable_pool to delete keytables inside. This has to be
// Destroy _keytable_pool to delete keytables inside. This has to be
// done here (before leaving Join) because it's legal for users to
// done here (before leaving Join) because it's legal for users to
...
@@ -1133,7 +1133,7 @@ int Server::Join() {
...
@@ -1133,7 +1133,7 @@ int Server::Join() {
// the leak is acceptable in most scenarios.
// the leak is acceptable in most scenarios.
_keytable_pool
=
NULL
;
_keytable_pool
=
NULL
;
}
}
// Delete tls_key as well since we don't need it anymore.
// Delete tls_key as well since we don't need it anymore.
if
(
_tl_options
.
tls_key
!=
INVALID_BTHREAD_KEY
)
{
if
(
_tl_options
.
tls_key
!=
INVALID_BTHREAD_KEY
)
{
CHECK_EQ
(
0
,
bthread_key_delete
(
_tl_options
.
tls_key
));
CHECK_EQ
(
0
,
bthread_key_delete
(
_tl_options
.
tls_key
));
...
@@ -1148,7 +1148,7 @@ int Server::Join() {
...
@@ -1148,7 +1148,7 @@ int Server::Join() {
bthread_join
(
_derivative_thread
,
NULL
);
bthread_join
(
_derivative_thread
,
NULL
);
_derivative_thread
=
INVALID_BTHREAD
;
_derivative_thread
=
INVALID_BTHREAD
;
}
}
g_running_server_count
.
fetch_sub
(
1
,
butil
::
memory_order_relaxed
);
g_running_server_count
.
fetch_sub
(
1
,
butil
::
memory_order_relaxed
);
_status
=
READY
;
_status
=
READY
;
return
0
;
return
0
;
...
@@ -1167,7 +1167,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
...
@@ -1167,7 +1167,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
<<
" does not have any method."
;
<<
" does not have any method."
;
return
-
1
;
return
-
1
;
}
}
if
(
InitializeOnce
()
!=
0
)
{
if
(
InitializeOnce
()
!=
0
)
{
LOG
(
ERROR
)
<<
"Fail to initialize Server["
<<
version
()
<<
']'
;
LOG
(
ERROR
)
<<
"Fail to initialize Server["
<<
version
()
<<
']'
;
return
-
1
;
return
-
1
;
...
@@ -1177,7 +1177,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
...
@@ -1177,7 +1177,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
<<
version
()
<<
"] which is "
<<
status_str
(
status
());
<<
version
()
<<
"] which is "
<<
status_str
(
status
());
return
-
1
;
return
-
1
;
}
}
if
(
_fullname_service_map
.
seek
(
sd
->
full_name
())
!=
NULL
)
{
if
(
_fullname_service_map
.
seek
(
sd
->
full_name
())
!=
NULL
)
{
LOG
(
ERROR
)
<<
"service="
<<
sd
->
full_name
()
<<
" already exists"
;
LOG
(
ERROR
)
<<
"service="
<<
sd
->
full_name
()
<<
" already exists"
;
return
-
1
;
return
-
1
;
...
@@ -1279,7 +1279,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
...
@@ -1279,7 +1279,7 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
RemoveService
(
service
);
RemoveService
(
service
);
return
-
1
;
return
-
1
;
}
}
const
std
::
string
&
svc_name
=
mappings
[
i
].
path
.
service_name
;
const
std
::
string
&
svc_name
=
mappings
[
i
].
path
.
service_name
;
if
(
svc_name
.
empty
())
{
if
(
svc_name
.
empty
())
{
if
(
_global_restful_map
==
NULL
)
{
if
(
_global_restful_map
==
NULL
)
{
...
@@ -1475,41 +1475,41 @@ void Server::RemoveMethodsOf(google::protobuf::Service* service) {
...
@@ -1475,41 +1475,41 @@ void Server::RemoveMethodsOf(google::protobuf::Service* service) {
}
}
}
}
int
Server
::
RemoveService
(
google
::
protobuf
::
Service
*
service
)
{
int
Server
::
RemoveService
(
google
::
protobuf
::
Service
*
service
)
{
if
(
NULL
==
service
)
{
if
(
NULL
==
service
)
{
LOG
(
ERROR
)
<<
"Parameter[service] is NULL"
;
LOG
(
ERROR
)
<<
"Parameter[service] is NULL"
;
return
-
1
;
return
-
1
;
}
}
if
(
status
()
!=
READY
)
{
if
(
status
()
!=
READY
)
{
LOG
(
ERROR
)
<<
"Can't remove service="
LOG
(
ERROR
)
<<
"Can't remove service="
<<
service
->
GetDescriptor
()
->
full_name
()
<<
" from Server["
<<
service
->
GetDescriptor
()
->
full_name
()
<<
" from Server["
<<
version
()
<<
"] which is "
<<
status_str
(
status
());
<<
version
()
<<
"] which is "
<<
status_str
(
status
());
return
-
1
;
return
-
1
;
}
}
const
google
::
protobuf
::
ServiceDescriptor
*
sd
=
service
->
GetDescriptor
();
const
google
::
protobuf
::
ServiceDescriptor
*
sd
=
service
->
GetDescriptor
();
ServiceProperty
*
ss
=
_fullname_service_map
.
seek
(
sd
->
full_name
());
ServiceProperty
*
ss
=
_fullname_service_map
.
seek
(
sd
->
full_name
());
if
(
ss
==
NULL
)
{
if
(
ss
==
NULL
)
{
RPC_VLOG
<<
"Fail to find service="
<<
sd
->
full_name
().
c_str
();
RPC_VLOG
<<
"Fail to find service="
<<
sd
->
full_name
().
c_str
();
return
-
1
;
return
-
1
;
}
}
RemoveMethodsOf
(
service
);
RemoveMethodsOf
(
service
);
if
(
ss
->
ownership
==
SERVER_OWNS_SERVICE
)
{
if
(
ss
->
ownership
==
SERVER_OWNS_SERVICE
)
{
delete
ss
->
service
;
delete
ss
->
service
;
}
}
const
bool
is_builtin_service
=
ss
->
is_builtin_service
;
const
bool
is_builtin_service
=
ss
->
is_builtin_service
;
_fullname_service_map
.
erase
(
sd
->
full_name
());
_fullname_service_map
.
erase
(
sd
->
full_name
());
_service_map
.
erase
(
sd
->
name
());
_service_map
.
erase
(
sd
->
name
());
// Note: ss is invalidated.
// Note: ss is invalidated.
if
(
is_builtin_service
)
{
if
(
is_builtin_service
)
{
--
_builtin_service_count
;
--
_builtin_service_count
;
}
else
{
}
else
{
if
(
_first_service
==
service
)
{
if
(
_first_service
==
service
)
{
_first_service
=
NULL
;
_first_service
=
NULL
;
}
}
}
}
return
0
;
return
0
;
}
}
void
Server
::
ClearServices
()
{
void
Server
::
ClearServices
()
{
...
@@ -1519,7 +1519,7 @@ void Server::ClearServices() {
...
@@ -1519,7 +1519,7 @@ void Server::ClearServices() {
<<
"] which is "
<<
status_str
(
status
());
<<
"] which is "
<<
status_str
(
status
());
return
;
return
;
}
}
for
(
ServiceMap
::
const_iterator
it
=
_fullname_service_map
.
begin
();
for
(
ServiceMap
::
const_iterator
it
=
_fullname_service_map
.
begin
();
it
!=
_fullname_service_map
.
end
();
++
it
)
{
it
!=
_fullname_service_map
.
end
();
++
it
)
{
if
(
it
->
second
.
ownership
==
SERVER_OWNS_SERVICE
)
{
if
(
it
->
second
.
ownership
==
SERVER_OWNS_SERVICE
)
{
delete
it
->
second
.
service
;
delete
it
->
second
.
service
;
...
@@ -1643,7 +1643,7 @@ void Server::PutPidFileIfNeeded() {
...
@@ -1643,7 +1643,7 @@ void Server::PutPidFileIfNeeded() {
for
(
size_t
pos
=
_options
.
pid_file
.
find
(
'/'
);
pos
!=
std
::
string
::
npos
;
for
(
size_t
pos
=
_options
.
pid_file
.
find
(
'/'
);
pos
!=
std
::
string
::
npos
;
pos
=
_options
.
pid_file
.
find
(
'/'
,
pos
+
1
))
{
pos
=
_options
.
pid_file
.
find
(
'/'
,
pos
+
1
))
{
std
::
string
dir_name
=
_options
.
pid_file
.
substr
(
0
,
pos
+
1
);
std
::
string
dir_name
=
_options
.
pid_file
.
substr
(
0
,
pos
+
1
);
int
rc
=
mkdir
(
dir_name
.
c_str
(),
int
rc
=
mkdir
(
dir_name
.
c_str
(),
S_IFDIR
|
S_IRUSR
|
S_IWUSR
|
S_IXUSR
|
S_IRGRP
);
S_IFDIR
|
S_IRUSR
|
S_IWUSR
|
S_IXUSR
|
S_IRGRP
);
if
(
rc
!=
0
&&
errno
!=
EEXIST
if
(
rc
!=
0
&&
errno
!=
EEXIST
#if defined(OS_MACOSX)
#if defined(OS_MACOSX)
...
@@ -1676,14 +1676,14 @@ void Server::RunUntilAskedToQuit() {
...
@@ -1676,14 +1676,14 @@ void Server::RunUntilAskedToQuit() {
}
}
void
*
thread_local_data
()
{
void
*
thread_local_data
()
{
const
Server
::
ThreadLocalOptions
*
tl_options
=
const
Server
::
ThreadLocalOptions
*
tl_options
=
static_cast
<
const
Server
::
ThreadLocalOptions
*>
(
bthread_get_assigned_data
());
static_cast
<
const
Server
::
ThreadLocalOptions
*>
(
bthread_get_assigned_data
());
if
(
tl_options
==
NULL
)
{
// not in server threads.
if
(
tl_options
==
NULL
)
{
// not in server threads.
return
NULL
;
return
NULL
;
}
}
if
(
BAIDU_UNLIKELY
(
tl_options
->
thread_local_data_factory
==
NULL
))
{
if
(
BAIDU_UNLIKELY
(
tl_options
->
thread_local_data_factory
==
NULL
))
{
CHECK
(
false
)
<<
"The protocol impl. may not set tls correctly"
;
CHECK
(
false
)
<<
"The protocol impl. may not set tls correctly"
;
return
NULL
;
return
NULL
;
}
}
void
*
data
=
bthread_getspecific
(
tl_options
->
tls_key
);
void
*
data
=
bthread_getspecific
(
tl_options
->
tls_key
);
if
(
data
==
NULL
)
{
if
(
data
==
NULL
)
{
...
@@ -1832,7 +1832,7 @@ int Server::AddCertificate(const CertInfo& cert) {
...
@@ -1832,7 +1832,7 @@ int Server::AddCertificate(const CertInfo& cert) {
SSL_CTX_set_tlsext_servername_callback
(
ssl_ctx
.
ctx
->
raw_ctx
,
SSLSwitchCTXByHostname
);
SSL_CTX_set_tlsext_servername_callback
(
ssl_ctx
.
ctx
->
raw_ctx
,
SSLSwitchCTXByHostname
);
SSL_CTX_set_tlsext_servername_arg
(
ssl_ctx
.
ctx
->
raw_ctx
,
this
);
SSL_CTX_set_tlsext_servername_arg
(
ssl_ctx
.
ctx
->
raw_ctx
,
this
);
#endif
#endif
if
(
!
_reload_cert_maps
.
Modify
(
AddCertMapping
,
ssl_ctx
))
{
if
(
!
_reload_cert_maps
.
Modify
(
AddCertMapping
,
ssl_ctx
))
{
LOG
(
ERROR
)
<<
"Fail to add mappings into _reload_cert_maps"
;
LOG
(
ERROR
)
<<
"Fail to add mappings into _reload_cert_maps"
;
return
-
1
;
return
-
1
;
...
@@ -1893,7 +1893,7 @@ int Server::RemoveCertificate(const CertInfo& cert) {
...
@@ -1893,7 +1893,7 @@ int Server::RemoveCertificate(const CertInfo& cert) {
LOG
(
ERROR
)
<<
"Fail to remove mappings from _reload_cert_maps"
;
LOG
(
ERROR
)
<<
"Fail to remove mappings from _reload_cert_maps"
;
return
-
1
;
return
-
1
;
}
}
_ssl_ctx_map
.
erase
(
cert_key
);
_ssl_ctx_map
.
erase
(
cert_key
);
return
0
;
return
0
;
}
}
...
@@ -1928,7 +1928,7 @@ int Server::ResetCertificates(const std::vector<CertInfo>& certs) {
...
@@ -1928,7 +1928,7 @@ int Server::ResetCertificates(const std::vector<CertInfo>& certs) {
return
-
1
;
return
-
1
;
}
}
// Add default certficiate into tmp_map first since it can't be reloaded
// Add default certficiate into tmp_map first since it can't be reloaded
std
::
string
default_cert_key
=
std
::
string
default_cert_key
=
_options
.
ssl_options
().
default_cert
.
certificate
_options
.
ssl_options
().
default_cert
.
certificate
+
_options
.
ssl_options
().
default_cert
.
private_key
;
+
_options
.
ssl_options
().
default_cert
.
private_key
;
...
@@ -1951,7 +1951,7 @@ int Server::ResetCertificates(const std::vector<CertInfo>& certs) {
...
@@ -1951,7 +1951,7 @@ int Server::ResetCertificates(const std::vector<CertInfo>& certs) {
if
(
ssl_ctx
.
ctx
->
raw_ctx
==
NULL
)
{
if
(
ssl_ctx
.
ctx
->
raw_ctx
==
NULL
)
{
return
-
1
;
return
-
1
;
}
}
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
SSL_CTX_set_tlsext_servername_callback
(
ssl_ctx
.
ctx
->
raw_ctx
,
SSLSwitchCTXByHostname
);
SSL_CTX_set_tlsext_servername_callback
(
ssl_ctx
.
ctx
->
raw_ctx
,
SSLSwitchCTXByHostname
);
SSL_CTX_set_tlsext_servername_arg
(
ssl_ctx
.
ctx
->
raw_ctx
,
this
);
SSL_CTX_set_tlsext_servername_arg
(
ssl_ctx
.
ctx
->
raw_ctx
,
this
);
...
@@ -2107,7 +2107,7 @@ int Server::SSLSwitchCTXByHostname(struct ssl_st* ssl,
...
@@ -2107,7 +2107,7 @@ int Server::SSLSwitchCTXByHostname(struct ssl_st* ssl,
if
(
server
->
_reload_cert_maps
.
Read
(
&
s
)
!=
0
)
{
if
(
server
->
_reload_cert_maps
.
Read
(
&
s
)
!=
0
)
{
return
SSL_TLSEXT_ERR_ALERT_FATAL
;
return
SSL_TLSEXT_ERR_ALERT_FATAL
;
}
}
std
::
shared_ptr
<
SocketSSLContext
>*
pctx
=
s
->
cert_map
.
seek
(
hostname
);
std
::
shared_ptr
<
SocketSSLContext
>*
pctx
=
s
->
cert_map
.
seek
(
hostname
);
if
(
pctx
==
NULL
)
{
if
(
pctx
==
NULL
)
{
const
char
*
dot
=
hostname
;
const
char
*
dot
=
hostname
;
...
@@ -2126,7 +2126,7 @@ int Server::SSLSwitchCTXByHostname(struct ssl_st* ssl,
...
@@ -2126,7 +2126,7 @@ int Server::SSLSwitchCTXByHostname(struct ssl_st* ssl,
return
SSL_TLSEXT_ERR_ALERT_FATAL
;
return
SSL_TLSEXT_ERR_ALERT_FATAL
;
}
}
// Use default SSL_CTX which is the current one
// Use default SSL_CTX which is the current one
return
SSL_TLSEXT_ERR_OK
;
return
SSL_TLSEXT_ERR_OK
;
}
}
// Switch SSL_CTX to the one with correct hostname
// Switch SSL_CTX to the one with correct hostname
...
...
test/brpc_adaptive_class_unittest.cpp
0 → 100755
View file @
a13730a4
// brpc - A framework to host and access services throughout Baidu.
// Copyright (c) 2014 Baidu, Inc.
// Date: 2019/04/16 23:41:04
#include <gtest/gtest.h>
#include "brpc/adaptive_max_concurrency.h"
#include "brpc/adaptive_protocol_type.h"
#include "brpc/adaptive_connection_type.h"
const
std
::
string
kAutoCL
=
"aUto"
;
const
std
::
string
kHttp
=
"hTTp"
;
const
std
::
string
kPooled
=
"PoOled"
;
TEST
(
AdaptiveMaxConcurrencyTest
,
ShouldConvertCorrectly
)
{
brpc
::
AdaptiveMaxConcurrency
amc
(
0
);
EXPECT_EQ
(
brpc
::
AdaptiveMaxConcurrency
::
UNLIMITED
(),
amc
.
type
());
EXPECT_EQ
(
brpc
::
AdaptiveMaxConcurrency
::
UNLIMITED
(),
amc
.
value
());
EXPECT_EQ
(
0
,
int
(
amc
));
EXPECT_TRUE
(
amc
==
brpc
::
AdaptiveMaxConcurrency
::
UNLIMITED
());
amc
=
10
;
EXPECT_EQ
(
brpc
::
AdaptiveMaxConcurrency
::
CONSTANT
(),
amc
.
type
());
EXPECT_EQ
(
"10"
,
amc
.
value
());
EXPECT_EQ
(
10
,
int
(
amc
));
EXPECT_EQ
(
amc
,
"10"
);
amc
=
kAutoCL
;
EXPECT_EQ
(
kAutoCL
,
amc
.
type
());
EXPECT_EQ
(
kAutoCL
,
amc
.
value
());
EXPECT_EQ
(
int
(
amc
),
-
1
);
EXPECT_TRUE
(
amc
==
"auto"
);
}
TEST
(
AdaptiveProtocolType
,
ShouldConvertCorrectly
)
{
brpc
::
AdaptiveProtocolType
apt
;
apt
=
kHttp
;
EXPECT_EQ
(
apt
,
brpc
::
ProtocolType
::
PROTOCOL_HTTP
);
apt
=
brpc
::
ProtocolType
::
PROTOCOL_HTTP
;
EXPECT_EQ
(
apt
,
brpc
::
ProtocolType
::
PROTOCOL_HTTP
);
}
TEST
(
AdaptiveConnectionTypeTest
,
ShouldConvertCorrectly
)
{
brpc
::
AdaptiveConnectionType
act
;
act
=
brpc
::
ConnectionType
::
CONNECTION_TYPE_POOLED
;
EXPECT_EQ
(
act
,
brpc
::
ConnectionType
::
CONNECTION_TYPE_POOLED
);
act
=
kPooled
;
EXPECT_EQ
(
act
,
brpc
::
ConnectionType
::
CONNECTION_TYPE_POOLED
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment