@@ -4,14 +4,13 @@ package measurements
44
55import (
66 "context"
7+ "errors"
78 "fmt"
8- "log"
99 "time"
1010
1111 "github.com/google/uuid"
1212 "github.com/samber/lo"
1313
14- "sensorbucket.nl/sensorbucket/internal/cleanupper"
1514 "sensorbucket.nl/sensorbucket/internal/pagination"
1615 "sensorbucket.nl/sensorbucket/pkg/auth"
1716 "sensorbucket.nl/sensorbucket/pkg/pipeline"
@@ -25,84 +24,85 @@ type Store interface {
2524 GetDatastream (ctx context.Context , id uuid.UUID , filter DatastreamFilter ) (* Datastream , error )
2625 FindOrCreateDatastream (ctx context.Context , tenantID , sensorID int64 , observedProperty , UnitOfMeasurement string ) (* Datastream , error )
2726 StoreMeasurements (context.Context , []Measurement ) error
27+ StoreMeasurement (context.Context , Measurement ) error
2828}
2929
3030// Service is the measurement service which stores measurement data.
3131type Service struct {
32- store Store
33- systemArchiveTime int
34- keyClient auth.JWKSClient
35- measurementBatchChan chan Measurement
36- measurementBatch []Measurement
32+ store Store
33+ systemArchiveTime int
34+ keyClient auth.JWKSClient
35+ // measurementBatchChan chan Measurement
36+ // measurementBatch []Measurement
3737}
3838
3939func New (store Store , systemArchiveTime , batchSize int , keyClient auth.JWKSClient ) * Service {
4040 return & Service {
41- store : store ,
42- systemArchiveTime : systemArchiveTime ,
43- keyClient : keyClient ,
44- measurementBatch : make ([]Measurement , 0 , batchSize ),
45- measurementBatchChan : make (chan Measurement , batchSize ),
41+ store : store ,
42+ systemArchiveTime : systemArchiveTime ,
43+ keyClient : keyClient ,
44+ // measurementBatch: make([]Measurement, 0, batchSize),
45+ // measurementBatchChan: make(chan Measurement, batchSize),
4646 }
4747}
4848
49- func (s * Service ) StartMeasurementBatchStorer (interval time.Duration ) cleanupper.Shutdown {
50- stop := make (chan struct {})
51- done := make (chan struct {})
52- t := time .NewTicker (interval )
53-
54- go func () {
55- log .Println ("Measurement service batch storer started" )
56- defer log .Println ("Measurement service batch storer stopped!" )
57- outer:
58- for {
59- select {
60- case <- stop :
61- if err := s .CommitBatch (false ); err != nil {
62- log .Printf ("error committing batch: %s\n " , err .Error ())
63- }
64- break outer
65- case m := <- s .measurementBatchChan :
66- s .measurementBatch = append (s .measurementBatch , m )
67- if len (s .measurementBatch ) == cap (s .measurementBatch ) {
68- if err := s .CommitBatch (false ); err != nil {
69- log .Printf ("error committing batch: %s\n " , err .Error ())
70- }
71- }
72- case <- t .C :
73- if err := s .CommitBatch (false ); err != nil {
74- log .Printf ("error committing batch: %s\n " , err .Error ())
75- }
76- }
77- }
78- close (done )
79- }()
80-
81- return func (ctx context.Context ) error {
82- close (stop )
83- <- done
84- return nil
85- }
86- }
87-
88- func (s * Service ) CommitBatch (collect bool ) error {
89- if len (s .measurementBatch ) == 0 {
90- if ! collect || len (s .measurementBatchChan ) == 0 {
91- return nil
92- }
93- count := len (s .measurementBatchChan )
94- for i := 0 ; i < count ; i ++ {
95- s .measurementBatch = append (s .measurementBatch , <- s .measurementBatchChan )
96- }
97- }
98- log .Printf ("Committing %d measurements\n " , len (s .measurementBatch ))
99- err := s .store .StoreMeasurements (context .Background (), s .measurementBatch )
100- if err != nil {
101- return fmt .Errorf ("committing measurements failed: %w" , err )
102- }
103- s .measurementBatch = s .measurementBatch [:0 ]
104- return nil
105- }
49+ // func (s *Service) StartMeasurementBatchStorer(interval time.Duration) cleanupper.Shutdown {
50+ // stop := make(chan struct{})
51+ // done := make(chan struct{})
52+ // t := time.NewTicker(interval)
53+ //
54+ // go func() {
55+ // log.Println("Measurement service batch storer started")
56+ // defer log.Println("Measurement service batch storer stopped!")
57+ // outer:
58+ // for {
59+ // select {
60+ // case <-stop:
61+ // if err := s.CommitBatch(false); err != nil {
62+ // log.Printf("error committing batch: %s\n", err.Error())
63+ // }
64+ // break outer
65+ // case m := <-s.measurementBatchChan:
66+ // s.measurementBatch = append(s.measurementBatch, m)
67+ // if len(s.measurementBatch) == cap(s.measurementBatch) {
68+ // if err := s.CommitBatch(false); err != nil {
69+ // log.Printf("error committing batch: %s\n", err.Error())
70+ // }
71+ // }
72+ // case <-t.C:
73+ // if err := s.CommitBatch(false); err != nil {
74+ // log.Printf("error committing batch: %s\n", err.Error())
75+ // }
76+ // }
77+ // }
78+ // close(done)
79+ // }()
80+ //
81+ // return func(ctx context.Context) error {
82+ // close(stop)
83+ // <-done
84+ // return nil
85+ // }
86+ // }
87+ //
88+ // func (s *Service) CommitBatch(collect bool) error {
89+ // if len(s.measurementBatch) == 0 {
90+ // if !collect || len(s.measurementBatchChan) == 0 {
91+ // return nil
92+ // }
93+ // count := len(s.measurementBatchChan)
94+ // for range count {
95+ // s.measurementBatch = append(s.measurementBatch, <-s.measurementBatchChan)
96+ // }
97+ // }
98+ // log.Printf("Committing %d measurements\n", len(s.measurementBatch))
99+ // err := s.store.StoreMeasurements(context.Background(), s.measurementBatch)
100+ // if err != nil {
101+ // return fmt.Errorf("committing measurements failed: %w", err)
102+ // }
103+ // s.measurementBatch = s.measurementBatch[:0]
104+ // return nil
105+ // }
106106
107107func (s * Service ) ProcessPipelineMessage (pmsg pipeline.Message ) error {
108108 msg := PipelineMessage (pmsg )
@@ -135,10 +135,12 @@ func (s *Service) ProcessPipelineMessage(pmsg pipeline.Message) error {
135135 CreatedAt : time .Now (),
136136 }
137137
138+ var errs []error
138139 for _ , m := range msg .Measurements {
139140 sensor , err := dev .GetSensorByExternalIDOrFallback (m .SensorExternalID )
140141 if err != nil {
141- return fmt .Errorf ("cannot get sensor: %w" , err )
142+ errs = append (errs , fmt .Errorf ("cannog get sensor: %w" , err ))
143+ continue
142144 }
143145 if sensor .ExternalID != m .SensorExternalID {
144146 m .ObservedProperty = m .SensorExternalID + "_" + m .ObservedProperty
@@ -148,7 +150,8 @@ func (s *Service) ProcessPipelineMessage(pmsg pipeline.Message) error {
148150
149151 ds , err := s .store .FindOrCreateDatastream (ctx , msg .TenantID , sensor .ID , m .ObservedProperty , m .UnitOfMeasurement )
150152 if err != nil {
151- return err
153+ errs = append (errs , fmt .Errorf ("cannog get sensor: %w" , err ))
154+ continue
152155 }
153156
154157 measurement := baseMeasurement
@@ -186,10 +189,10 @@ func (s *Service) ProcessPipelineMessage(pmsg pipeline.Message) error {
186189 measurement .MeasurementAltitude = m .Altitude
187190 }
188191
189- s . measurementBatchChan <- measurement
192+ errs = append ( errs , s . store . StoreMeasurement ( ctx , measurement ))
190193 }
191194
192- return nil
195+ return errors . Join ( errs ... )
193196}
194197
195198// Filter contains query information for a list of measurements
0 commit comments