feat(xo-server/backup NG): merge VHD in a worker (#2799)

This commit is contained in:
Julien Fontanet 2018-03-27 10:13:05 +02:00 committed by GitHub
parent ed5e0c3509
commit 0d718bd632
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 76 additions and 26 deletions

View File

@ -69,6 +69,7 @@
"http-server-plus": "^0.9.0", "http-server-plus": "^0.9.0",
"human-format": "^0.10.0", "human-format": "^0.10.0",
"is-redirect": "^1.0.0", "is-redirect": "^1.0.0",
"jest-worker": "^22.4.3",
"js-yaml": "^3.10.0", "js-yaml": "^3.10.0",
"json-rpc-peer": "^0.15.3", "json-rpc-peer": "^0.15.3",
"json5": "^1.0.0", "json5": "^1.0.0",

View File

@ -0,0 +1,25 @@
// @flow
import type RemoteHandler from './abstract'
import RemoteHandlerLocal from './local'
import RemoteHandlerNfs from './nfs'
import RemoteHandlerSmb from './smb'
export type Remote = { url: string }
const HANDLERS = {
file: RemoteHandlerLocal,
smb: RemoteHandlerSmb,
nfs: RemoteHandlerNfs,
}
export const getHandler = (remote: Remote): RemoteHandler => {
// FIXME: should be done in xo-remote-parser.
const type = remote.url.split('://')[0]
const Handler = HANDLERS[type]
if (!Handler) {
throw new Error('Unhandled remote type')
}
return new Handler(remote)
}

View File

@ -25,7 +25,7 @@ import {
safeDateFormat, safeDateFormat,
serializeError, serializeError,
} from '../../utils' } from '../../utils'
import mergeVhd, { import {
chainVhd, chainVhd,
createReadStream as createVhdReadStream, createReadStream as createVhdReadStream,
readVhdMetadata, readVhdMetadata,
@ -308,6 +308,7 @@ export default class BackupNg {
getJob: (id: string, 'backup') => Promise<BackupJob>, getJob: (id: string, 'backup') => Promise<BackupJob>,
updateJob: ($Shape<BackupJob>) => Promise<BackupJob>, updateJob: ($Shape<BackupJob>) => Promise<BackupJob>,
removeJob: (id: string) => Promise<void>, removeJob: (id: string) => Promise<void>,
worker: $Dict<any>,
} }
constructor (app: any) { constructor (app: any) {
@ -1044,7 +1045,12 @@ export default class BackupNg {
$defer.onFailure.call(handler, 'unlink', path) $defer.onFailure.call(handler, 'unlink', path)
const childPath = child.path const childPath = child.path
await mergeVhd(handler, path, handler, childPath) await this._app.worker.mergeVhd(
handler._remote,
path,
handler._remote,
childPath
)
await handler.rename(path, childPath) await handler.rename(path, childPath)
} }

View File

@ -1,9 +1,7 @@
import { noSuchObject } from 'xo-common/api-errors' import { noSuchObject } from 'xo-common/api-errors'
import RemoteHandlerLocal from '../remote-handlers/local'
import RemoteHandlerNfs from '../remote-handlers/nfs'
import RemoteHandlerSmb from '../remote-handlers/smb'
import { forEach, mapToArray } from '../utils' import { forEach, mapToArray } from '../utils'
import { getHandler } from '../remote-handlers'
import { Remotes } from '../models/remote' import { Remotes } from '../models/remote'
// =================================================================== // ===================================================================
@ -40,20 +38,7 @@ export default class {
throw new Error('remote is disabled') throw new Error('remote is disabled')
} }
const HANDLERS = { return getHandler(remote)
file: RemoteHandlerLocal,
smb: RemoteHandlerSmb,
nfs: RemoteHandlerNfs,
}
// FIXME: should be done in xo-remote-parser.
const type = remote.url.split('://')[0]
const Handler = HANDLERS[type]
if (!Handler) {
throw new Error('Unhandled remote type')
}
return new Handler(remote)
} }
async testRemote (remote) { async testRemote (remote) {

View File

@ -0,0 +1,14 @@
import Worker from 'jest-worker'
export default class Workers {
get worker () {
return this._worker
}
constructor (app) {
app.on('start', () => {
this._worker = new Worker(require.resolve('./worker'))
})
app.on('stop', () => this._worker.end())
}
}

View File

@ -0,0 +1,18 @@
// @flow
import mergeVhd_ from '../../vhd-merge'
import { type Remote, getHandler } from '../../remote-handlers'
export function mergeVhd (
parentRemote: Remote,
parentPath: string,
childRemote: Remote,
childPath: string
) {
return mergeVhd_(
getHandler(parentRemote),
parentPath,
getHandler(childRemote),
childPath
)
}

View File

@ -4313,7 +4313,7 @@ eslint@^4.14.0:
doctrine "^2.1.0" doctrine "^2.1.0"
eslint-scope "^3.7.1" eslint-scope "^3.7.1"
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.0.0"
espree "^3.5.4" espree "^3.5.2"
esquery "^1.0.0" esquery "^1.0.0"
esutils "^2.0.2" esutils "^2.0.2"
file-entry-cache "^2.0.0" file-entry-cache "^2.0.0"
@ -4335,7 +4335,6 @@ eslint@^4.14.0:
path-is-inside "^1.0.2" path-is-inside "^1.0.2"
pluralize "^7.0.0" pluralize "^7.0.0"
progress "^2.0.0" progress "^2.0.0"
regexpp "^1.0.1"
require-uncached "^1.0.3" require-uncached "^1.0.3"
semver "^5.3.0" semver "^5.3.0"
strip-ansi "^4.0.0" strip-ansi "^4.0.0"
@ -4343,7 +4342,7 @@ eslint@^4.14.0:
table "4.0.2" table "4.0.2"
text-table "~0.2.0" text-table "~0.2.0"
espree@^3.5.4: espree@^3.5.2:
version "3.5.4" version "3.5.4"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
dependencies: dependencies:
@ -6769,6 +6768,12 @@ jest-worker@^22.2.2:
dependencies: dependencies:
merge-stream "^1.0.1" merge-stream "^1.0.1"
jest-worker@^22.4.3:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b"
dependencies:
merge-stream "^1.0.1"
jest@^22.0.4: jest@^22.0.4:
version "22.4.2" version "22.4.2"
resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20" resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20"
@ -9913,10 +9918,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2" extend-shallow "^3.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
regexpp@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43"
regexpu-core@^2.0.0: regexpu-core@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"