bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/cmd/synsec/pour.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 "bitbucket.org/Aishee/synsec/pkg/csconfig" 8 leaky "bitbucket.org/Aishee/synsec/pkg/leakybucket" 9 "bitbucket.org/Aishee/synsec/pkg/types" 10 log "github.com/sirupsen/logrus" 11 ) 12 13 func runPour(input chan types.Event, holders []leaky.BucketFactory, buckets *leaky.Buckets, cConfig *csconfig.Config) error { 14 var ( 15 count int 16 ) 17 for { 18 //bucket is now ready 19 select { 20 case <-bucketsTomb.Dying(): 21 log.Infof("Bucket routine exiting") 22 return nil 23 case parsed := <-input: 24 count++ 25 if count%5000 == 0 { 26 log.Warningf("%d existing LeakyRoutine", leaky.LeakyRoutineCount) 27 //when in forensics mode, garbage collect buckets 28 if cConfig.Synsec.BucketsGCEnabled { 29 if parsed.MarshaledTime != "" { 30 var z *time.Time = &time.Time{} 31 if err := z.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil { 32 log.Warningf("Failed to unmarshal time from event '%s' : %s", parsed.MarshaledTime, err) 33 } else { 34 log.Warningf("Starting buckets garbage collection ...") 35 if err = leaky.GarbageCollectBuckets(*z, buckets); err != nil { 36 return fmt.Errorf("failed to start bucket GC : %s", err) 37 } 38 } 39 } 40 } 41 } 42 //here we can bucketify with parsed 43 poured, err := leaky.PourItemToHolders(parsed, holders, buckets) 44 if err != nil { 45 log.Fatalf("bucketify failed for: %v", parsed) 46 return fmt.Errorf("process of event failed : %v", err) 47 } 48 if poured { 49 globalBucketPourOk.Inc() 50 } else { 51 globalBucketPourKo.Inc() 52 } 53 if len(parsed.MarshaledTime) != 0 { 54 if err := lastProcessedItem.UnmarshalText([]byte(parsed.MarshaledTime)); err != nil { 55 log.Warningf("failed to unmarshal time from event : %s", err) 56 } 57 } 58 } 59 } 60 }