func (d *dataAccess) save(s *models.IncidentState, isImport bool) error { defer collect.StartTimer("redis", opentsdb.TagSet{"op": "UpdateIncident"})() conn := d.GetConnection() defer conn.Close() isNew := false //if id is still zero, assign new id. if s.Id == 0 { id, err := redis.Int64(conn.Do("INCR", "maxIncidentId")) if err != nil { return slog.Wrap(err) } s.Id = id isNew = true } else if isImport { max, err := redis.Int64(conn.Do("GET", "maxIncidentId")) if err != nil { max = 0 } if max < s.Id { if _, err = conn.Do("SET", "maxIncidentId", s.Id); err != nil { return slog.Wrap(err) } } isNew = true } return d.transact(conn, func() error { if isNew { // add to list for alert key if _, err := conn.Do("LPUSH", incidentsForAlertKeyKey(s.AlertKey), s.Id); err != nil { return slog.Wrap(err) } dat := fmt.Sprintf("%d:%d:%s", s.Id, s.Start.UTC().Unix(), s.AlertKey) if _, err := conn.Do("LPUSH", "allIncidents", dat); err != nil { return slog.Wrap(err) } } // store the incident json data, err := json.Marshal(s) if err != nil { return slog.Wrap(err) } _, err = conn.Do("SET", incidentStateKey(s.Id), data) addRem := func(b bool) string { if b { return "SADD" } return "SREM" } // appropriately add or remove it from the "open" set if s.Open { if _, err = conn.Do("HSET", statesOpenIncidentsKey, s.AlertKey, s.Id); err != nil { return slog.Wrap(err) } } else { if _, err = conn.Do("HDEL", statesOpenIncidentsKey, s.AlertKey); err != nil { return slog.Wrap(err) } } //appropriately add or remove from unknown and uneval sets if _, err = conn.Do(addRem(s.CurrentStatus == models.StUnknown), statesUnknownKey(s.Alert), s.AlertKey); err != nil { return slog.Wrap(err) } if _, err = conn.Do(addRem(s.Unevaluated), statesUnevalKey(s.Alert), s.AlertKey); err != nil { return slog.Wrap(err) } return nil }) }