func (h Handler) Touch(cmd common.TouchRequest) error { // read metadata // for 0 to metadata.numChunks // touch item // touch metadata // We get the metadata and not GAT it in case the key is *just* about to expire. // In this case if a chunk expires during the operation, we fail the touch instead of // leaving a key in an inconsistent state where the metadata lives on and the data is // incomplete. The metadata is touched last to make sure the data exists first. metaKey, metaData, err := getMetadata(h.rw, cmd.Key) if err != nil { if err == common.ErrKeyNotFound { metrics.IncCounter(MetricCmdTouchMissesMeta) } return err } // First touch all the chunks as a batch for i := 0; i < int(metaData.NumChunks); i++ { chunkKey := chunkKey(cmd.Key, i) if err := binprot.WriteTouchCmd(h.rw.Writer, chunkKey, cmd.Exptime); err != nil { return err } } if err := h.rw.Flush(); err != nil { return err } miss := false for i := 0; i < int(metaData.NumChunks); i++ { if err := simpleCmdLocal(h.rw, false); err != nil { if err == common.ErrKeyNotFound && !miss { metrics.IncCounter(MetricCmdTouchMissesChunk) miss = true } } } if miss { return common.ErrKeyNotFound } // Then touch the metadata if err := binprot.WriteTouchCmd(h.rw.Writer, metaKey, cmd.Exptime); err != nil { return err } if err := simpleCmdLocal(h.rw, true); err != nil { if err == common.ErrKeyNotFound { metrics.IncCounter(MetricCmdTouchMissesMeta) } return err } return nil }
func (h Handler) Touch(cmd common.TouchRequest) error { // read metadata // for 0 to metadata.numChunks // touch item // touch metadata metaKey, metaData, err := getMetadata(h.rw, cmd.Key) if err != nil { if err == common.ErrKeyNotFound { //fmt.Println("Touch miss because of missing metadata. Key:", cmd.Key) return err } return err } // First touch all the chunks for i := 0; i < int(metaData.NumChunks); i++ { chunkKey := chunkKey(cmd.Key, i) if err := binprot.WriteTouchCmd(h.rw.Writer, chunkKey, cmd.Exptime); err != nil { return err } if err := simpleCmdLocal(h.rw); err != nil { return err } } // Then touch the metadata if err := binprot.WriteTouchCmd(h.rw.Writer, metaKey, cmd.Exptime); err != nil { return err } if err := simpleCmdLocal(h.rw); err != nil { return err } return nil }
func (h Handler) Touch(cmd common.TouchRequest) error { if err := binprot.WriteTouchCmd(h.rw.Writer, cmd.Key, cmd.Exptime); err != nil { return err } return simpleCmdLocal(h.rw) }