// get() retrieves multiple child entries from the metakv and weaves // the results back into a composite nodeDefs. get() must be invoked // with c.m.Lock()'ed. func (a *cfgMetaKvNodeDefsSplitHandler) get( c *CfgMetaKv, key string, cas uint64) ([]byte, uint64, error) { m, err := metakv.ListAllChildren(c.keyToPath(key) + "/") if err != nil { return nil, 0, err } rv := &NodeDefs{NodeDefs: make(map[string]*NodeDef)} uuids := []string{} for _, v := range m { var childNodeDefs NodeDefs err = json.Unmarshal(v.Value, &childNodeDefs) if err != nil { return nil, 0, err } for k1, v1 := range childNodeDefs.NodeDefs { rv.NodeDefs[k1] = v1 } if rv.ImplVersion == "" || VersionGTE(childNodeDefs.ImplVersion, rv.ImplVersion) { rv.ImplVersion = childNodeDefs.ImplVersion } uuids = append(uuids, childNodeDefs.UUID) } rv.UUID = checkSumUUIDs(uuids) if rv.ImplVersion == "" { rv.ImplVersion = VERSION } data, err := json.Marshal(rv) if err != nil { return nil, 0, err } casResult := c.lastSplitCAS + 1 c.lastSplitCAS = casResult c.splitEntries[key] = CfgMetaKvEntry{ cas: casResult, data: data, } return data, casResult, nil }
// for testing func (c *CfgMetaKv) listChildPaths(key string) ([]string, error) { g := []string{} if cfgMetaKvAdvancedKeys[key] != nil { m, err := metakv.ListAllChildren(c.keyToPath(key) + "/") if err != nil { return nil, err } for _, v := range m { g = append(g, v.Path) } } return g, nil }