From f67db5035e4d05999c7dbad03480bc9b167ccc0b Mon Sep 17 00:00:00 2001 From: Antonio Navarro Perez Date: Mon, 1 Mar 2021 19:09:31 +0100 Subject: [PATCH] Add part of cache back. Signed-off-by: Antonio Navarro Perez --- etcd/cache.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ server/server.go | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 etcd/cache.go diff --git a/etcd/cache.go b/etcd/cache.go new file mode 100644 index 000000000..4cd5bc684 --- /dev/null +++ b/etcd/cache.go @@ -0,0 +1,57 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package etcd + +import ( + "sync" + "time" + + "github.com/pilosa/pilosa/v2/topology" +) + +// EtcdWithCache is a wrapper around the Etcd type which will return a +// cached value when the number of requests come in below a configured +// frequency. It also breaks the cache after a configured TTL. +type EtcdWithCache struct { + *Etcd + + peersMu sync.Mutex // peer-list cache updates + + nodes []*topology.Node // unmarshalled Node data + nodesTTL int // seconds + nodesLastRequest time.Time // last time requested +} + +// NewEtcdWithCache returns a new instance of Cache. +func NewEtcdWithCache(opt Options, replicas int) *EtcdWithCache { + return &EtcdWithCache{ + Etcd: NewEtcd(opt, replicas), + + nodesTTL: 6, + } +} + +// Nodes caches the result of the underlying implementation's node list. +func (c *EtcdWithCache) Nodes() []*topology.Node { + c.peersMu.Lock() + defer c.peersMu.Unlock() + + now := time.Now() + if now.Sub(c.nodesLastRequest) > (time.Duration(c.nodesTTL) * time.Second) { + c.nodes = c.Etcd.Nodes() + c.nodesLastRequest = now + } + return c.nodes +} diff --git a/server/server.go b/server/server.go index d607c6341..ab94b40f5 100644 --- a/server/server.go +++ b/server/server.go @@ -391,7 +391,7 @@ func (m *Command) SetupServer() error { m.Config.Etcd.Dir = filepath.Join(path, pilosa.DefaultDiscoDir) } - e := petcd.NewEtcd(m.Config.Etcd, m.Config.Cluster.ReplicaN) + e := petcd.NewEtcdWithCache(m.Config.Etcd, m.Config.Cluster.ReplicaN) discoOpt := pilosa.OptServerDisCo(e, e, e, e, e, e, e) serverOptions := []pilosa.ServerOption{