diff --git a/packages/xo-server/package.json b/packages/xo-server/package.json index f43596038..4890411ea 100644 --- a/packages/xo-server/package.json +++ b/packages/xo-server/package.json @@ -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", diff --git a/packages/xo-server/src/remote-handlers/index.js b/packages/xo-server/src/remote-handlers/index.js new file mode 100644 index 000000000..c43db88a2 --- /dev/null +++ b/packages/xo-server/src/remote-handlers/index.js @@ -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) +} diff --git a/packages/xo-server/src/xo-mixins/backups-ng/index.js b/packages/xo-server/src/xo-mixins/backups-ng/index.js index cf59d8ce9..d9fb0418b 100644 --- a/packages/xo-server/src/xo-mixins/backups-ng/index.js +++ b/packages/xo-server/src/xo-mixins/backups-ng/index.js @@ -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, updateJob: ($Shape) => Promise, removeJob: (id: string) => Promise, + worker: $Dict, } 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) } diff --git a/packages/xo-server/src/xo-mixins/remotes.js b/packages/xo-server/src/xo-mixins/remotes.js index 82f576007..460cc36d4 100644 --- a/packages/xo-server/src/xo-mixins/remotes.js +++ b/packages/xo-server/src/xo-mixins/remotes.js @@ -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) { diff --git a/packages/xo-server/src/xo-mixins/workers/index.js b/packages/xo-server/src/xo-mixins/workers/index.js new file mode 100644 index 000000000..801c6f205 --- /dev/null +++ b/packages/xo-server/src/xo-mixins/workers/index.js @@ -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()) + } +} diff --git a/packages/xo-server/src/xo-mixins/workers/worker.js b/packages/xo-server/src/xo-mixins/workers/worker.js new file mode 100644 index 000000000..a86688793 --- /dev/null +++ b/packages/xo-server/src/xo-mixins/workers/worker.js @@ -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 + ) +} diff --git a/yarn.lock b/yarn.lock index 09aa5ddcc..9466bbb6e 100644 --- a/yarn.lock +++ b/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"