From 08958da630283459a77b048a2688f86801d94690 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Fri, 4 Jul 2025 11:07:01 +0900 Subject: [PATCH 1/2] Close Scheduler in the delay example Signed-off-by: Takeshi Yoneda --- go/delay.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go/delay.go b/go/delay.go index 64e597f..2b80695 100644 --- a/go/delay.go +++ b/go/delay.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "strconv" "time" @@ -35,7 +34,6 @@ func (p *delayFilter) RequestHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) // Check if the headers contain the "do-delay" header to trigger the delay. if _, ok := e.GetRequestHeader("do-delay"); !ok { // If the header is not present, continue the request processing. - fmt.Println("gosdk: RequestHeaders, do-delay header not found, continuing request processing") return gosdk.RequestHeadersStatusContinue } @@ -43,12 +41,13 @@ func (p *delayFilter) RequestHeaders(e gosdk.EnvoyHttpFilter, endOfStream bool) now := time.Now() p.onRequestHeaders = now go func() { + // Scheduler must be closed to avoid memory leaks. + defer schduler.Close() // Simulate some delay. time.Sleep(2 * time.Second) // Commit the event to continue the request processing. schduler.Commit(0) }() - fmt.Printf("gosdk: RequestHeaders, delaying request processing for 2 seconds at %s\n", now) return gosdk.RequestHeadersStatusStopIteration } @@ -57,7 +56,6 @@ func (p *delayFilter) Sheduled(e gosdk.EnvoyHttpFilter, eventID uint64) { if eventID != 0 { panic("unexpected eventID in Sheduled: " + strconv.Itoa(int(eventID))) } - fmt.Println("gosdk: Sheduled, continuing request processing after delay") p.delayLapsed = time.Since(p.onRequestHeaders) // We can insert some headers at this phase. e.SetRequestHeader("delay-filter-on-scheduled", []byte("yes")) From a3f6360c1059d5f753aa649d5942bcc92b050977 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Fri, 4 Jul 2025 11:10:12 +0900 Subject: [PATCH 2/2] more Signed-off-by: Takeshi Yoneda --- go/gosdk/gosdk.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go/gosdk/gosdk.go b/go/gosdk/gosdk.go index 71d58b8..00f313d 100644 --- a/go/gosdk/gosdk.go +++ b/go/gosdk/gosdk.go @@ -80,6 +80,8 @@ type Scheduler interface { // Commit commits the event to the Envoy filter on the correct worker thread. // The eventID is a unique identifier for the event, and it can be used to distinguish between different events. Commit(eventID uint64) + // Close closes the scheduler and releases any resources associated with it. + // This must be called when the scheduler is no longer needed to avoid memory leaks. Close() } @@ -99,7 +101,8 @@ type HttpFilter interface { ResponseBody(e EnvoyHttpFilter, endOfStream bool) ResponseBodyStatus // TODO: add ResponseTrailers support. - // Scheuled is called when the filter is scheduled to run. + // Scheuled is called when the filter is scheduled to run on the Envoy worker thread. + // Such event is created via [Scheduler.Commit] and the eventID is the unique identifier for the event. Sheduled(e EnvoyHttpFilter, eventID uint64) // Destroy is called when the stream is destroyed.