mirror of
https://github.com/vatesfr/xen-orchestra.git
synced 2026-11-09 17:06:13 -06:00
fix(disk-transform): fix getBlockIndexesCount
introduced by #10058 the current method assumes that source block are full but they can be sparse. In the worst case getBlockIndexesCount can be the same as the source
This commit is contained in:
committed by
Florent BEAUCHAMP
parent
e710135eda
commit
9140cd273b
@@ -67,22 +67,24 @@ export class DiskLargerBlock extends RandomAccessDisk {
|
||||
|
||||
getBlockIndexes(): Array<number> {
|
||||
const maxBlock = Math.ceil(this.getVirtualSize() / this.getBlockSize())
|
||||
const blockRatio = this.getBlockSize() / this.source.getBlockSize()
|
||||
const indexes = []
|
||||
for (let i = 0; i < maxBlock; i++) {
|
||||
for (let j = 0; j < blockRatio; j++) {
|
||||
if (this.source.hasBlock(i * blockRatio + j)) {
|
||||
indexes.push(i)
|
||||
break
|
||||
}
|
||||
if (this.hasBlock(i)) {
|
||||
indexes.push(i)
|
||||
}
|
||||
}
|
||||
return indexes
|
||||
}
|
||||
|
||||
getBlockIndexesCount(): number {
|
||||
let blockRatio = this.getBlockSize() / this.source.getBlockSize()
|
||||
return this.#source.getBlockIndexesCount() / blockRatio
|
||||
let count = 0
|
||||
const maxBlock = Math.ceil(this.getVirtualSize() / this.getBlockSize())
|
||||
for (let i = 0; i < maxBlock; i++) {
|
||||
if (this.hasBlock(i)) {
|
||||
count++
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
hasBlock(index: number): boolean {
|
||||
|
||||
@@ -237,6 +237,34 @@ test('close propagation', async () => {
|
||||
await disk.close()
|
||||
assert.strictEqual(source.closed, true)
|
||||
})
|
||||
test('getBlockIndexesCount', async () => {
|
||||
const block = createPatternBuffer(512, 'BLOCK')
|
||||
let source = new MockDisk(512, 4096, [
|
||||
[2, block],
|
||||
[3, block],
|
||||
])
|
||||
await source.init()
|
||||
|
||||
let disk = new DiskLargerBlock(source, 1024)
|
||||
await disk.init()
|
||||
assert.strictEqual(disk.getBlockIndexesCount(), 1)
|
||||
assert.strictEqual(disk.getBlockIndexesCount(), disk.getBlockIndexes().length)
|
||||
|
||||
await disk.close()
|
||||
|
||||
source = new MockDisk(512, 4096, [
|
||||
[0, block],
|
||||
[3, block],
|
||||
])
|
||||
await source.init()
|
||||
|
||||
disk = new DiskLargerBlock(source, 1024)
|
||||
await disk.init()
|
||||
assert.strictEqual(disk.getBlockIndexesCount(), 2)
|
||||
assert.strictEqual(disk.getBlockIndexesCount(), disk.getBlockIndexes().length)
|
||||
|
||||
await disk.close()
|
||||
})
|
||||
|
||||
test('generator', async () => {
|
||||
const source = new MockDisk(512, 1024)
|
||||
|
||||
Reference in New Issue
Block a user