func fetch_rrd(client **rpc.Client, key string, addr string) error { var ( err error flag uint32 md5 string dsType string filename string step, i int rrdfile g.File ) cfg := g.Config() if flag, err = store.GraphItems.GetFlag(key); err != nil { return err } store.GraphItems.SetFlag(key, flag|g.GRAPH_F_FETCHING) md5, dsType, step, _ = g.SplitRrdCacheKey(key) filename = g.RrdFileName(cfg.RRD.Storage, md5, dsType, step) for i = 0; i < 3; i++ { err = rpc_call(*client, "Graph.GetRrd", key, &rrdfile, time.Duration(cfg.CallTimeout)*time.Millisecond) if err == nil { done := make(chan error, 1) io_task_chan <- &io_task_t{ method: IO_TASK_M_WRITE, args: &g.File{ Filename: filename, Body: rrdfile.Body[:], }, done: done, } if err = <-done; err != nil { goto out } else { flag &= ^g.GRAPH_F_MISS goto out } } else { log.Println(err) } if err == rpc.ErrShutdown { reconnection(client, addr) } } out: flag &= ^g.GRAPH_F_FETCHING store.GraphItems.SetFlag(key, flag) return err }
func CommitByKey(key string) { md5, dsType, step, err := g.SplitRrdCacheKey(key) if err != nil { return } filename := g.RrdFileName(g.Config().RRD.Storage, md5, dsType, step) items := store.GraphItems.PopAll(key) if len(items) == 0 { return } FlushFile(filename, items) }
func (this *Graph) GetRrd(key string, rrdfile *g.File) (err error) { if md5, dsType, step, err := g.SplitRrdCacheKey(key); err != nil { return err } else { rrdfile.Filename = g.RrdFileName(g.Config().RRD.Storage, md5, dsType, step) } items := store.GraphItems.PopAll(key) if len(items) > 0 { rrdtool.FlushFile(rrdfile.Filename, items) } rrdfile.Body, err = rrdtool.ReadFile(rrdfile.Filename) return }