github.com/siglens/siglens@v0.0.0-20240328180423-f7ce9ae441ed/pkg/segment/writer/segmetareader.go (about) 1 /* 2 Copyright 2023. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package writer 18 19 import ( 20 "bufio" 21 "encoding/json" 22 "errors" 23 "os" 24 "path" 25 26 "github.com/siglens/siglens/pkg/config" 27 "github.com/siglens/siglens/pkg/segment/structs" 28 log "github.com/sirupsen/logrus" 29 ) 30 31 var SegmetaSuffix = "segmeta.json" 32 33 // read only the current nodes segmeta 34 func ReadLocalSegmeta() []*structs.SegMeta { 35 smrLock.Lock() 36 defer smrLock.Unlock() 37 38 segMetaFilename := GetLocalSegmetaFName() 39 retVal, err := getAllSegmetas(segMetaFilename) 40 if err != nil { 41 log.Errorf("ReadLocalSegmeta: getallsegmetas err=%v ", err) 42 } 43 return retVal 44 } 45 46 // returns all segmetas downloaded, including the current nodes segmeta and all global segmetas 47 func ReadAllSegmetas() []*structs.SegMeta { 48 smrLock.Lock() 49 defer smrLock.Unlock() 50 51 ingestDir := config.GetIngestNodeBaseDir() 52 files, err := os.ReadDir(ingestDir) 53 if err != nil { 54 log.Errorf("ReadAllSegmetas: read dir err=%v ", err) 55 return make([]*structs.SegMeta, 0) 56 } 57 58 iNodes := make([]string, 0) 59 for _, file := range files { 60 fName := file.Name() 61 iNodes = append(iNodes, fName) 62 } 63 64 allSegmetas := make([]string, 0) 65 for _, iNode := range iNodes { 66 mDir := path.Join(ingestDir, iNode, SegmetaSuffix) 67 if _, err := os.Stat(mDir); err != nil { 68 continue 69 } 70 allSegmetas = append(allSegmetas, mDir) 71 } 72 73 allVals := make(map[string]*structs.SegMeta) 74 for _, fName := range allSegmetas { 75 allSegMetaMap, err := getAllSegmetaToMap(fName) 76 if err != nil { 77 log.Errorf("ReadAllSegmetas: getallsegmeta err=%v ", err) 78 return make([]*structs.SegMeta, 0) 79 } 80 for k, v := range allSegMetaMap { 81 allVals[k] = v 82 } 83 } 84 retVal := make([]*structs.SegMeta, 0, len(allVals)) 85 idx := 0 86 for _, v := range allVals { 87 retVal = append(retVal, v) 88 idx++ 89 } 90 return retVal[:idx] 91 } 92 93 func ReadSegmeta(smFname string) ([]*structs.SegMeta, error) { 94 smrLock.Lock() 95 defer smrLock.Unlock() 96 retVal, err := getAllSegmetas(smFname) 97 if err != nil { 98 log.Errorf("ReadSegmeta: getsegmetas err=%v ", err) 99 return nil, err 100 } 101 return retVal, nil 102 } 103 104 // returns the current nodes segmeta 105 func GetLocalSegmetaFName() string { 106 return config.GetSmrBaseDir() + SegmetaSuffix 107 } 108 109 func getAllSegmetaToMap(segMetaFilename string) (map[string]*structs.SegMeta, error) { 110 allSegMetaMap := make(map[string]*structs.SegMeta) 111 112 fd, err := os.OpenFile(segMetaFilename, os.O_RDONLY, 0666) 113 if err != nil { 114 if errors.Is(err, os.ErrNotExist) { 115 return allSegMetaMap, nil 116 } 117 log.Errorf("getAllSegmetaToMap: Cannot read input Segmeta File = %v, err= %v", segMetaFilename, err) 118 return allSegMetaMap, err 119 } 120 defer fd.Close() 121 scanner := bufio.NewScanner(fd) 122 123 for scanner.Scan() { 124 rawbytes := scanner.Bytes() 125 var segmeta structs.SegMeta 126 err := json.Unmarshal(rawbytes, &segmeta) 127 if err != nil { 128 log.Errorf("getAllSegmetaToMap: Cannot unmarshal data = %v, err= %v", string(rawbytes), err) 129 continue 130 } 131 allSegMetaMap[segmeta.SegmentKey] = &segmeta 132 } 133 return allSegMetaMap, nil 134 } 135 136 func getAllSegmetas(segMetaFilename string) ([]*structs.SegMeta, error) { 137 138 allSegMetas := make([]*structs.SegMeta, 0) 139 140 fd, err := os.OpenFile(segMetaFilename, os.O_RDONLY, 0666) 141 if err != nil { 142 if errors.Is(err, os.ErrNotExist) { 143 return []*structs.SegMeta{}, nil 144 } 145 log.Errorf("getAllSegmetas: Cannot read input Segmeta File = %v, err= %v", segMetaFilename, err) 146 return allSegMetas, err 147 } 148 defer fd.Close() 149 scanner := bufio.NewScanner(fd) 150 151 for scanner.Scan() { 152 rawbytes := scanner.Bytes() 153 var segmeta structs.SegMeta 154 err := json.Unmarshal(rawbytes, &segmeta) 155 if err != nil { 156 log.Errorf("getAllSegmetas: Cannot unmarshal data = %v, err= %v", string(rawbytes), err) 157 continue 158 } 159 allSegMetas = append(allSegMetas, &segmeta) 160 } 161 162 return allSegMetas, nil 163 } 164 165 func GetVTableCounts(vtableName string, orgid uint64) (uint64, int, uint64) { 166 167 bytesCount := uint64(0) 168 recordCount := 0 169 onDiskBytesCount := uint64(0) 170 171 allSegmetas := ReadAllSegmetas() 172 for _, segmeta := range allSegmetas { 173 if segmeta == nil { 174 continue 175 } 176 if segmeta.VirtualTableName == vtableName && segmeta.OrgId == orgid { 177 bytesCount += segmeta.BytesReceivedCount 178 recordCount += segmeta.RecordCount 179 onDiskBytesCount += segmeta.OnDiskBytes 180 } 181 } 182 return bytesCount, recordCount, onDiskBytesCount 183 } 184 185 func GetVTableCountsForAll(orgid uint64) map[string]*structs.VtableCounts { 186 187 allvtables := make(map[string]*structs.VtableCounts) 188 189 allSegmetas := ReadAllSegmetas() 190 191 var ok bool 192 var cnts *structs.VtableCounts 193 for _, segmeta := range allSegmetas { 194 if segmeta == nil { 195 continue 196 } 197 if segmeta.OrgId != orgid && orgid != 10618270676840840323 { //orgid for siglens 198 continue 199 } 200 cnts, ok = allvtables[segmeta.VirtualTableName] 201 if !ok { 202 cnts = &structs.VtableCounts{} 203 allvtables[segmeta.VirtualTableName] = cnts 204 } 205 cnts.BytesCount += segmeta.BytesReceivedCount 206 cnts.RecordCount += uint64(segmeta.RecordCount) 207 cnts.OnDiskBytesCount += segmeta.OnDiskBytes 208 } 209 return allvtables 210 }