code: func (db *DB) get(mode ModeGet, addr chunk.Address) (out shed.Item, err error) {
  	item := addressToItem(addr)
  
  	out, err = db.retrievalDataIndex.Get(item)
  	if err != nil {
  		return out, err
  	}
  	switch mode {
  	// update the access timestamp and gc index
  	case ModeGetRequest:
  		if db.updateGCSem != nil {
  			// wait before creating new goroutines
  			// if updateGCSem buffer id full
  			db.updateGCSem <- struct{}{}
  		}
  		db.updateGCWG.Add(1)
  		go func() {
  			defer db.updateGCWG.Done()
  			if db.updateGCSem != nil {
  				// free a spot in updateGCSem buffer
  				// for a new goroutine
  				defer func() { <-db.updateGCSem }()
  			}
  			err := db.updateGC(out)
  			if err != nil {
  				log.Error("localstore update gc", "err", err)
  			}
  			// if gc update hook is defined, call it
  			if testHookUpdateGC != nil {
  				testHookUpdateGC()
  			}
  		}()
  
  	// no updates to indexes
  	case ModeGetSync:
  	default:
  		return out, ErrInvalidMode
  	}
  	return out, nil
  }
docs: // get returns Item from the retrieval index
  // and updates other indexes.