Skip to content

Commit 088974e

Browse files
committed
Merge branch 'main' into solana-logtrigger-cap-bump
2 parents 6c9ccc0 + 32197b5 commit 088974e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1252
-5305
lines changed

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ require (
77
github.com/XSAM/otelsql v0.37.0
88
github.com/andybalholm/brotli v1.1.1
99
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c
10-
github.com/buraksezer/consistent v0.10.0
1110
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0
12-
github.com/cespare/xxhash/v2 v2.3.0
1311
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
1412
github.com/dominikbraun/graph v0.23.0
1513
github.com/fxamacker/cbor/v2 v2.7.0
@@ -90,6 +88,7 @@ require (
9088
github.com/buger/goterm v1.0.4 // indirect
9189
github.com/buger/jsonparser v1.1.1 // indirect
9290
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
91+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
9392
github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.16.1 // indirect
9493
github.com/cloudevents/sdk-go/v2 v2.16.1 // indirect
9594
github.com/fatih/color v1.18.0 // indirect

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY=
2828
github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE=
2929
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
3030
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
31-
github.com/buraksezer/consistent v0.10.0 h1:hqBgz1PvNLC5rkWcEBVAL9dFMBWz6I0VgUCW25rrZlU=
32-
github.com/buraksezer/consistent v0.10.0/go.mod h1:6BrVajWq7wbKZlTOUPs/XVfR8c0maujuPowduSpZqmw=
3331
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 h1:aBU8cexP2rPZ0Qz488kvn2NXvWZHL2aG1/+n7Iv+xGc=
3432
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0/go.mod h1:4OCU0xAW9ycwtX4nMF4zxwgJBJ5/0eMfJiHB0wAmkV4=
3533
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=

pkg/capabilities/registry/base.go

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -356,20 +356,22 @@ func (a *atomicTriggerCapability) Update(c capabilities.BaseCapability) error {
356356

357357
func (a *atomicTriggerCapability) Info(ctx context.Context) (capabilities.CapabilityInfo, error) {
358358
a.mu.RLock()
359-
defer a.mu.RUnlock()
360-
if a.cap == nil {
359+
cap := a.cap
360+
a.mu.RUnlock()
361+
if cap == nil {
361362
return capabilities.CapabilityInfo{}, errors.New("capability unavailable")
362363
}
363-
return a.cap.Info(ctx)
364+
return cap.Info(ctx)
364365
}
365366

366367
func (a *atomicTriggerCapability) GetState() connectivity.State {
367368
a.mu.RLock()
368-
defer a.mu.RUnlock()
369-
if a.cap == nil {
369+
cap := a.cap
370+
a.mu.RUnlock()
371+
if cap == nil {
370372
return connectivity.Shutdown
371373
}
372-
if sg, ok := a.cap.(StateGetter); ok {
374+
if sg, ok := cap.(StateGetter); ok {
373375
return sg.GetState()
374376
}
375377
return connectivity.State(-1) // unknown
@@ -427,20 +429,22 @@ func (a *atomicExecuteCapability) Update(c capabilities.BaseCapability) error {
427429

428430
func (a *atomicExecuteCapability) Info(ctx context.Context) (capabilities.CapabilityInfo, error) {
429431
a.mu.RLock()
430-
defer a.mu.RUnlock()
431-
if a.cap == nil {
432+
cap := a.cap
433+
a.mu.RUnlock()
434+
if cap == nil {
432435
return capabilities.CapabilityInfo{}, errors.New("capability unavailable")
433436
}
434-
return a.cap.Info(ctx)
437+
return cap.Info(ctx)
435438
}
436439

437440
func (a *atomicExecuteCapability) GetState() connectivity.State {
438441
a.mu.RLock()
439-
defer a.mu.RUnlock()
440-
if a.cap == nil {
442+
cap := a.cap
443+
a.mu.RUnlock()
444+
if cap == nil {
441445
return connectivity.Shutdown
442446
}
443-
if sg, ok := a.cap.(StateGetter); ok {
447+
if sg, ok := cap.(StateGetter); ok {
444448
return sg.GetState()
445449
}
446450
return connectivity.State(-1) // unknown
@@ -458,29 +462,32 @@ func (a *atomicExecuteCapability) Load() *capabilities.ExecutableCapability {
458462

459463
func (a *atomicExecuteCapability) RegisterToWorkflow(ctx context.Context, request capabilities.RegisterToWorkflowRequest) error {
460464
a.mu.RLock()
461-
defer a.mu.RUnlock()
462-
if a.cap == nil {
465+
cap := a.cap
466+
a.mu.RUnlock()
467+
if cap == nil {
463468
return errors.New("capability unavailable")
464469
}
465-
return a.cap.RegisterToWorkflow(ctx, request)
470+
return cap.RegisterToWorkflow(ctx, request)
466471
}
467472

468473
func (a *atomicExecuteCapability) UnregisterFromWorkflow(ctx context.Context, request capabilities.UnregisterFromWorkflowRequest) error {
469474
a.mu.RLock()
470-
defer a.mu.RUnlock()
471-
if a.cap == nil {
475+
cap := a.cap
476+
a.mu.RUnlock()
477+
if cap == nil {
472478
return errors.New("capability unavailable")
473479
}
474-
return a.cap.UnregisterFromWorkflow(ctx, request)
480+
return cap.UnregisterFromWorkflow(ctx, request)
475481
}
476482

477483
func (a *atomicExecuteCapability) Execute(ctx context.Context, request capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) {
478484
a.mu.RLock()
479-
defer a.mu.RUnlock()
480-
if a.cap == nil {
485+
cap := a.cap
486+
a.mu.RUnlock()
487+
if cap == nil {
481488
return capabilities.CapabilityResponse{}, errors.New("capability unavailable")
482489
}
483-
return a.cap.Execute(ctx, request)
490+
return cap.Execute(ctx, request)
484491
}
485492

486493
var _ capabilities.ExecutableAndTriggerCapability = &atomicExecuteAndTriggerCapability{}
@@ -516,20 +523,22 @@ func (a *atomicExecuteAndTriggerCapability) Update(c capabilities.BaseCapability
516523

517524
func (a *atomicExecuteAndTriggerCapability) Info(ctx context.Context) (capabilities.CapabilityInfo, error) {
518525
a.mu.RLock()
519-
defer a.mu.RUnlock()
520-
if a.cap == nil {
526+
cap := a.cap
527+
a.mu.RUnlock()
528+
if cap == nil {
521529
return capabilities.CapabilityInfo{}, errors.New("capability unavailable")
522530
}
523-
return a.cap.Info(ctx)
531+
return cap.Info(ctx)
524532
}
525533

526534
func (a *atomicExecuteAndTriggerCapability) GetState() connectivity.State {
527535
a.mu.RLock()
528-
defer a.mu.RUnlock()
536+
cap := a.cap
537+
a.mu.RUnlock()
529538
if a.cap == nil {
530539
return connectivity.Shutdown
531540
}
532-
if sg, ok := a.cap.(StateGetter); ok {
541+
if sg, ok := cap.(StateGetter); ok {
533542
return sg.GetState()
534543
}
535544
return connectivity.State(-1) // unknown
@@ -565,27 +574,30 @@ func (a *atomicExecuteAndTriggerCapability) UnregisterTrigger(ctx context.Contex
565574

566575
func (a *atomicExecuteAndTriggerCapability) RegisterToWorkflow(ctx context.Context, request capabilities.RegisterToWorkflowRequest) error {
567576
a.mu.RLock()
568-
defer a.mu.RUnlock()
569-
if a.cap == nil {
577+
cap := a.cap
578+
a.mu.RUnlock()
579+
if cap == nil {
570580
return errors.New("capability unavailable")
571581
}
572-
return a.cap.RegisterToWorkflow(ctx, request)
582+
return cap.RegisterToWorkflow(ctx, request)
573583
}
574584

575585
func (a *atomicExecuteAndTriggerCapability) UnregisterFromWorkflow(ctx context.Context, request capabilities.UnregisterFromWorkflowRequest) error {
576586
a.mu.RLock()
577-
defer a.mu.RUnlock()
578-
if a.cap == nil {
587+
cap := a.cap
588+
a.mu.RUnlock()
589+
if cap == nil {
579590
return errors.New("capability unavailable")
580591
}
581-
return a.cap.UnregisterFromWorkflow(ctx, request)
592+
return cap.UnregisterFromWorkflow(ctx, request)
582593
}
583594

584595
func (a *atomicExecuteAndTriggerCapability) Execute(ctx context.Context, request capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) {
585596
a.mu.RLock()
586-
defer a.mu.RUnlock()
587-
if a.cap == nil {
597+
cap := a.cap
598+
a.mu.RUnlock()
599+
if cap == nil {
588600
return capabilities.CapabilityResponse{}, errors.New("capability unavailable")
589601
}
590-
return a.cap.Execute(ctx, request)
602+
return cap.Execute(ctx, request)
591603
}

pkg/loop/config.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,12 @@ func (e *EnvConfig) AsCmdEnv() (env []string) {
229229
add(envChipIngressEndpoint, e.ChipIngressEndpoint)
230230
add(envChipIngressInsecureConnection, strconv.FormatBool(e.ChipIngressInsecureConnection))
231231

232-
add(envCRESettings, e.CRESettings)
233-
add(envCRESettingsDefault, e.CRESettingsDefault)
232+
if e.CRESettings != "" {
233+
add(envCRESettings, e.CRESettings)
234+
}
235+
if e.CRESettingsDefault != "" {
236+
add(envCRESettingsDefault, e.CRESettingsDefault)
237+
}
234238

235239
return
236240
}

pkg/settings/cresettings/README.md

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# CRE Settings
2+
3+
```mermaid
4+
---
5+
title: Legend
6+
---
7+
flowchart
8+
bound{{Bound}}
9+
gate[/Gate\]
10+
queue[[Queue]]
11+
rate[\Rate/]
12+
resource([Resource])
13+
time>Time]
14+
15+
bound:::bound
16+
gate:::gate
17+
queue:::queue
18+
rate:::rate
19+
resource:::resource
20+
time:::time
21+
22+
classDef bound stroke:#f00
23+
classDef gate stroke:#0f0
24+
classDef queue stroke:#00f
25+
classDef rate stroke:#ff0
26+
classDef resource stroke:#f0f
27+
classDef time stroke:#0ff
28+
```
29+
30+
31+
```mermaid
32+
---
33+
title: Limits
34+
---
35+
flowchart
36+
subgraph handleRequest[httpServer/websocketServer.handleRequest]
37+
GatewayIncomingPayloadSizeLimit{{GatewayIncomingPayloadSizeLimit}}:::bound
38+
end
39+
%% WorkflowLimit - Deprecated
40+
%% TODO unused
41+
%% PerOrg.ZeroBalancePruningTimeout
42+
43+
subgraph Store.FetchWorkflowArtifacts
44+
PerWorkflow.WASMConfigSizeLimit{{PerWorkflow.WASMConfigSizeLimit}}:::bound
45+
PerWorkflow.WASMBinarySizeLimit{{PerWorkflow.WASMBinarySizeLimit}}:::bound
46+
PerWorkflow.WASMSecretsSizeLimit{{PerWorkflow.WASMSecretsSizeLimit}}:::bound
47+
end
48+
49+
subgraph host.NewModule
50+
PerWorkflow.WASMCompressedBinarySizeLimit{{PerWorkflow.WASMCompressedBinarySizeLimit}}:::bound
51+
end
52+
53+
subgraph Engine.init
54+
WorkflowExecutionConcurrencyLimit([WorkflowExecutionConcurrencyLimit]):::resource
55+
PerOwner.WorkflowExecutionConcurrencyLimit([PerOwner.WorkflowExecutionConcurrencyLimit]):::resource
56+
57+
WorkflowExecutionConcurrencyLimit-->PerOwner.WorkflowExecutionConcurrencyLimit
58+
end
59+
60+
subgraph Engine.runTriggerSubscriptionPhase
61+
62+
PerWorkflow.TriggerSubscriptionTimeout>PerWorkflow.TriggerSubscriptionTimeout]:::time
63+
PerWorkflow.WASMMemoryLimit{{PerWorkflow.WASMMemoryLimit}}:::bound
64+
PerWorkflow.TriggerRegistrationsTimeout>PerWorkflow.TriggerRegistrationsTimeout]:::time
65+
PerWorkflow.TriggerSubscriptionLimit{{PerWorkflow.TriggerSubscriptionLimit}}:::bound
66+
67+
PerWorkflow.TriggerSubscriptionTimeout-->PerWorkflow.WASMMemoryLimit-->PerWorkflow.TriggerSubscriptionLimit-->PerWorkflow.TriggerRegistrationsTimeout
68+
end
69+
70+
subgraph triggers
71+
direction TB
72+
73+
subgraph PerWorkflow.CRONTrigger
74+
FastestScheduleInterval>FastestScheduleInterval]:::time
75+
end
76+
subgraph PerWorkflow.HTTPTrigger
77+
RateLimit[\RateLimit/]:::rate
78+
end
79+
subgraph PerWorkflow.LogTrigger
80+
direction LR
81+
82+
EventRateLimit[\EventRateLimit/]:::rate
83+
EventSizeLimit{{EventSizeLimit}}:::bound
84+
FilterAddressLimit{{FilterAddressLimit}}:::bound
85+
FilterTopicsPerSlotLimit{{FilterTopicsPerSlotLimit}}:::bound
86+
end
87+
end
88+
89+
subgraph Engine.handleAllTriggerEvents
90+
PerWorkflow.TriggerEventQueueLimit[[PerWorkflow.TriggerEventQueueLimit]]:::queue
91+
PerWorkflow.TriggerEventQueueTimeout>PerWorkflow.TriggerEventQueueTimeout]:::time
92+
PerWorkflow.ExecutionConcurrencyLimit([PerWorkflow.ExecutionConcurrencyLimit]):::resource
93+
94+
PerWorkflow.TriggerEventQueueLimit-->PerWorkflow.TriggerEventQueueTimeout-->PerWorkflow.ExecutionConcurrencyLimit
95+
end
96+
97+
subgraph Engine.startExecution
98+
direction TB
99+
100+
subgraph logs
101+
PerWorkflow.LogLineLimit{{PerWorkflow.LogLineLimit}}:::bound
102+
PerWorkflow.LogEventLimit{{PerWorkflow.LogEventLimit}}:::bound
103+
end
104+
105+
PerWorkflow.ExecutionTimeout>PerWorkflow.ExecutionTimeout]:::time
106+
PerWorkflow.ExecutionResponseLimit{{PerWorkflow.ExecutionResponseLimit}}:::bound
107+
108+
PerWorkflow.ExecutionTimeout-->PerWorkflow.ExecutionResponseLimit
109+
end
110+
111+
subgraph ExecutionHelper.GetSecrets
112+
PerWorkflow.SecretsConcurrencyLimit([PerWorkflow.SecretsConcurrencyLimit]):::resource
113+
end
114+
subgraph ExecutionHelper.CallCapability
115+
PerWorkflow.ChainAllowed[/PerWorkflow.ChainAllowed\]:::gate
116+
PerWorkflow.CapabilityConcurrencyLimit([PerWorkflow.CapabilityConcurrencyLimit]):::resource
117+
PerWorkflow.CapabilityCallTimeout>PerWorkflow.CapabilityCallTimeout]:::time
118+
119+
PerWorkflow.ChainAllowed-->PerWorkflow.CapabilityConcurrencyLimit-->PerWorkflow.CapabilityCallTimeout
120+
end
121+
122+
subgraph actions
123+
direction TB
124+
125+
subgraph PerWorkflow.ChainWrite
126+
direction LR
127+
128+
TargetsLimit{{TargetsLimit}}:::bound
129+
ReportSizeLimit{{ReportSizeLimit}}:::bound
130+
131+
subgraph EVM
132+
GasLimit{{GasLimit}}:::bound
133+
end
134+
end
135+
subgraph PerWorkflow.ChainRead
136+
direction LR
137+
chainread.CallLimit{{CallLimit}}:::bound
138+
LogQueryBlockLimit{{LogQueryBlockLimit}}:::bound
139+
PayloadSizeLimit{{PayloadSizeLimit}}:::bound
140+
end
141+
subgraph PerWorkflow.Consensus
142+
ObservationSizeLimit{{ObservationSizeLimit}}:::bound
143+
consensus.CallLimit{{CallLimit}}:::bound
144+
end
145+
subgraph PerWorkflow.HTTPAction
146+
direction LR
147+
148+
httpaction.CallLimit{{CallLimit}}:::bound
149+
CacheAgeLimit{{CacheAgeLimit}}:::bound
150+
ConnectionTimeout{{ConnectionTimeout}}:::bound
151+
RequestSizeLimit{{RequestSizeLimit}}:::bound
152+
ResponseSizeLimit{{ResponseSizeLimit}}:::bound
153+
end
154+
subgraph PerWorkflow.Secrets
155+
secrets.CallLimit{{CallLimit}}:::bound
156+
end
157+
end
158+
subgraph vault
159+
VaultCiphertextSizeLimit{{VaultCiphertextSizeLimit}}:::bound
160+
VaultIdentifierKeySizeLimit{{VaultIdentifierKeySizeLimit}}:::bound
161+
VaultIdentifierOwnerSizeLimit{{VaultIdentifierOwnerSizeLimit}}:::bound
162+
VaultIdentifierNamespaceSizeLimit{{VaultIdentifierNamespaceSizeLimit}}:::bound
163+
VaultPluginBatchSizeLimit{{VaultPluginBatchSizeLimit}}:::bound
164+
VaultRequestBatchSizeLimit{{VaultRequestBatchSizeLimit}}:::bound
165+
PerOwner.VaultSecretsLimit{{PerOwner.VaultSecretsLimit}}:::bound
166+
end
167+
168+
handleRequest-->Store.FetchWorkflowArtifacts-->host.NewModule-->Engine.init-->Engine.runTriggerSubscriptionPhase-->triggers-->Engine.handleAllTriggerEvents-->Engine.startExecution
169+
Engine.startExecution-->ExecutionHelper.CallCapability-->actions
170+
Engine.startExecution-->PerWorkflow.SecretsConcurrencyLimit-->vault
171+
172+
classDef bound stroke:#f00
173+
classDef gate stroke:#0f0
174+
classDef queue stroke:#00f
175+
classDef rate stroke:#ff0
176+
classDef resource stroke:#f0f
177+
classDef time stroke:#0ff
178+
```

0 commit comments

Comments
 (0)