55 "context"
66 "encoding/json"
77 nethttp "net/http"
8- "sync"
98
109 ofctx "github.com/OpenFunction/functions-framework-go/context"
1110 "github.com/cenkalti/backoff/v4"
@@ -33,40 +32,43 @@ type Config struct {
3332 MaxBufferSize int
3433}
3534
36- type EventRequest struct {
37- ctx * context.Context
38- ofctx.EventRequest
35+ type Event struct {
36+ ctx * context.Context
37+ bindingEvent * common.BindingEvent
38+ topicEvent * common.TopicEvent
39+ respCh chan * EventResponse
40+ }
41+
42+ func NewEvent (ctx * context.Context ,
43+ bindingEvent * common.BindingEvent ,
44+ topicEvent * common.TopicEvent ,
45+ respCh chan * EventResponse ) Event {
46+ return Event {
47+ ctx : ctx ,
48+ bindingEvent : bindingEvent ,
49+ topicEvent : topicEvent ,
50+ respCh : respCh ,
51+ }
3952}
4053
4154type EventResponse struct {
4255 Data []byte
4356 Error error
4457}
4558
46- type ResponseMap struct {
47- l * sync.RWMutex
48- m map [* context.Context ]* EventResponse
49- }
50-
5159type Runtime struct {
5260 config * Config
5361 ctx * ofctx.FunctionContext
5462 grpc * grpc.Manager
5563 funcChannel channel.AppChannel
56- reqChan chan * EventRequest
57- respMap * ResponseMap
64+ events chan * Event
5865}
5966
6067func NewFuncRuntime (config * Config , ctx * ofctx.FunctionContext ) * Runtime {
61- lock := new (sync.RWMutex )
6268 return & Runtime {
63- config : config ,
64- ctx : ctx ,
65- reqChan : make (chan * EventRequest , config .MaxBufferSize ),
66- respMap : & ResponseMap {
67- l : lock ,
68- m : make (map [* context.Context ]* EventResponse ),
69- },
69+ config : config ,
70+ ctx : ctx ,
71+ events : make (chan * Event , config .MaxBufferSize ),
7072 }
7173}
7274
@@ -89,76 +91,59 @@ func (r *Runtime) CreateFuncChannel() error {
8991 return nil
9092}
9193
92- func (r * Runtime ) ProcessEvents () {
93- for e := range r .reqChan {
94- if e .BindingEvent != nil {
95- var data []byte
96- // Retry on connection error.
97- err := backoff .Retry (func () error {
98- var err error
99- data , err = r .OnBindingEvent (e .ctx , e .BindingEvent )
100- if err != nil {
101- klog .V (4 ).Info (err )
102- return err
103- }
104- return nil
105- }, utils .NewExponentialBackOff ())
94+ func (r * Runtime ) GetPendingEventsCount () int {
95+ return len (r .events )
96+ }
10697
107- resp := EventResponse {
108- Data : data ,
109- Error : err ,
110- }
111- r .respMap .l .Lock ()
112- r .respMap .m [e .ctx ] = & resp
113- r .respMap .l .Unlock ()
114- }
98+ func (r * Runtime ) ProcessEvents () {
99+ for e := range r .events {
100+ if e .bindingEvent != nil {
101+ go func () {
102+ var data []byte
103+ // Retry on connection error.
104+ err := backoff .Retry (func () error {
105+ var err error
106+ data , err = r .OnBindingEvent (e .ctx , e .bindingEvent )
107+ if err != nil {
108+ klog .V (4 ).Info (err )
109+ return err
110+ }
111+ return nil
112+ }, utils .NewExponentialBackOff ())
115113
116- if e .TopicEvent != nil {
117- // Retry on connection error.
118- err := backoff .Retry (func () error {
119- var err error
120- err = r .OnTopicEvent (e .ctx , e .TopicEvent )
121- if err != nil {
122- return err
114+ resp := EventResponse {
115+ Data : data ,
116+ Error : err ,
123117 }
124- return nil
125- }, utils .NewExponentialBackOff ())
126-
127- resp := EventResponse {
128- Data : nil ,
129- Error : err ,
130- }
131- r .respMap .l .Lock ()
132- r .respMap .m [e .ctx ] = & resp
133- r .respMap .l .Unlock ()
118+ e .respCh <- & resp
119+ }()
134120 }
135- }
136- }
137121
138- func (r * Runtime ) EnqueueBindingEvent (ctx * context.Context , event * common.BindingEvent ) {
139- req := EventRequest {
140- ctx : ctx ,
141- EventRequest : ofctx.EventRequest {BindingEvent : event },
142- }
143- r .reqChan <- & req
144- }
122+ if e .topicEvent != nil {
123+ go func () {
124+ // Retry on connection error.
125+ err := backoff .Retry (func () error {
126+ var err error
127+ err = r .OnTopicEvent (e .ctx , e .topicEvent )
128+ if err != nil {
129+ klog .V (4 ).Info (err )
130+ return err
131+ }
132+ return nil
133+ }, utils .NewExponentialBackOff ())
145134
146- func (r * Runtime ) EnqueueTopicEvent (ctx * context.Context , event * common.TopicEvent ) {
147- req := EventRequest {
148- ctx : ctx ,
149- EventRequest : ofctx.EventRequest {TopicEvent : event },
135+ resp := EventResponse {
136+ Data : nil ,
137+ Error : err ,
138+ }
139+ e .respCh <- & resp
140+ }()
141+ }
150142 }
151- r .reqChan <- & req
152143}
153144
154- func (r * Runtime ) GetEventResponse (ctx * context.Context ) * EventResponse {
155- defer r .respMap .l .Unlock ()
156- r .respMap .l .Lock ()
157- if resp , ok := r .respMap .m [ctx ]; ok {
158- delete (r .respMap .m , ctx )
159- return resp
160- }
161- return nil
145+ func (r * Runtime ) EnqueueEvent (event * Event ) {
146+ r .events <- event
162147}
163148
164149func (r * Runtime ) OnBindingEvent (ctx * context.Context , event * common.BindingEvent ) ([]byte , error ) {
0 commit comments