meta.h 2.5 KB
Newer Older
Y
yangrui07 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <atomic>
#include <string>
#include <unordered_map>
#include <vector>

#include "brpc/channel.h"
#include "brpc/parallel_channel.h"
#include "butil/third_party/rapidjson/document.h"
#include "bvar/bvar.h"

namespace rec {
namespace mcube {

struct MetaInfo {
  MetaInfo() : dict_name(""), shard_num(0), dup_num(0) {}
  ~MetaInfo() {
    for (size_t i = 0; i != cube_conn.size(); ++i) {
      if (cube_conn[i] != NULL) {
        delete cube_conn[i];
        cube_conn[i] = NULL;
      }
    }
    cube_conn.clear();
  }

  std::string dict_name;
  int shard_num;
  int dup_num;
  std::vector<::brpc::Channel*> cube_conn;
  bvar::Adder<uint64_t> cube_request_num;
  bvar::Adder<uint64_t> cube_rpcfail_num;
};

class Meta {
 public:
  static Meta* instance();

 public:
  ~Meta();

  int init(const char* conf_file);

  int destroy();

  MetaInfo* get_meta(const std::string& dict_name);

  const std::vector<const MetaInfo*> metas();

  void reset_bvar(const std::string& dict_name);

 private:
  MetaInfo* create_meta(const BUTIL_RAPIDJSON_NAMESPACE::Value& meta_config);

  int create_meta_from_ipport(MetaInfo* meta,
                              const BUTIL_RAPIDJSON_NAMESPACE::Value& nodes,
                              int timeout,
                              int retry,
                              int backup_request);

  int create_meta_from_ipport_list(
      MetaInfo* meta,
      const BUTIL_RAPIDJSON_NAMESPACE::Value& nodes,
      int timeout,
      int retry,
      int backup_request,
      const std::string& load_balancer);

  int create_meta_from_ipport_parallel(
      MetaInfo* meta,
      const BUTIL_RAPIDJSON_NAMESPACE::Value& nodes,
      int timeout,
      int retry,
      int backup_request);

 private:
  Meta() {}
  Meta(const Meta&) {}

 private:
  std::unordered_map<std::string, MetaInfo*> _metas;
};  // class Meta

}  // namespace mcube
}  // namespace rec