fix: ignore errors on dump/confirmPush for groups to avoid race cond

pull/3281/head
Audric Ackermann 4 months ago
parent 2e6f09cbec
commit 91a71f0604
No known key found for this signature in database

@ -79,9 +79,19 @@ async function confirmPushedAndDump(
assertUnreachable(namespace, 'buildAndSaveDumpsToDB assertUnreachable'); assertUnreachable(namespace, 'buildAndSaveDumpsToDB assertUnreachable');
} }
} }
try {
await MetaGroupWrapperActions.metaConfirmPushed(...toConfirm); await MetaGroupWrapperActions.metaConfirmPushed(...toConfirm);
return LibSessionUtil.saveDumpsToDb(groupPk); await LibSessionUtil.saveDumpsToDb(groupPk);
} catch (e) {
// The reason we catch exception here is because sometimes we can have a race condition where
// - we push a change to the group (req1 takes 10s)
// - while req1 is running, a poll merge results with the group marked as destroyed
// - this means we have free the wrapper
// - then, req finishes, and tries to metaConfirmPushed/saveDumpsToDb which fails as the wrapper was freed.
window.log.warn(
`metaConfirmPushed/saveDumpsToDb for group ${ed25519Str(groupPk)} failed with ${e.message}. This can safely be ignored` // I hope
);
}
} }
async function pushChangesToGroupSwarmIfNeeded({ async function pushChangesToGroupSwarmIfNeeded({

@ -345,21 +345,32 @@ function batchResultsToUserSuccessfulChange(
async function saveDumpsToDb(pubkey: PubkeyType | GroupPubkeyType) { async function saveDumpsToDb(pubkey: PubkeyType | GroupPubkeyType) {
// first check if this is relating a group // first check if this is relating a group
if (PubKey.is03Pubkey(pubkey)) { if (PubKey.is03Pubkey(pubkey)) {
const metaNeedsDump = await MetaGroupWrapperActions.needsDump(pubkey); try {
// save the concatenated dumps as a single entry in the DB if any of the dumps had a need for dump const metaNeedsDump = await MetaGroupWrapperActions.needsDump(pubkey);
if (metaNeedsDump) { // save the concatenated dumps as a single entry in the DB if any of the dumps had a need for dump
window.log.debug(`About to make and save dumps for metagroup ${ed25519Str(pubkey)}`); if (metaNeedsDump) {
window.log.debug(`About to make and save dumps for metagroup ${ed25519Str(pubkey)}`);
const dump = await MetaGroupWrapperActions.metaDump(pubkey);
await ConfigDumpData.saveConfigDump({ const dump = await MetaGroupWrapperActions.metaDump(pubkey);
data: dump, await ConfigDumpData.saveConfigDump({
publicKey: pubkey, data: dump,
variant: `MetaGroupConfig-${pubkey}`, publicKey: pubkey,
}); variant: `MetaGroupConfig-${pubkey}`,
});
window.log.info(`Saved dumps for metagroup ${ed25519Str(pubkey)}`);
} else { window.log.info(`Saved dumps for metagroup ${ed25519Str(pubkey)}`);
window.log.debug(`No need to update local dumps for metagroup ${ed25519Str(pubkey)}`); } else {
window.log.debug(`No need to update local dumps for metagroup ${ed25519Str(pubkey)}`);
}
} catch (e) {
// The reason we catch exception here is because sometimes we can have a race condition where
// - we push a change to the group (req1 takes 10s)
// - while req1 is running, a poll merge results with the group marked as destroyed
// - this means we have to free the wrapper
// - then, req finishes, and tries to saveDumpsToDb which fails as the wrapper was freed.
window.log.warn(
`saveDumpsToDb for group ${ed25519Str(pubkey)} failed with ${e.message}. This can safely be ignored` // I hope
);
} }
return; return;
} }

Loading…
Cancel
Save