func (p *protocolV2) TOUCH(client *nsqd.ClientV2, params [][]byte) ([]byte, error) { state := atomic.LoadInt32(&client.State) if state != stateSubscribed && state != stateClosing { nsqd.NsqLogger().LogWarningf("[%s] command in wrong state: %v", client, state) return nil, protocol.NewFatalClientErr(nil, E_INVALID, "cannot TOUCH in current state") } if len(params) < 2 { return nil, protocol.NewFatalClientErr(nil, E_INVALID, "TOUCH insufficient number of params") } id, err := getFullMessageID(params[1]) if err != nil { return nil, protocol.NewFatalClientErr(nil, E_INVALID, err.Error()) } client.LockRead() msgTimeout := client.MsgTimeout client.UnlockRead() if client.Channel == nil { return nil, protocol.NewFatalClientErr(nil, E_INVALID, "No channel") } err = client.Channel.TouchMessage(client.ID, nsqd.GetMessageIDFromFullMsgID(*id), msgTimeout) if err != nil { return nil, protocol.NewClientErr(err, "E_TOUCH_FAILED", fmt.Sprintf("TOUCH %v failed %s", *id, err.Error())) } return nil, nil }