3. Idempotentie in CW
● Functionele programmeertalen
● Netwerktoepassingen
○ Verloren berichten
“Idempotent Means It’s OK to Arrive Multiple Times”, Pat Helland
● HTTP
○ Idempotent: GET, PUT, DELETE
○ Niet idempotent: POST
● Scope (vb. logging)
4. Eenvoudige oplossing
● Enkel eerste keer uitvoeren
○ Message / task-id
○ Testen of al eerder uitgevoerd.
● Wat in het geval van fouten?
○ Gedeeltelijke uitvoering?
5. Idempotentie
Een programma is idempotent als het zijn input niet overschrijft.
Start
Write
Start
Write
Read
Start
Read
Write
Idempotent
Idempotent
NOT Idempotent
6. Dynamische idempotentie
● Eerste idee
Wanneer een input overschreven wordt, hou dan de originele waarde bij.
○ Probleem: detecteren inputs
● Vereenvoudiging
Wanneer een waarde overschreven wordt, die niet afkomstig is van de
actieve taak, hou dan de originele waarde bij.
7. Input versioning - Concept
● Hou bij tijdens welke taak de laatste write gebeurde
● Buiten task: normale uitvoering
● In task T:
○ Write: Als huidige inhoud niet geschreven is door T,
neem een input snapshot als er nog geen bestaat.
○ Read: Als de huidige inhoud geschreven is door een
vorige uitvoering van T, gebruik het input snapshot.
8. Input versioning - Example
Timeline
Variables
Snapshots
A
Task 1 Inputs
A
Task 1
1st run
B
1
2 3
3’
4 5
A
Task 1 Inputs
A
Task 1
2nd run
B
6
7
6’
8 9
1 task, 2 data fields (A, B)
1. Write initial input
2. Read stored A
3. Write stored A
3’. Snapshot original A
4. Read stored A
5. Read stored B
6. Read input A
6’. Read A from snapshot
7. Write stored A
8. Read stored A
9. Read stored B
9. Implementatie
● Postsharp
○ AOP framework
○ Compile-time weaving
● LocationInterceptionAspect
○ Intercepts get & set for fields and properties
○ IInstanceScopedAspect