Skip to content

Conversation

@ParidelPooya
Copy link
Contributor

Running Operations Tracking

What We Built:

  1. hasRunningOperations() method - Clean API to check if critical operations are running
  2. Internal tracking system - addRunningOperation() / removeRunningOperation() with Set-based storage
  3. Automatic cleanup - try/finally blocks ensure operations are removed even on errors

Where We Added Tracking (Only 2 Operations):

✅ ctx.step:
Executes user code
Critical for workflow state - if interrupted, workflow state becomes inconsistent

✅ ctx.waitForCondition:
Executes user condition checks
Critical for workflow logic - if interrupted, condition evaluation becomes unreliable

Why NOT Other Operations:

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext internally, which is safe to interrupt

Key Insight:

We only needed to add tracking to the 2 fundamental operations that execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

The Result:

// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate

Surgical precision - Only the 2 operations that actually execute user code are tracked! 🎯

- Add hasRunningOperations() method to DurableContext interface
- Track critical operations (ctx.step and ctx.waitForCondition) with try/finally cleanup
- Prevent termination during user code execution to avoid workflow state corruption
- Add unit test coverage for hasRunningOperations method

This enables safe termination checks:
if (durableContext.hasRunningOperations()) return; // Wait for critical ops
terminate(); // Safe to terminate
@ParidelPooya ParidelPooya merged commit d9d9e5c into development Sep 6, 2025
1 check passed
@ParidelPooya ParidelPooya deleted the feat/running-operations-tracking branch September 6, 2025 16:39
ParidelPooya added a commit that referenced this pull request Oct 10, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Oct 12, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Oct 24, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Oct 26, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Nov 2, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Nov 6, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Nov 6, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Nov 6, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
ParidelPooya added a commit that referenced this pull request Nov 7, 2025
)

## Running Operations Tracking

### **What We Built:**
1. hasRunningOperations() method - Clean API to check if critical
operations are running
2. Internal tracking system - addRunningOperation() /
removeRunningOperation() with Set-based storage
3. Automatic cleanup - try/finally blocks ensure operations are removed
even on errors

### **Where We Added Tracking (Only 2 Operations):**

✅ ctx.step:
• **Executes user code** 
• **Critical for workflow state** - if interrupted, workflow state
becomes inconsistent

✅ ctx.waitForCondition:
• **Executes user condition checks** 
• **Critical for workflow logic** - if interrupted, condition evaluation
becomes unreliable

### **Why NOT Other Operations:**

❌ ctx.runInChildContext - Safe to interrupt, just context management
❌ ctx.wait - Simple timer, no user code execution
❌ ctx.createCallback - Just creates callback config, no execution
❌ ctx.waitForCallback - Uses ctx.step internally, so already tracked
automatically
❌ ctx.map/parallel/executeConcurrently - Use ctx.runInChildContext
internally, which is safe to interrupt

### **Key Insight:**
We only needed to add tracking to the 2 fundamental operations that
execute user code:
• ctx.step - Direct user code execution
• ctx.waitForCondition - User condition evaluation

All other operations either:
• Are safe to interrupt (context/config operations)
• Delegate to tracked operations (so get protection automatically)

### **The Result:**
```typescript
// Safe termination check
if (durableContext.hasRunningOperations()) {
  return; // Critical user code is running - wait
}
terminate(); // Safe to terminate
```

Surgical precision - Only the 2 operations that actually execute user
code are tracked! 🎯

Co-authored-by: Pooya Paridel <parpooya@amazon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants