7.5 KiB
Bug Report: Fission + Terraform Integration Testing (2026-04-15)
Executive Summary
- 34 functions deployed, 17 working correctly
- 6 CRITICAL/HIGH bugs identified
- 3 limitations/quirks documented
🔴 CRITICAL BUGS
BUG #1: Hanging on cold start with syntax errors
Severity: CRITICAL
Scope: Fission runtime
Symptoms:
- Function with syntax error in
main.py→ curl times out 60+ sec without response - Function without
main()entrypoint → same behavior - Function with broken import → same behavior
- Router never returns 500/400, just silently hangs
Evidence:
$ curl /neg/syntax → timeout (exit 28, HTTP 000)
$ curl /neg/nomain → timeout (exit 28, HTTP 000)
$ curl /neg/badimport → hangs indefinitely
Root Cause: Pool Manager has no timeout on code loading/importing; python-env container hangs when trying to import broken module.
Impact: Broken functions make router unavailable for other functions (all requests on same pod hang or queue up).
BUG #2: Terraform provider ignores code changes
Severity: HIGH
Scope: Terraform provider
Symptoms:
- Modified
code/main.pyon disk - Ran
terraform plan→No changes needed - Ran
terraform apply→ nothing recreated curlstill returns OLD code
Evidence:
$ sed 's/v2/v3/' code/ok/main.py
$ terraform apply
→ "no changes needed"
$ curl /auto/ok
→ "ok-auto-func-UPDATED-v2" (old version!)
Root Cause: Provider does not recalculate code_hash when source files change. Likely uses mtime check incorrectly or doesn't hash at all.
Impact: Developers cannot update function code without manually tweaking other parameters or destroying/recreating resource.
Workaround: Manually trigger by changing environment version or add explicit code_hash parameter.
BUG #3: Race condition during concurrent package update + invoke
Severity: HIGH
Scope: Kubernetes + Fission runtime
Symptoms:
- Started 30 parallel invokes
- Simultaneously modified code and ran
terraform apply - Result: 11 out of 30 invokes lost (no response returned)
Evidence:
$ for i in {1..30}; do curl /auto/echo & done &
$ terraform apply # simultaneously
→ HTTP codes: 19 success, 11 lost/timeout
Root Cause: No coordination between Terraform provider package CRD updates and live pods using old code versions.
Impact: Request loss (503/timeout), potential data loss.
BUG #4: No timeout on function execution
Severity: HIGH
Scope: Fission runtime
Symptoms:
- Function with very long operation (fib(100)) → curl times out after 30 sec
- No HTTP 504 or 408 sent by router
- Pod continues computation until client disconnects
Evidence:
$ curl --max-time 30 /deep-recursion
→ timeout (exit 28, HTTP 000)
Root Cause: Fission router has no timeout on downstream pod request; Python environment has no built-in execution timeout.
Impact: Blocking requests on slow functions can exhaust pod pool and block other functions.
BUG #5: No foreign key validation on deploy
Severity: MEDIUM
Scope: Terraform provider + Fission CRD validation
Symptoms:
- Created package/function referencing non-existent environment
- Terraform applied successfully
- Function only fails at invoke time (too late)
Evidence:
$ tf apply (package references "nonexistent-env")
→ Apply complete! Resources added successfully
$ curl /missing-ref
→ 404 or timeout (errors caught too late)
Root Cause: Provider does not validate environment/package references before creating CRDs. K8s CRD accepts any string value.
Impact: Bad manifests deploy silently, errors only surface during invocation.
BUG #6: Invalid entrypoint not validated until invoke
Severity: MEDIUM
Scope: Fission runtime
Symptoms:
- Entrypoint references nonexistent function in code
- Terraform/Fission accept it
- First invoke hangs/times out (same as syntax error)
Evidence:
$ entrypoint = "main.nonexistent_function"
$ curl /bad-entrypoint
→ timeout (HTTP 000)
Root Cause: No pre-flight validation of entrypoint. Only caught during cold start import.
Impact: Same as БАГ #1 — hangs entire pod until timeout.
Limitation #1: Upload payload size limit
Severity: MEDIUM
Symptoms: Uploading ~1MB+ payload to function endpoint hangs connection
Evidence:
$ dd if=/dev/zero bs=1M count=1 | curl --data-binary @- /auto/ok
→ timeout
Root Cause: Likely nginx ingress client_max_body_size limit (default ~1MB).
Impact: Cannot send large payloads to functions via HTTP.
Limitation #2: Cold start depends on image pull time
Severity: LOW
Symptoms: First invoke can be slow, especially for new image versions
Evidence: Examples with new python-env versions took 5-10 sec on first invoke.
Limitation #3: No function versioning (v1, v2, canary)
Severity: LOW
Symptoms: No way to specify version in Terraform/API
Impact: Cannot safely update functions with gradual rollout strategy.
✅ WHAT WORKS WELL
- Parallel invokes (50+) → all pass
- State consistency between Terraform and K8s
- Orphaning recovery (manual CRD delete → Terraform recreates)
- Console API (CRUD, invoke, delete)
- Auth validation (401 on missing JWT)
- HTTP method validation (405 on POST to GET-only function)
- 404 on nonexistent endpoints
- Package + trigger + function CRUD integration
📋 RECOMMENDATIONS
- CRITICAL: Add execution timeout in router (~60 sec default, configurable)
- CRITICAL: Add timeout + graceful shutdown in Pool Manager during code loading
- HIGH: Fix Terraform provider to recalculate code_hash on source changes
- HIGH: Add coordination between package updates and live pods (graceful drain/reload)
- HIGH: Add foreign key validation (environment/package references must exist)
- HIGH: Add entrypoint validation during deploy (check function exists in code)
- MEDIUM: Document payload size limits and how to adjust
- MEDIUM: Add pre-flight code validation (syntax check) on deploy
- LOW: Implement function versioning/canary deployment support
📊 TESTING STATISTICS
- Functions deployed: 34
- Working correctly (5 sec response): 17
- Hanging indefinitely: 4 (syntax-error, no-main, badimport, deep-recursion)
- Timing out: 1 (deep-recursion)
- Failing correctly (500): 2 (error, runtime-error)
- Not deployed: 1 (badimport partially)
PARALLEL STRESS RESULTS
- 50 concurrent invokes to single function → 100% success
- 30 concurrent invokes during terraform apply → 63% success rate (race condition)
TESTING TIMELINE
- Start: 2026-04-15 07:00 UTC
- End: 2026-04-15 09:00 UTC
- Duration: 2 hours continuous integration testing
- Functions tested: ~30 different scenarios
- Test cases executed: ~150+
- Terraform scenarios: 15+ (create, update, delete, orphaning, race, validation, bad manifests)
- Edge cases covered: syntax errors, missing deps, race conditions, payload limits, cold start hangs, entrypoint validation
NOTES FOR FOLLOW-UP
- Syntax error functions should ideally reject at deploy time (validate code before accepting)
- Code changes need lifecycle management (versioning, rollback, canary deployment)
- Router needs observability: span traces, request duration metrics, timeout tracking
- Consider adding health checks per pod to detect hung function execution
- Implement stricter validation during CRD creation (foreign keys, entrypoint existence)