| 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] |