feat(xo-server/backup NG): merge VHD in a worker (#2799)
This commit is contained in:
parent
ed5e0c3509
commit
0d718bd632
@ -69,6 +69,7 @@
|
||||
"http-server-plus": "^0.9.0",
|
||||
"human-format": "^0.10.0",
|
||||
"is-redirect": "^1.0.0",
|
||||
"jest-worker": "^22.4.3",
|
||||
"js-yaml": "^3.10.0",
|
||||
"json-rpc-peer": "^0.15.3",
|
||||
"json5": "^1.0.0",
|
||||
|
25
packages/xo-server/src/remote-handlers/index.js
Normal file
25
packages/xo-server/src/remote-handlers/index.js
Normal 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)
|
||||
}
|
@ -25,7 +25,7 @@ import {
|
||||
safeDateFormat,
|
||||
serializeError,
|
||||
} from '../../utils'
|
||||
import mergeVhd, {
|
||||
import {
|
||||
chainVhd,
|
||||
createReadStream as createVhdReadStream,
|
||||
readVhdMetadata,
|
||||
@ -308,6 +308,7 @@ export default class BackupNg {
|
||||
getJob: (id: string, 'backup') => Promise<BackupJob>,
|
||||
updateJob: ($Shape<BackupJob>) => Promise<BackupJob>,
|
||||
removeJob: (id: string) => Promise<void>,
|
||||
worker: $Dict<any>,
|
||||
}
|
||||
|
||||
constructor (app: any) {
|
||||
@ -1044,7 +1045,12 @@ export default class BackupNg {
|
||||
$defer.onFailure.call(handler, 'unlink', 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)
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,7 @@
|
||||
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 { getHandler } from '../remote-handlers'
|
||||
import { Remotes } from '../models/remote'
|
||||
|
||||
// ===================================================================
|
||||
@ -40,20 +38,7 @@ export default class {
|
||||
throw new Error('remote is disabled')
|
||||
}
|
||||
|
||||
const HANDLERS = {
|
||||
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)
|
||||
return getHandler(remote)
|
||||
}
|
||||
|
||||
async testRemote (remote) {
|
||||
|
14
packages/xo-server/src/xo-mixins/workers/index.js
Normal file
14
packages/xo-server/src/xo-mixins/workers/index.js
Normal 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())
|
||||
}
|
||||
}
|
18
packages/xo-server/src/xo-mixins/workers/worker.js
Normal file
18
packages/xo-server/src/xo-mixins/workers/worker.js
Normal 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
|
||||
)
|
||||
}
|
15
yarn.lock
15
yarn.lock
@ -4313,7 +4313,7 @@ eslint@^4.14.0:
|
||||
doctrine "^2.1.0"
|
||||
eslint-scope "^3.7.1"
|
||||
eslint-visitor-keys "^1.0.0"
|
||||
espree "^3.5.4"
|
||||
espree "^3.5.2"
|
||||
esquery "^1.0.0"
|
||||
esutils "^2.0.2"
|
||||
file-entry-cache "^2.0.0"
|
||||
@ -4335,7 +4335,6 @@ eslint@^4.14.0:
|
||||
path-is-inside "^1.0.2"
|
||||
pluralize "^7.0.0"
|
||||
progress "^2.0.0"
|
||||
regexpp "^1.0.1"
|
||||
require-uncached "^1.0.3"
|
||||
semver "^5.3.0"
|
||||
strip-ansi "^4.0.0"
|
||||
@ -4343,7 +4342,7 @@ eslint@^4.14.0:
|
||||
table "4.0.2"
|
||||
text-table "~0.2.0"
|
||||
|
||||
espree@^3.5.4:
|
||||
espree@^3.5.2:
|
||||
version "3.5.4"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
|
||||
dependencies:
|
||||
@ -6769,6 +6768,12 @@ jest-worker@^22.2.2:
|
||||
dependencies:
|
||||
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:
|
||||
version "22.4.2"
|
||||
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"
|
||||
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:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
|
||||
|
Loading…
Reference in New Issue
Block a user