blob: 8d8a37ec0e71a0bfefba2ac27f1e8323a2bab5a2 [file] [log] [blame]
diff --git a/src/brpc/server.cpp b/src/brpc/server.cpp
index 2087cbcf..7aede561 100644
--- a/src/brpc/server.cpp
+++ b/src/brpc/server.cpp
@@ -1267,6 +1267,14 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
// defined `option (idl_support) = true' or not.
const bool is_idl_support = sd->file()->options().GetExtension(idl_support);
+ std::string secondary_full_name;
+ if (!svc_opt.secondary_package_name.empty()) {
+ secondary_full_name.reserve(svc_opt.secondary_package_name.size() + 1 + sd->name().size());
+ secondary_full_name.append(svc_opt.secondary_package_name);
+ secondary_full_name.push_back('.');
+ secondary_full_name.append(sd->name());
+ }
+
Tabbed* tabbed = dynamic_cast<Tabbed*>(service);
for (int i = 0; i < sd->method_count(); ++i) {
const google::protobuf::MethodDescriptor* md = sd->method(i);
@@ -1282,6 +1290,14 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
mp.method = md;
mp.status = new MethodStatus;
_method_map[md->full_name()] = mp;
+ if (!secondary_full_name.empty()) {
+ std::string secondary_method_name;
+ secondary_method_name.reserve(secondary_full_name.size() + 1 + md->name().size());
+ secondary_method_name.append(secondary_full_name);
+ secondary_method_name.push_back('.');
+ secondary_method_name.append(md->name());
+ _method_map[secondary_method_name] = mp;
+ }
if (is_idl_support && sd->name() != sd->full_name()/*has ns*/) {
MethodProperty mp2 = mp;
mp2.own_method_status = false;
@@ -1306,6 +1322,9 @@ int Server::AddServiceInternal(google::protobuf::Service* service,
is_builtin_service, svc_opt.ownership, service, NULL };
_fullname_service_map[sd->full_name()] = ss;
_service_map[sd->name()] = ss;
+ if (!secondary_full_name.empty()) {
+ _fullname_service_map[secondary_full_name] = ss;
+ }
if (is_builtin_service) {
++_builtin_service_count;
} else {
diff --git a/src/brpc/server.h b/src/brpc/server.h
index 0974ce12..32c7e5a3 100644
--- a/src/brpc/server.h
+++ b/src/brpc/server.h
@@ -309,6 +309,15 @@ struct ServiceOptions {
// decode json array to protobuf message which contains a single repeated field.
// Default: false.
bool pb_single_repeated_to_array;
+
+ // The secondary package name.
+ //
+ // If this option is non-empty, service and methods will be used to register
+ // service and methods, and either package name can be used to locate service
+ // and methods.
+ //
+ // This option is useful when the service package name has been changed.
+ std::string secondary_package_name;
};
// Represent ports inside [min_port, max_port]