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",
|
"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",
|
||||||
|
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,
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
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"
|
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"
|
||||||
|
Loading…
Reference in New Issue
Block a user