You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: client.go
    path of file: ./repos/bk-cmdb/src/source_controller/cacheservice/cache/topology
    
    the code of the file until where you have to start completion: /*
 * Tencent is pleased to support the open source community by making 蓝鲸 avai
    
func (t *Topology) GetBizTopology(kit *rest.Kit, biz int64) (*string, error) {
	// read from secondary in mongodb cluster.
	kit.Ctx = util.SetDBReadPreference(kit.Ctx, common.SecondaryPreferredMode)

	topology, err := t.briefBizKey.getTopology(kit.Ctx, biz)
	if err == nil {
		if len(*topology) != 0 {
			// get data from cache success
			return topology, nil
		}
		// get from db directly.
	}

	blog.Errorf("get biz: %d topology from cache failed, get from db now, err: %v, rid: %s", biz, err, kit.Rid)

	// do not get biz topology from cache, get it from db directly.
	topo, err := t.genBusinessTopology(kit.Ctx, biz)
	if err != nil {
		blog.Errorf("generate biz: %d topology from db failed, err: %v, rid: %s", biz, err, kit.Rid)
		return nil, err
	}

	// update it to cache directly.
	if err := t.briefBizKey.updateTopology(kit.Ctx, topo); err != nil {
		blog.Errorf("refresh biz: %d topology cache failed, err: %v, rid: %s", biz, err, kit.Rid)
		// do not return error
	}

	dat, err := json.Marshal(topo)
	if err != nil {
		blog.Errorf("marshal biz topology failed, err: %v, rid: %s", err, kit.Rid)
		return nil, err
	}

	topoStr := string(dat)
	return &topoStr, nil
}