Orchestration functions live in one process-wide map; two Runtime objects that register the same name share one function
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 58/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- javascript
- Domaine
- backend, distributed-systems
Piste de recherche
Start in lib/duroxide.js at the module-level map, registerOrchestration, registerOrchestrationVersioned, and createGenerator. Run the two-Runtime reproduction using separate SQLite stores and trace how each Runtime registers its create callback. Done means identical orchestration names can resolve to different functions per Runtime without changing activity behavior or causing cross-runtime replay failures.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
registerOrchestration stores the generator function in a module-level Map, keyed by name or by name@version. Every Runtime in the process shares that map. If two Runtime objects register the same orchestration name, both run the function that was registered last.
Where
- The map: https://github.com/microsoft/duroxide-node/blob/9fb6b853f6fa0d84da81e761e4c0bf288217f70d/lib/duroxide.js#L26
- The writes in
registerOrchestrationandregisterOrchestrationVersioned: https://github.com/microsoft/duroxide-node/blob/9fb6b853f6fa0d84da81e761e4c0bf288217f70d/lib/duroxide.js#L1141 and https://github.com/microsoft/duroxide-node/blob/9fb6b853f6fa0d84da81e761e4c0bf288217f70d/lib/duroxide.js#L1183 - The lookup in
createGenerator: https://github.com/microsoft/duroxide-node/blob/9fb6b853f6fa0d84da81e761e4c0bf288217f70d/lib/duroxide.js#L44
Reproduction
const pA = await SqliteProvider.open('sqlite:/tmp/a.db');
const pB = await SqliteProvider.open('sqlite:/tmp/b.db');
const rtA = new Runtime(pA);
const rtB = new Runtime(pB);
rtA.registerOrchestration('Greet', function* () { return 'from runtime A'; });
rtB.registerOrchestration('Greet', function* () { return 'from runtime B'; });
await rtA.start();
await rtB.start();
const cA = new Client(pA);
await cA.startOrchestration('on-a', 'Greet', null);
const a = await cA.waitForOrchestration('on-a', 10000);
// The instance is in store A. Only runtime A can run it.
// a.output is "from runtime B".
Activities do not have this problem. Each Runtime passes its activity callbacks to its own native runtime.
Impact
- Two runtimes in one process cannot use the same orchestration name with different code. Examples are one runtime per store or per tenant, and two test fixtures in one test process. The wrong code runs, and there is no error.
- If the two functions differ, a replay can also fail with a nondeterminism error.
Suggested fix
Keep the map per Runtime. For example, each Runtime registers its own create callback, and that callback looks up the function in the map of its Runtime.
Tracked in microsoft/duroxide#55.
- Langage dominant
- JavaScript
- Étoiles
- 36
- Forks
- 20
- Merge moyen
- 20 h 52 min
- PR mergées (30 j)
- 4
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/duroxide-node
-
bug
Difficulté 3/5 1-2 jours Accessibilité débutants 65/100
microsoft/duroxide-node#19 ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 28/100
microsoft/duroxide-node#16 ·
Toutes les issues de microsoft/duroxide-node
Issues similaires
-
[DevEx]: Playground specs are excluded from both GUI and CI, so videoPlayground is unreachableOuvertedev experience
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
cuttle-cards/cuttle#1413 ·
Les mainteneurs répondent en général sous 1 jour
-
macOS
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
beyondcode/herd-community#1761 ·
-
More wallpapersOuverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
-
Make a dry lesson funOuvertecontent good first issue hacktoberfest
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
vieanderes/understory#19 ·
-
automated issue report
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
lirantal/discoprint#37 ·
Les mainteneurs répondent en général sous 1 jour