def METHOD_NAME(self, msg_params):
    sender_id = msg_params.get(MyMessage.MSG_ARG_KEY_SENDER)
    model_params = msg_params.get(MyMessage.MSG_ARG_KEY_MODEL_PARAMS)
    local_sample_number = msg_params.get(MyMessage.MSG_ARG_KEY_NUM_SAMPLES)
    client_runtime_info = msg_params.get(MyMessage.MSG_ARG_KEY_CLIENT_RUNTIME_INFO)
    self.aggregator.record_client_runtime(sender_id - 1, client_runtime_info)
    # start the next round
    self.round_idx += 1
    self.aggregator.add_local_trained_result(
        sender_id - 1, model_params, local_sample_number,
        current_round=self.round_idx, client_round=self.client_round_dict[sender_id - 1]
    )
    self.aggregator.test_on_server_for_all_clients(self.round_idx)
    if self.round_idx == self.round_num:
        # post_complete_message_to_sweep_process(self.args)
        self.finish()
        print("here")
        return
    if self.is_preprocessed:
        if self.preprocessed_client_lists is None:
            # sampling has already been done in data preprocessor
            client_indexes = [self.round_idx] * self.args.client_num_per_round
        else:
            client_indexes = self.preprocessed_client_lists[self.round_idx]
    else:
        # sampling clients
        client_indexes = self.aggregator.client_sampling(
            self.round_idx,
            self.args.client_num_in_total,
            self.args.client_num_per_round,
        )
    global_model_params = self.aggregator.get_global_model_params()
    print("indexes of clients: " + str(client_indexes))
    print("size = %d" % self.size)
    self.send_message_sync_model_to_client(
        sender_id, global_model_params, 
        client_indexes
    )
    self.client_round_dict[client_indexes[0]] = self.round_idx