Esempio n. 1
0
func readCompletedEdges(ctx context.Context, edges *table.KVProto, outs ...chan<- *srvpb.Edge) error {
	defer func() {
		for _, out := range outs {
			close(out)
		}
	}()

	snapshot := edges.NewSnapshot()
	defer snapshot.Close()
	it, err := edges.ScanPrefix(nil, &keyvalue.Options{
		LargeRead: true,
		Snapshot:  snapshot,
	})
	if err != nil {
		return err
	}
	defer it.Close()

	for {
		_, v, err := it.Next()
		if err == io.EOF {
			break
		} else if err != nil {
			return fmt.Errorf("error scanning edges table: %v", err)
		}

		var e srvpb.Edge
		if err := proto.Unmarshal(v, &e); err != nil {
			return fmt.Errorf("invalid edge table value: %v", err)
		}

		for _, out := range outs {
			out <- &e
		}
	}

	return nil
}