| 67 | } |
| 68 | |
| 69 | func ReadUserIndex(ctx context.Context, bkt objstore.InstrumentedBucket, logger log.Logger) (*UserIndex, error) { |
| 70 | // Get the user index. |
| 71 | reader, err := bkt.WithExpectedErrs(bkt.IsObjNotFoundErr).Get(ctx, UserIndexCompressedFilename) |
| 72 | if err != nil { |
| 73 | if bkt.IsObjNotFoundErr(err) { |
| 74 | return nil, ErrIndexNotFound |
| 75 | } |
| 76 | |
| 77 | return nil, errors.Wrap(err, "read user index") |
| 78 | } |
| 79 | defer runutil.CloseWithLogOnErr(logger, reader, "close user index reader") |
| 80 | |
| 81 | // Read all the content. |
| 82 | gzipReader, err := gzip.NewReader(reader) |
| 83 | if err != nil { |
| 84 | return nil, ErrIndexCorrupted |
| 85 | } |
| 86 | defer runutil.CloseWithLogOnErr(logger, gzipReader, "close user index gzip reader") |
| 87 | |
| 88 | // Deserialize it. |
| 89 | index := &UserIndex{} |
| 90 | d := json.NewDecoder(gzipReader) |
| 91 | if err := d.Decode(index); err != nil { |
| 92 | return nil, ErrIndexCorrupted |
| 93 | } |
| 94 | |
| 95 | return index, nil |
| 96 | } |