// index收到一条新上报的监控数据,尝试用于增量更新索引 func ReceiveItem(item *cmodel.GraphItem, md5 string) { if item == nil { return } uuid := item.UUID() // 已上报过的数据 if indexedItemCache.ContainsKey(md5) { old := indexedItemCache.Get(md5).(*IndexCacheItem) if uuid == old.UUID { // dsType+step没有发生变化,只更新缓存 TODO 存在线程安全的问题 old.Item = item } else { // dsType+step变化了,当成一个新的增量来处理(甚至,不用rrd文件来过滤) //indexedItemCache.Remove(md5) unIndexedItemCache.Put(md5, NewIndexCacheItem(uuid, item)) } return } // 是否有rrdtool文件存在,如果有 认为已建立索引 // 针对 索引缓存重建场景 做的优化, 结合索引全量更新 来保证一致性 rrdFileName := g.RrdFileName(g.Config().RRD.Storage, md5, item.DsType, item.Step) if g.IsRrdFileExist(rrdFileName) { indexedItemCache.Put(md5, NewIndexCacheItem(uuid, item)) return } // 缓存未命中, 放入增量更新队列 unIndexedItemCache.Put(md5, NewIndexCacheItem(uuid, item)) }
func (this *GraphItemMap) PushFront(key string, item *cmodel.GraphItem, md5 string, cfg *g.GlobalConfig) { if linkedList, exists := this.Get(key); exists { linkedList.PushFront(item) } else { //log.Println("new key:", key) safeList := &SafeLinkedList{L: list.New()} safeList.L.PushFront(item) if cfg.Migrate.Enabled && !g.IsRrdFileExist(g.RrdFileName( cfg.RRD.Storage, md5, item.DsType, item.Step)) { safeList.Flag = g.GRAPH_F_MISS } this.Set(key, safeList) } }
// flush to disk from memory // 最新的数据在列表的最后面 // TODO fix me, filename fmt from item[0], it's hard to keep consistent func flushrrd(filename string, items []*cmodel.GraphItem) error { if items == nil || len(items) == 0 { return errors.New("empty items") } if !g.IsRrdFileExist(filename) { baseDir := file.Dir(filename) err := file.InsureDir(baseDir) if err != nil { return err } err = create(filename, items[0]) if err != nil { return err } } return update(filename, items) }