code: func (c *Connector) read(
  	ctx context.Context,
  	ei *dosa.EntityInfo,
  	keys map[string]dosa.FieldValue,
  	source map[string]dosa.FieldValue,
  	sourceErr error,
  	methodName string,
  ) (values map[string]dosa.FieldValue, err error) {
  	if dosa.ErrorIsNotFound(sourceErr) {
  		return source, sourceErr
  	}
  
  	ckey := createCacheKey(ei, keys)
  	value, err := c.getValueFromFallback(ctx, ei, ckey)
  	c.logFallback(methodName, ei.Def.Name, err)
  	if err != nil {
  		return source, sourceErr
  	}
  	result := map[string]dosa.FieldValue{}
  	err = c.encoder.Decode(value, &result)
  	if err != nil {
  		return source, sourceErr
  	}
  	return rawRowAsPointers(ei, result), err
  }
docs: // if source of truth fails, try the fallback. If the fallback fails, return the original error