// GetTableDescriptor retrieves a table descriptor directly from the KV layer. func GetTableDescriptor(kvDB *client.DB, database string, table string) *TableDescriptor { dbNameKey := MakeNameMetadataKey(keys.RootNamespaceID, database) gr, err := kvDB.Get(dbNameKey) if err != nil { panic(err) } if !gr.Exists() { panic("database missing") } dbDescID := ID(gr.ValueInt()) tableNameKey := MakeNameMetadataKey(dbDescID, table) gr, err = kvDB.Get(tableNameKey) if err != nil { panic(err) } if !gr.Exists() { panic("table missing") } descKey := MakeDescMetadataKey(ID(gr.ValueInt())) desc := &Descriptor{} if err := kvDB.GetProto(descKey, desc); err != nil { panic("proto missing") } return desc.GetTable() }
func countRangeReplicas(db *client.DB) (int, error) { desc := &roachpb.RangeDescriptor{} if err := db.GetProto(keys.RangeDescriptorKey(roachpb.RKeyMin), desc); err != nil { return 0, err } return len(desc.Replicas), nil }
// loadTree loads the tree root and all of its nodes. It puts all of the nodes // into a map. func loadTree(t *testing.T, db *client.DB) (storage.RangeTree, map[string]storage.RangeTreeNode) { var tree storage.RangeTree if err := db.GetProto(keys.RangeTreeRoot, &tree); err != nil { t.Fatal(err) } nodes := make(map[string]storage.RangeTreeNode) if tree.RootKey != nil { loadNodes(t, db, tree.RootKey, nodes) } return tree, nodes }
// loadNodes fetches a node and recursively all of its children. func loadNodes(t *testing.T, db *client.DB, key roachpb.RKey, nodes map[string]storage.RangeTreeNode) { var node storage.RangeTreeNode if err := db.GetProto(keys.RangeTreeNodeKey(key), &node); err != nil { t.Fatal(err) } nodes[node.Key.String()] = node if node.LeftKey != nil { loadNodes(t, db, node.LeftKey, nodes) } if node.RightKey != nil { loadNodes(t, db, node.RightKey, nodes) } }