mirror of
https://github.com/vatesfr/xen-orchestra.git
synced 2026-11-09 17:06:13 -06:00
feat(backups): add progress to incremental mirror (#9901)
This commit is contained in:
committed by
GitHub
parent
d8094a71e2
commit
8939a2deeb
@@ -1,4 +1,4 @@
|
||||
import { ProgressHandler } from './ProgressHandler.mjs'
|
||||
import { ComposedProgressHandler, ProgressHandler } from './ProgressHandler.mjs'
|
||||
|
||||
export type DiskBlockData = Buffer
|
||||
export type DiskBlock = {
|
||||
@@ -11,7 +11,11 @@ export type BytesLength = number
|
||||
export abstract class Disk {
|
||||
#generatedDiskBlocks = 0
|
||||
#parent?: Disk
|
||||
progressHandler?: ProgressHandler
|
||||
#progressHandler = new ComposedProgressHandler()
|
||||
|
||||
get progressHandler(): ProgressHandler {
|
||||
return this.#progressHandler
|
||||
}
|
||||
get parent(): Disk | undefined {
|
||||
return this.#parent
|
||||
}
|
||||
@@ -66,9 +70,9 @@ export abstract class Disk {
|
||||
return Promise.resolve(true)
|
||||
}
|
||||
|
||||
// @todo readRawData will be needed for file level restore
|
||||
// @todo rename will be needed for merge
|
||||
// @todo : should the alias part moved from remote/vhd ?
|
||||
addProgressHandler(progressHandler: ProgressHandler) {
|
||||
this.#progressHandler.add(progressHandler)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,12 +42,12 @@ test('Disk class', async t => {
|
||||
|
||||
await t.test('diskBlocks calls progressHandler.done when consumer exits early', async () => {
|
||||
let doneCalled = false
|
||||
disk.progressHandler = {
|
||||
disk.addProgressHandler({
|
||||
setProgress: async () => {},
|
||||
done: async () => {
|
||||
doneCalled = true
|
||||
},
|
||||
}
|
||||
})
|
||||
disk.blocks[4] = true
|
||||
disk.blocks[5] = true
|
||||
disk.blocks[6] = true
|
||||
|
||||
@@ -2,3 +2,17 @@ export interface ProgressHandler {
|
||||
setProgress(total: number): void | Promise<void>
|
||||
done(): void | Promise<void>
|
||||
}
|
||||
|
||||
export class ComposedProgressHandler implements ProgressHandler {
|
||||
#handlers: Array<ProgressHandler> = []
|
||||
async setProgress(total: number) {
|
||||
await Promise.all(this.#handlers.map(handler => handler.setProgress(total)))
|
||||
}
|
||||
async done() {
|
||||
await Promise.all(this.#handlers.map(handler => handler.done()))
|
||||
}
|
||||
|
||||
add(handler: ProgressHandler) {
|
||||
this.#handlers.push(handler)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user