Skip to content

Commit cfa30d7

Browse files
authored
feat: add WithRebuildAfterRequests option to trigger plugin VM rebuild (#23)
1 parent cbf1cfc commit cfa30d7

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

pkg/wrapper/plugin_wrapper.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ type CommonVmCtx[PluginConfig any] struct {
8686
onHttpResponseBody onHttpBodyFunc[PluginConfig]
8787
onHttpStreamingResponseBody onHttpStreamingBodyFunc[PluginConfig]
8888
onHttpStreamDone onHttpStreamDoneFunc[PluginConfig]
89+
rebuildAfterRequests uint64 // Number of requests after which to trigger rebuild
90+
requestCount uint64 // Current request count
8991
}
9092

9193
type TickFuncEntry struct {
@@ -403,6 +405,19 @@ func WithLogger[PluginConfig any](logger log.Log) CtxOption[PluginConfig] {
403405
return &logOption[PluginConfig]{logger}
404406
}
405407

408+
type rebuildOption[PluginConfig any] struct {
409+
rebuildAfterRequests uint64
410+
}
411+
412+
func (o *rebuildOption[PluginConfig]) Apply(ctx *CommonVmCtx[PluginConfig]) {
413+
ctx.rebuildAfterRequests = o.rebuildAfterRequests
414+
ctx.requestCount = 0
415+
}
416+
417+
func WithRebuildAfterRequests[PluginConfig any](requestCount uint64) CtxOption[PluginConfig] {
418+
return &rebuildOption[PluginConfig]{rebuildAfterRequests: requestCount}
419+
}
420+
406421
type prePluginOption[PluginConfig any] struct {
407422
f onPluginStartOrReload
408423
}
@@ -858,6 +873,16 @@ func (ctx *CommonHttpCtx[PluginConfig]) OnHttpRequestHeaders(numHeaders int, end
858873
ctx.executionPhase = iface.DecodeHeader
859874
requestID, _ := proxywasm.GetHttpRequestHeader("x-request-id")
860875
_ = proxywasm.SetProperty([]string{"x_request_id"}, []byte(requestID))
876+
877+
// Increment request count and check rebuild condition
878+
if ctx.plugin.vm.rebuildAfterRequests > 0 {
879+
ctx.plugin.vm.requestCount++
880+
if ctx.plugin.vm.requestCount >= ctx.plugin.vm.rebuildAfterRequests {
881+
proxywasm.SetProperty([]string{"wasm_rebuild"}, []byte("true"))
882+
ctx.plugin.vm.log.Infof("Plugin reached rebuild threshold after %d requests, rebuild flag set", ctx.plugin.vm.requestCount)
883+
}
884+
}
885+
861886
config, err := ctx.plugin.GetMatchConfig()
862887
if err != nil {
863888
ctx.plugin.vm.log.Errorf("get match config failed, err:%v", err)

0 commit comments

Comments
 (0)