|
1 | 1 | package cache
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "agent/internal" |
5 |
| - "agent/pkg/logger" |
6 | 4 | "bytes"
|
7 | 5 | "fmt"
|
| 6 | + "sync" |
| 7 | + |
| 8 | + "agent/internal" |
| 9 | + "agent/pkg/logger" |
| 10 | +) |
| 11 | + |
| 12 | +const ( |
| 13 | + lvcount = 50 |
8 | 14 | )
|
9 | 15 |
|
10 | 16 | type Cache struct {
|
| 17 | + m sync.RWMutex |
11 | 18 | devices []internal.Device
|
12 | 19 | deviceErrs bytes.Buffer
|
13 | 20 | pvs []internal.PVData
|
14 | 21 | pvsErrs bytes.Buffer
|
15 | 22 | vgs []internal.VGData
|
16 | 23 | vgsErrs bytes.Buffer
|
17 |
| - lvs []internal.LVData |
| 24 | + lvs map[string]*LVData |
18 | 25 | lvsErrs bytes.Buffer
|
19 | 26 | }
|
20 | 27 |
|
| 28 | +type LVData struct { |
| 29 | + Data internal.LVData |
| 30 | + Exist bool |
| 31 | +} |
| 32 | + |
21 | 33 | func New() *Cache {
|
22 |
| - return &Cache{} |
| 34 | + return &Cache{ |
| 35 | + lvs: make(map[string]*LVData, lvcount), |
| 36 | + } |
23 | 37 | }
|
24 | 38 |
|
25 | 39 | func (c *Cache) StoreDevices(devices []internal.Device, stdErr bytes.Buffer) {
|
@@ -59,37 +73,69 @@ func (c *Cache) GetVGs() ([]internal.VGData, bytes.Buffer) {
|
59 | 73 | }
|
60 | 74 |
|
61 | 75 | func (c *Cache) StoreLVs(lvs []internal.LVData, stdErr bytes.Buffer) {
|
62 |
| - c.lvs = lvs |
| 76 | + lvsOnNode := make(map[string]internal.LVData, len(lvs)) |
| 77 | + for _, lv := range lvs { |
| 78 | + lvsOnNode[c.configureLVKey(lv.VGName, lv.LVName)] = lv |
| 79 | + } |
| 80 | + |
| 81 | + c.m.Lock() |
| 82 | + defer c.m.Unlock() |
| 83 | + |
| 84 | + for _, lv := range lvsOnNode { |
| 85 | + k := c.configureLVKey(lv.VGName, lv.LVName) |
| 86 | + if cachedLV, exist := c.lvs[k]; !exist || cachedLV.Exist { |
| 87 | + c.lvs[k] = &LVData{ |
| 88 | + Data: lv, |
| 89 | + Exist: true, |
| 90 | + } |
| 91 | + } |
| 92 | + } |
| 93 | + |
| 94 | + for key, lv := range c.lvs { |
| 95 | + if lv.Exist { |
| 96 | + continue |
| 97 | + } |
| 98 | + |
| 99 | + if _, exist := lvsOnNode[key]; !exist { |
| 100 | + delete(c.lvs, key) |
| 101 | + } |
| 102 | + } |
| 103 | + |
63 | 104 | c.lvsErrs = stdErr
|
64 | 105 | }
|
65 | 106 |
|
66 | 107 | func (c *Cache) GetLVs() ([]internal.LVData, bytes.Buffer) {
|
67 |
| - dst := make([]internal.LVData, len(c.lvs)) |
68 |
| - copy(dst, c.lvs) |
| 108 | + dst := make([]internal.LVData, 0, len(c.lvs)) |
69 | 109 |
|
70 |
| - return dst, c.lvsErrs |
71 |
| -} |
72 |
| - |
73 |
| -func (c *Cache) FindLV(vgName, lvName string) *internal.LVData { |
| 110 | + c.m.RLock() |
| 111 | + defer c.m.RUnlock() |
74 | 112 | for _, lv := range c.lvs {
|
75 |
| - if lv.VGName == vgName && lv.LVName == lvName { |
76 |
| - return &lv |
77 |
| - } |
| 113 | + dst = append(dst, lv.Data) |
78 | 114 | }
|
79 | 115 |
|
80 |
| - return nil |
| 116 | + return dst, c.lvsErrs |
| 117 | +} |
| 118 | + |
| 119 | +func (c *Cache) FindLV(vgName, lvName string) *LVData { |
| 120 | + c.m.RLock() |
| 121 | + defer c.m.RUnlock() |
| 122 | + return c.lvs[c.configureLVKey(vgName, lvName)] |
81 | 123 | }
|
82 | 124 |
|
83 | 125 | func (c *Cache) AddLV(vgName, lvName string) {
|
84 |
| - c.lvs = append(c.lvs, internal.LVData{VGName: vgName, LVName: lvName}) |
| 126 | + c.m.Lock() |
| 127 | + defer c.m.Unlock() |
| 128 | + c.lvs[c.configureLVKey(vgName, lvName)] = &LVData{ |
| 129 | + Data: internal.LVData{VGName: vgName, LVName: lvName}, |
| 130 | + Exist: true, |
| 131 | + } |
85 | 132 | }
|
86 | 133 |
|
87 | 134 | func (c *Cache) RemoveLV(vgName, lvName string) {
|
88 |
| - for i, lv := range c.lvs { |
89 |
| - if lv.VGName == vgName && lv.LVName == lvName { |
90 |
| - c.lvs = append(c.lvs[:i], c.lvs[i+1:]...) |
91 |
| - } |
92 |
| - } |
| 135 | + c.m.Lock() |
| 136 | + defer c.m.Unlock() |
| 137 | + |
| 138 | + c.lvs[c.configureLVKey(vgName, lvName)].Exist = false |
93 | 139 | }
|
94 | 140 |
|
95 | 141 | func (c *Cache) FindVG(vgName string) *internal.VGData {
|
@@ -126,11 +172,17 @@ func (c *Cache) PrintTheCache(log logger.Logger) {
|
126 | 172 | log.Cache(c.vgsErrs.String())
|
127 | 173 | log.Cache("[VGs ENDS]")
|
128 | 174 | log.Cache("[LVs BEGIN]")
|
| 175 | + c.m.RLock() |
129 | 176 | for _, lv := range c.lvs {
|
130 |
| - log.Cache(fmt.Sprintf(" LV Name: %s, VG name: %s, size: %s, tags: %s, attr: %s, pool: %s", lv.LVName, lv.VGName, lv.LVSize.String(), lv.LvTags, lv.LVAttr, lv.PoolName)) |
| 177 | + log.Cache(fmt.Sprintf(" Data Name: %s, VG name: %s, size: %s, tags: %s, attr: %s, pool: %s", lv.Data.LVName, lv.Data.VGName, lv.Data.LVSize.String(), lv.Data.LvTags, lv.Data.LVAttr, lv.Data.PoolName)) |
131 | 178 | }
|
| 179 | + c.m.RUnlock() |
132 | 180 | log.Cache("[ERRS]")
|
133 | 181 | log.Cache(c.lvsErrs.String())
|
134 | 182 | log.Cache("[LVs ENDS]")
|
135 | 183 | log.Cache("*****************CACHE ENDS*****************")
|
136 | 184 | }
|
| 185 | + |
| 186 | +func (c *Cache) configureLVKey(vgName, lvName string) string { |
| 187 | + return fmt.Sprintf("%s/%s", vgName, lvName) |
| 188 | +} |
0 commit comments