| 145 | } |
| 146 | |
| 147 | func (c *Memcached) fetch(ctx context.Context, keys []string) (found []string, bufs [][]byte, missed []string) { |
| 148 | var items map[string]*memcache.Item |
| 149 | const method = "Memcache.GetMulti" |
| 150 | err := instr.CollectedRequest(ctx, method, c.requestDuration, memcacheStatusCode, func(innerCtx context.Context) error { |
| 151 | log, _ := spanlogger.New(innerCtx, method) |
| 152 | defer log.Finish() |
| 153 | log.LogFields(otlog.Int("keys requested", len(keys))) |
| 154 | |
| 155 | var err error |
| 156 | items, err = c.memcache.GetMulti(keys) |
| 157 | |
| 158 | log.LogFields(otlog.Int("keys found", len(items))) |
| 159 | |
| 160 | // Memcached returns partial results even on error. |
| 161 | if err != nil { |
| 162 | log.Error(err) |
| 163 | level.Error(log).Log("msg", "Failed to get keys from memcached", "err", err) |
| 164 | } |
| 165 | return err |
| 166 | }) |
| 167 | |
| 168 | if err != nil { |
| 169 | return found, bufs, keys |
| 170 | } |
| 171 | |
| 172 | for _, key := range keys { |
| 173 | item, ok := items[key] |
| 174 | if ok { |
| 175 | found = append(found, key) |
| 176 | bufs = append(bufs, item.Value) |
| 177 | } else { |
| 178 | missed = append(missed, key) |
| 179 | } |
| 180 | } |
| 181 | return |
| 182 | } |
| 183 | |
| 184 | func (c *Memcached) fetchKeysBatched(ctx context.Context, keys []string) (found []string, bufs [][]byte, missed []string) { |
| 185 | resultsCh := make(chan *result) |