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  }