// PutResponse writes a response and an error associated with it to the // cache for the specified cmdID. func (rc *ResponseCache) PutResponse(e engine.Engine, cmdID proto.ClientCmdID, replyWithErr proto.ResponseWithError) error { // Do nothing if command ID is empty. if cmdID.IsEmpty() { return nil } // Write the response value to the engine. if rc.shouldCacheResponse(replyWithErr) { // Write the error into the reply before caching. header := replyWithErr.Reply.Header() header.SetGoError(replyWithErr.Err) // Be sure to clear it when you're done! defer func() { header.Error = nil }() key := keys.ResponseCacheKey(rc.raftID, &cmdID) var rwResp proto.ReadWriteCmdResponse if !rwResp.SetValue(replyWithErr.Reply) { panic(fmt.Sprintf("response %T not supported by response cache", replyWithErr.Reply)) } return engine.MVCCPutProto(e, nil, key, proto.ZeroTimestamp, nil, &rwResp) } return nil }