Skip to content

fix(bakups): fix merge resume issue when child is disk chain#9668

Open
spacotte-vates wants to merge 2 commits intomasterfrom
fix_resume_merge_disk_chain
Open

fix(bakups): fix merge resume issue when child is disk chain#9668
spacotte-vates wants to merge 2 commits intomasterfrom
fix_resume_merge_disk_chain

Conversation

@spacotte-vates
Copy link
Copy Markdown
Collaborator

Description

Short explanation of this PR (feel free to re-use commit message)

Checklist

  • Commit
    • Title follows commit conventions
    • Reference the relevant issue (Fixes #007, See xoa-support#42, See https://...)
    • If bug fix, add Introduced by
  • Changelog
    • If visible by XOA users, add changelog entry
    • Update "Packages to release" in CHANGELOG.unreleased.md
  • PR
    • If UI changes, add screenshots
    • If not finished or not tested, open as Draft

Review process

If you are an external contributor, you can skip this part. Simply create the pull request, and we'll get back to you as soon as possible.

This 2-passes review process aims to:

  • develop skills of junior reviewers
  • limit the workload for senior reviewers
  • limit the number of unnecessary changes by the author
  1. The author creates a PR.
  2. Review process:
    1. The author assigns the junior reviewer.
    2. The junior reviewer conducts their review:
      • Resolves their comments if they are addressed.
      • Adds comments if necessary or approves the PR.
    3. The junior reviewer assigns the senior reviewer.
    4. The senior reviewer conducts their review:
      • If there are no unresolved comments on the PR → merge.
      • Otherwise, we continue with 3.
  3. The author responds to comments and/or makes corrections, and we go back to 2.

Notes:

  1. The author can request a review at any time, even if the PR is still a Draft.
  2. In theory, there should not be more than one reviewer at a time.
  3. The author should not make any changes:
    • When a reviewer is assigned.
    • Between the junior and senior reviews.

Comment on lines +916 to +919
await parent.init({ force: isResumingMerge })
await child1.init({ force: isResumingMerge })
await child2.init({ force: isResumingMerge })
await childDiskChain.init({ force: isResumingMerge })
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think force is false by default no? We can secure it but I think it s

Suggested change
await parent.init({ force: isResumingMerge })
await child1.init({ force: isResumingMerge })
await child2.init({ force: isResumingMerge })
await childDiskChain.init({ force: isResumingMerge })
await parent.init({ force: false })
await child1.init({ force: false })
await child2.init({ force: false })
await childDiskChain.init({ force: false })

Copy link
Copy Markdown
Contributor

@pierrebrunet289 pierrebrunet289 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM
Just missing changelog

Comment on lines +955 to +958
await parent2.init({ force: isResumingMerge2 })
await child1b.init({ force: isResumingMerge2 })
await child2b.init({ force: isResumingMerge2 })
await childDiskChain2.init({ force: isResumingMerge2 })
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
await parent2.init({ force: isResumingMerge2 })
await child1b.init({ force: isResumingMerge2 })
await child2b.init({ force: isResumingMerge2 })
await childDiskChain2.init({ force: isResumingMerge2 })
await parent2.init({ force: true })
await child1b.init({ force: true })
await child2b.init({ force: true })
await childDiskChain2.init({ force: true })

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have confirmed that isResumingMerge is true immediatly above

Comment on lines 288 to 305
if (this.#removeUnused) {
await childDisk.unlink()
}

try {
await parentDisk.rename(mergeTargetPath)
} catch (error) {
// @ts-ignore
if (error.code === 'ENOENT' && this.#isResuming) {
// @ts-ignore
this.#logInfo(`the parent disk was already renamed`, {
parent: parentDisk.getPath(),
mergeTarget: mergeTargetPath,
})
} else {
throw error
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just an idea: To avoid a potential issue if merge is interrupted exactly at this moment (I think it is a rare possibility but still...)

Suggested change
try {
await parentDisk.rename(mergeTargetPath)
} catch (error) {
// @ts-ignore
if (error.code === 'ENOENT' && this.#isResuming) {
// @ts-ignore
this.#logInfo(`the parent disk was already renamed`, {
parent: parentDisk.getPath(),
mergeTarget: mergeTargetPath,
})
} else {
throw error
}
}
if (this.#removeUnused) {
await childDisk.unlink()
}
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is irrelevant to this PR, but can be a good idea as a separated, not in patch, PR

Comment on lines +212 to +215
this.#state.chain =
childPaths !== undefined
? [parentDisk.getPath(), ...childPaths].map(p => relativeFromFile(this.#statePath, p))
: undefined
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is a chain even if you merge only two disk , don't rely on the fallback mechanism of cleanVm

Comment on lines 288 to 305
if (this.#removeUnused) {
await childDisk.unlink()
}

try {
await parentDisk.rename(mergeTargetPath)
} catch (error) {
// @ts-ignore
if (error.code === 'ENOENT' && this.#isResuming) {
// @ts-ignore
this.#logInfo(`the parent disk was already renamed`, {
parent: parentDisk.getPath(),
mergeTarget: mergeTargetPath,
})
} else {
throw error
}
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is irrelevant to this PR, but can be a good idea as a separated, not in patch, PR

Comment on lines +955 to +958
await parent2.init({ force: isResumingMerge2 })
await child1b.init({ force: isResumingMerge2 })
await child2b.init({ force: isResumingMerge2 })
await childDiskChain2.init({ force: isResumingMerge2 })
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have confirmed that isResumingMerge is true immediatly above

Copy link
Copy Markdown
Contributor

@pierrebrunet289 pierrebrunet289 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just the changelogs to add as it is a patch

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.

3 participants