func (l *L1L2BatchOrca) Add(req common.SetRequest) error { metrics.IncCounter(MetricCmdAdd) //log.Println("add", string(req.Key)) // Add in L2 first, since it has the larger state metrics.IncCounter(MetricCmdAddL2) err := l.l2.Add(req) if err != nil { // A key already existing is not an error per se, it's a part of the // functionality of the add command to respond with a "not stored" in // the form of a ErrKeyExists. Hence no error metrics. if err == common.ErrKeyExists { metrics.IncCounter(MetricCmdAddNotStoredL2) metrics.IncCounter(MetricCmdAddNotStored) return err } // otherwise we have a real error on our hands metrics.IncCounter(MetricCmdAddErrorsL2) metrics.IncCounter(MetricCmdAddErrors) return err } metrics.IncCounter(MetricCmdAddStoredL2) // Replace the entry in L1. req.Quiet = false metrics.IncCounter(MetricCmdAddReplaceL1) if err := l.l1.Replace(req); err != nil { if err == common.ErrKeyNotFound { // For a replace not stored in L1, there's no problem. // There is no hot data to replace metrics.IncCounter(MetricCmdAddReplaceNotStoredL1) } else { metrics.IncCounter(MetricCmdAddReplaceErrorsL1) metrics.IncCounter(MetricCmdAddErrors) return err } } else { metrics.IncCounter(MetricCmdAddReplaceStoredL1) } metrics.IncCounter(MetricCmdAddStored) return l.res.Add(req.Opaque, req.Quiet) }
func (l *L1L2BatchOrca) Set(req common.SetRequest) error { metrics.IncCounter(MetricCmdSet) //log.Println("set", string(req.Key)) // Try L2 first metrics.IncCounter(MetricCmdSetL2) err := l.l2.Set(req) // If we fail to set in L2, don't do anything in L1 if err != nil { metrics.IncCounter(MetricCmdSetErrorsL2) metrics.IncCounter(MetricCmdSetErrors) return err } metrics.IncCounter(MetricCmdSetSuccessL2) // Replace the entry in L1. req.Quiet = false metrics.IncCounter(MetricCmdSetReplaceL1) if err := l.l1.Replace(req); err != nil { if err == common.ErrKeyNotFound { // For a replace not stored in L1, there's no problem. // There is no hot data to replace metrics.IncCounter(MetricCmdSetReplaceNotStoredL1) } else { metrics.IncCounter(MetricCmdSetReplaceErrorsL1) metrics.IncCounter(MetricCmdSetErrors) return err } } else { metrics.IncCounter(MetricCmdSetReplaceStoredL1) } metrics.IncCounter(MetricCmdSetSuccess) return l.res.Set(req.Opaque, req.Quiet) }