239 lines
7.5 KiB
Markdown
239 lines
7.5 KiB
Markdown
# 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.py` on disk
|
|
- Ran `terraform plan` → `No changes needed`
|
|
- Ran `terraform apply` → nothing recreated
|
|
- `curl` still 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
|
|
|
|
1. **CRITICAL:** Add execution timeout in router (~60 sec default, configurable)
|
|
2. **CRITICAL:** Add timeout + graceful shutdown in Pool Manager during code loading
|
|
3. **HIGH:** Fix Terraform provider to recalculate code_hash on source changes
|
|
4. **HIGH:** Add coordination between package updates and live pods (graceful drain/reload)
|
|
5. **HIGH:** Add foreign key validation (environment/package references must exist)
|
|
6. **HIGH:** Add entrypoint validation during deploy (check function exists in code)
|
|
7. **MEDIUM:** Document payload size limits and how to adjust
|
|
8. **MEDIUM:** Add pre-flight code validation (syntax check) on deploy
|
|
9. **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)
|