in step5/src/server/main.go [173:231]
func readFiles(ctx context.Context, bucketName, prefix string) ([]string, error) {
type resp struct {
s string
err error
}
// step4: add an extra span
span := trace.SpanFromContext(ctx)
span.SetName("server.readFiles")
span.SetAttributes(attribute.Key("bucketname").String(bucketName))
defer span.End()
// step4: end add span
client, err := storage.NewClient(ctx, option.WithoutAuthentication())
if err != nil {
return []string{}, fmt.Errorf("failed to create storage client: %s", err)
}
defer client.Close()
bucket := client.Bucket(bucketName)
var paths []string
it := bucket.Objects(ctx, &storage.Query{Prefix: bucketPrefix})
for {
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return []string{}, fmt.Errorf("failed to iterate over files in %s starting with %s: %v", bucketName, prefix, err)
}
if attrs.Name != "" {
paths = append(paths, attrs.Name)
}
}
resps := make(chan resp)
for _, path := range paths {
go func(path string) {
obj := bucket.Object(path)
r, err := obj.NewReader(ctx)
if err != nil {
resps <- resp{"", err}
}
defer r.Close()
data, err := ioutil.ReadAll(r)
resps <- resp{string(data), err}
}(path)
}
ret := make([]string, len(paths))
for i := 0; i < len(paths); i++ {
r := <-resps
if r.err != nil {
err = r.err
}
ret[i] = r.s
}
return ret, err
}