* * @brief: 再调用这个函数的时候开始服务, * @return: 三种返回类型:路径解析错误;connectAll连接出现问题;成功 */
()
| 248 | * @return: 三种返回类型:路径解析错误;connectAll连接出现问题;成功 |
| 249 | */ |
| 250 | func (cfg *ServerConfig) StartServer() error { |
| 251 | var flag bool = false |
| 252 | if len(ServerListeners) == 1 { |
| 253 | // 正确读取配置文件;这里注意,checkJsonParser是检查范围和字符串的格式,解析的过程会把int转string之间的错误解析出来 |
| 254 | flag = ServerListeners[0]("Config/server_config.json", cfg) |
| 255 | if !flag { // 文件打开失败 |
| 256 | log.Printf("Open config File Error!") |
| 257 | return ErrorInStartServer(parser_error) |
| 258 | } |
| 259 | |
| 260 | // 从json中取出的字段格式错误 |
| 261 | if ParserErr := cfg.checkJsonParser(); ParserErr != nil { |
| 262 | log.Println(ParserErr.Error()) |
| 263 | return ErrorInStartServer(parser_error) |
| 264 | } |
| 265 | |
| 266 | // 填充cfg.Persister |
| 267 | cfg.fillPersister() |
| 268 | |
| 269 | } else { |
| 270 | log.Printf("ERROR : [%d] ServerListeners Error!\n", cfg.me) |
| 271 | // 这种情况只有在调用服务没有启动read_server_config.go的init函数时会出现 |
| 272 | return ErrorInStartServer(Listener_error) |
| 273 | } |
| 274 | |
| 275 | // 这里初始化的原因是要让注册的结构体是后面运行的结构体 |
| 276 | cfg.kvserver = BaseServer.StartKVServerInit(cfg.me, cfg.persister, cfg.MaxRaftState, transformChubbyGomap2uint32(cfg.ChubbyGoMapStrategy)) |
| 277 | cfg.kvserver.StartRaftServer(&cfg.ServersAddress) |
| 278 | |
| 279 | cfg.serverRegisterFun() |
| 280 | if err := cfg.connectAll(); err != nil { |
| 281 | log.Println(err.Error()) |
| 282 | return ErrorInStartServer(connect_error) |
| 283 | } |
| 284 | cfg.kvserver.StartKVServer(cfg.peers) // 启动服务 |
| 285 | log.Printf("INFO : [%d] The connection is successful and the service has started successfully!\n", cfg.me) |
| 286 | return nil |
| 287 | } |
| 288 | |
| 289 | /* |
| 290 | * @brief: 返回一个Config结构体,用于开始一个服务 |
no test coverage detected