@cloudant/couchbackup 2.9.10-SNAPSHOT.112 → 2.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/analysis.log +1 -1
- package/.scannerwork/scanner-report/changesets-2.pb +1 -0
- package/.scannerwork/scanner-report/changesets-3.pb +1 -0
- package/.scannerwork/scanner-report/changesets-52.pb +1 -0
- package/.scannerwork/scanner-report/changesets-56.pb +1 -0
- package/.scannerwork/scanner-report/changesets-67.pb +1 -0
- package/.scannerwork/scanner-report/changesets-68.pb +1 -0
- package/.scannerwork/scanner-report/component-1.pb +2 -2
- package/.scannerwork/scanner-report/component-10.pb +1 -1
- package/.scannerwork/scanner-report/component-11.pb +1 -1
- package/.scannerwork/scanner-report/component-12.pb +1 -1
- package/.scannerwork/scanner-report/component-13.pb +1 -1
- package/.scannerwork/scanner-report/component-14.pb +1 -1
- package/.scannerwork/scanner-report/component-15.pb +1 -1
- package/.scannerwork/scanner-report/component-19.pb +1 -1
- package/.scannerwork/scanner-report/component-2.pb +1 -0
- package/.scannerwork/scanner-report/component-20.pb +1 -1
- package/.scannerwork/scanner-report/component-21.pb +1 -1
- package/.scannerwork/scanner-report/component-22.pb +1 -1
- package/.scannerwork/scanner-report/component-23.pb +1 -1
- package/.scannerwork/scanner-report/component-24.pb +1 -1
- package/.scannerwork/scanner-report/component-25.pb +1 -1
- package/.scannerwork/scanner-report/component-26.pb +1 -1
- package/.scannerwork/scanner-report/component-27.pb +1 -1
- package/.scannerwork/scanner-report/component-28.pb +1 -1
- package/.scannerwork/scanner-report/component-29.pb +1 -1
- package/.scannerwork/scanner-report/component-3.pb +1 -0
- package/.scannerwork/scanner-report/component-30.pb +1 -1
- package/.scannerwork/scanner-report/component-31.pb +1 -1
- package/.scannerwork/scanner-report/component-32.pb +1 -1
- package/.scannerwork/scanner-report/component-33.pb +1 -1
- package/.scannerwork/scanner-report/component-35.pb +1 -1
- package/.scannerwork/scanner-report/component-4.pb +1 -1
- package/.scannerwork/scanner-report/component-47.pb +1 -1
- package/.scannerwork/scanner-report/component-48.pb +1 -1
- package/.scannerwork/scanner-report/component-49.pb +1 -1
- package/.scannerwork/scanner-report/component-5.pb +1 -1
- package/.scannerwork/scanner-report/component-50.pb +1 -1
- package/.scannerwork/scanner-report/component-51.pb +1 -1
- package/.scannerwork/scanner-report/component-52.pb +1 -0
- package/.scannerwork/scanner-report/component-54.pb +1 -1
- package/.scannerwork/scanner-report/component-56.pb +1 -1
- package/.scannerwork/scanner-report/component-59.pb +1 -1
- package/.scannerwork/scanner-report/component-6.pb +1 -1
- package/.scannerwork/scanner-report/component-60.pb +1 -1
- package/.scannerwork/scanner-report/component-65.pb +1 -1
- package/.scannerwork/scanner-report/component-66.pb +1 -1
- package/.scannerwork/scanner-report/component-67.pb +1 -0
- package/.scannerwork/scanner-report/component-68.pb +1 -0
- package/.scannerwork/scanner-report/component-7.pb +1 -1
- package/.scannerwork/scanner-report/component-8.pb +1 -1
- package/.scannerwork/scanner-report/component-9.pb +1 -1
- package/.scannerwork/scanner-report/coverages-10.pb +0 -0
- package/.scannerwork/scanner-report/coverages-11.pb +0 -0
- package/.scannerwork/scanner-report/coverages-12.pb +0 -0
- package/.scannerwork/scanner-report/coverages-13.pb +0 -0
- package/.scannerwork/scanner-report/coverages-14.pb +0 -0
- package/.scannerwork/scanner-report/coverages-15.pb +0 -0
- package/.scannerwork/scanner-report/coverages-19.pb +0 -0
- package/.scannerwork/scanner-report/coverages-20.pb +0 -0
- package/.scannerwork/scanner-report/coverages-21.pb +0 -0
- package/.scannerwork/scanner-report/coverages-22.pb +0 -0
- package/.scannerwork/scanner-report/coverages-23.pb +0 -0
- package/.scannerwork/scanner-report/coverages-24.pb +0 -0
- package/.scannerwork/scanner-report/coverages-25.pb +0 -0
- package/.scannerwork/scanner-report/coverages-26.pb +0 -0
- package/.scannerwork/scanner-report/coverages-27.pb +0 -0
- package/.scannerwork/scanner-report/coverages-28.pb +0 -0
- package/.scannerwork/scanner-report/coverages-29.pb +0 -0
- package/.scannerwork/scanner-report/coverages-3.pb +0 -0
- package/.scannerwork/scanner-report/coverages-30.pb +0 -0
- package/.scannerwork/scanner-report/coverages-31.pb +0 -0
- package/.scannerwork/scanner-report/coverages-32.pb +0 -0
- package/.scannerwork/scanner-report/coverages-33.pb +0 -0
- package/.scannerwork/scanner-report/coverages-35.pb +0 -0
- package/.scannerwork/scanner-report/coverages-4.pb +0 -0
- package/.scannerwork/scanner-report/coverages-47.pb +0 -0
- package/.scannerwork/scanner-report/coverages-48.pb +0 -0
- package/.scannerwork/scanner-report/coverages-49.pb +0 -0
- package/.scannerwork/scanner-report/coverages-5.pb +0 -0
- package/.scannerwork/scanner-report/coverages-50.pb +0 -0
- package/.scannerwork/scanner-report/coverages-51.pb +0 -0
- package/.scannerwork/scanner-report/coverages-52.pb +0 -0
- package/.scannerwork/scanner-report/coverages-56.pb +0 -0
- package/.scannerwork/scanner-report/coverages-59.pb +0 -0
- package/.scannerwork/scanner-report/coverages-6.pb +0 -0
- package/.scannerwork/scanner-report/coverages-60.pb +0 -0
- package/.scannerwork/scanner-report/coverages-67.pb +0 -0
- package/.scannerwork/scanner-report/coverages-7.pb +0 -0
- package/.scannerwork/scanner-report/coverages-8.pb +0 -0
- package/.scannerwork/scanner-report/coverages-9.pb +0 -0
- package/.scannerwork/scanner-report/duplications-2.pb +2 -0
- package/.scannerwork/scanner-report/duplications-21.pb +3 -0
- package/.scannerwork/scanner-report/duplications-22.pb +0 -3
- package/.scannerwork/scanner-report/duplications-23.pb +0 -2
- package/.scannerwork/scanner-report/duplications-27.pb +2 -0
- package/.scannerwork/scanner-report/duplications-29.pb +2 -0
- package/.scannerwork/scanner-report/duplications-32.pb +3 -0
- package/.scannerwork/scanner-report/duplications-35.pb +0 -3
- package/.scannerwork/scanner-report/duplications-4.pb +2 -0
- package/.scannerwork/scanner-report/duplications-48.pb +0 -3
- package/.scannerwork/scanner-report/duplications-49.pb +0 -2
- package/.scannerwork/scanner-report/duplications-5.pb +0 -2
- package/.scannerwork/scanner-report/duplications-52.pb +3 -0
- package/.scannerwork/scanner-report/duplications-59.pb +2 -0
- package/.scannerwork/scanner-report/duplications-60.pb +2 -0
- package/.scannerwork/scanner-report/duplications-68.pb +0 -0
- package/.scannerwork/scanner-report/measures-10.pb +0 -0
- package/.scannerwork/scanner-report/measures-11.pb +0 -0
- package/.scannerwork/scanner-report/measures-12.pb +0 -0
- package/.scannerwork/scanner-report/measures-13.pb +0 -0
- package/.scannerwork/scanner-report/measures-14.pb +0 -0
- package/.scannerwork/scanner-report/measures-15.pb +0 -0
- package/.scannerwork/scanner-report/measures-19.pb +0 -0
- package/.scannerwork/scanner-report/measures-20.pb +0 -0
- package/.scannerwork/scanner-report/measures-21.pb +0 -0
- package/.scannerwork/scanner-report/measures-22.pb +0 -0
- package/.scannerwork/scanner-report/measures-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-24.pb +0 -0
- package/.scannerwork/scanner-report/measures-25.pb +0 -0
- package/.scannerwork/scanner-report/measures-26.pb +0 -0
- package/.scannerwork/scanner-report/measures-27.pb +0 -0
- package/.scannerwork/scanner-report/measures-28.pb +0 -0
- package/.scannerwork/scanner-report/measures-29.pb +0 -0
- package/.scannerwork/scanner-report/measures-3.pb +16 -0
- package/.scannerwork/scanner-report/measures-30.pb +0 -0
- package/.scannerwork/scanner-report/measures-31.pb +0 -0
- package/.scannerwork/scanner-report/measures-32.pb +0 -0
- package/.scannerwork/scanner-report/measures-33.pb +0 -0
- package/.scannerwork/scanner-report/measures-35.pb +0 -0
- package/.scannerwork/scanner-report/measures-4.pb +0 -0
- package/.scannerwork/scanner-report/measures-47.pb +0 -0
- package/.scannerwork/scanner-report/measures-48.pb +0 -0
- package/.scannerwork/scanner-report/measures-49.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.pb +0 -0
- package/.scannerwork/scanner-report/measures-50.pb +0 -0
- package/.scannerwork/scanner-report/measures-51.pb +0 -0
- package/.scannerwork/scanner-report/measures-52.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +0 -0
- package/.scannerwork/scanner-report/measures-56.pb +0 -0
- package/.scannerwork/scanner-report/measures-59.pb +0 -0
- package/.scannerwork/scanner-report/measures-6.pb +0 -0
- package/.scannerwork/scanner-report/measures-60.pb +0 -0
- package/.scannerwork/scanner-report/measures-65.pb +0 -0
- package/.scannerwork/scanner-report/measures-66.pb +0 -0
- package/.scannerwork/scanner-report/measures-67.pb +0 -0
- package/.scannerwork/scanner-report/measures-7.pb +0 -0
- package/.scannerwork/scanner-report/measures-8.pb +0 -0
- package/.scannerwork/scanner-report/measures-9.pb +0 -0
- package/.scannerwork/scanner-report/metadata.pb +0 -0
- package/.scannerwork/scanner-report/source-10.txt +258 -23
- package/.scannerwork/scanner-report/source-11.txt +92 -103
- package/.scannerwork/scanner-report/source-12.txt +24 -82
- package/.scannerwork/scanner-report/source-13.txt +110 -145
- package/.scannerwork/scanner-report/source-14.txt +72 -249
- package/.scannerwork/scanner-report/source-15.txt +24 -14
- package/.scannerwork/scanner-report/source-19.txt +93 -121
- package/.scannerwork/scanner-report/source-20.txt +14 -8
- package/.scannerwork/scanner-report/source-21.txt +224 -14
- package/.scannerwork/scanner-report/source-22.txt +15 -223
- package/.scannerwork/scanner-report/source-23.txt +595 -115
- package/.scannerwork/scanner-report/source-24.txt +13 -26
- package/.scannerwork/scanner-report/source-25.txt +135 -15
- package/.scannerwork/scanner-report/source-26.txt +120 -339
- package/.scannerwork/scanner-report/source-27.txt +128 -19
- package/.scannerwork/scanner-report/source-28.txt +11 -43
- package/.scannerwork/scanner-report/source-29.txt +227 -559
- package/.scannerwork/scanner-report/source-3.txt +178 -0
- package/.scannerwork/scanner-report/source-30.txt +71 -47
- package/.scannerwork/scanner-report/source-31.txt +125 -46
- package/.scannerwork/scanner-report/source-32.txt +101 -62
- package/.scannerwork/scanner-report/source-33.txt +48 -127
- package/.scannerwork/scanner-report/source-35.txt +24 -96
- package/.scannerwork/scanner-report/source-4.txt +72 -98
- package/.scannerwork/scanner-report/source-47.txt +46 -83
- package/.scannerwork/scanner-report/source-48.txt +47 -110
- package/.scannerwork/scanner-report/source-49.txt +344 -271
- package/.scannerwork/scanner-report/source-5.txt +84 -65
- package/.scannerwork/scanner-report/source-50.txt +9 -136
- package/.scannerwork/scanner-report/source-51.txt +84 -19
- package/.scannerwork/scanner-report/source-52.txt +119 -0
- package/.scannerwork/scanner-report/source-54.txt +167 -114
- package/.scannerwork/scanner-report/source-56.txt +418 -509
- package/.scannerwork/scanner-report/source-59.txt +172 -59
- package/.scannerwork/scanner-report/source-6.txt +147 -37
- package/.scannerwork/scanner-report/source-60.txt +142 -385
- package/.scannerwork/scanner-report/source-65.txt +509 -175
- package/.scannerwork/scanner-report/source-66.txt +509 -190
- package/.scannerwork/scanner-report/source-67.txt +77 -0
- package/.scannerwork/scanner-report/source-7.txt +56 -154
- package/.scannerwork/scanner-report/source-8.txt +34 -21
- package/.scannerwork/scanner-report/source-9.txt +14 -63
- package/.scannerwork/scanner-report/symbols-10.pb +354 -20
- package/.scannerwork/scanner-report/symbols-11.pb +29 -32
- package/.scannerwork/scanner-report/symbols-12.pb +18 -40
- package/.scannerwork/scanner-report/symbols-13.pb +32 -125
- package/.scannerwork/scanner-report/symbols-14.pb +42 -354
- package/.scannerwork/scanner-report/symbols-15.pb +17 -13
- package/.scannerwork/scanner-report/symbols-19.pb +28 -116
- package/.scannerwork/scanner-report/symbols-20.pb +17 -9
- package/.scannerwork/scanner-report/symbols-21.pb +394 -10
- package/.scannerwork/scanner-report/symbols-22.pb +14 -394
- package/.scannerwork/scanner-report/symbols-23.pb +1254 -102
- package/.scannerwork/scanner-report/symbols-24.pb +10 -27
- package/.scannerwork/scanner-report/symbols-25.pb +112 -11
- package/.scannerwork/scanner-report/symbols-26.pb +85 -494
- package/.scannerwork/scanner-report/symbols-27.pb +102 -14
- package/.scannerwork/scanner-report/symbols-28.pb +9 -34
- package/.scannerwork/scanner-report/symbols-29.pb +406 -1174
- package/.scannerwork/scanner-report/symbols-3.pb +144 -0
- package/.scannerwork/scanner-report/symbols-30.pb +60 -45
- package/.scannerwork/scanner-report/symbols-31.pb +115 -42
- package/.scannerwork/scanner-report/symbols-32.pb +97 -60
- package/.scannerwork/scanner-report/symbols-33.pb +36 -85
- package/.scannerwork/scanner-report/symbols-35.pb +27 -77
- package/.scannerwork/scanner-report/symbols-4.pb +44 -30
- package/.scannerwork/scanner-report/symbols-47.pb +42 -68
- package/.scannerwork/scanner-report/symbols-48.pb +45 -97
- package/.scannerwork/scanner-report/symbols-49.pb +458 -450
- package/.scannerwork/scanner-report/symbols-5.pb +58 -43
- package/.scannerwork/scanner-report/symbols-50.pb +9 -112
- package/.scannerwork/scanner-report/symbols-51.pb +68 -16
- package/.scannerwork/scanner-report/symbols-52.pb +77 -0
- package/.scannerwork/scanner-report/symbols-56.pb +610 -0
- package/.scannerwork/scanner-report/symbols-59.pb +180 -30
- package/.scannerwork/scanner-report/symbols-6.pb +126 -15
- package/.scannerwork/scanner-report/symbols-60.pb +146 -603
- package/.scannerwork/scanner-report/symbols-67.pb +30 -0
- package/.scannerwork/scanner-report/symbols-7.pb +43 -141
- package/.scannerwork/scanner-report/symbols-8.pb +12 -15
- package/.scannerwork/scanner-report/symbols-9.pb +13 -45
- package/.scannerwork/scanner-report/syntax-highlightings-10.pb +250 -29
- package/.scannerwork/scanner-report/syntax-highlightings-11.pb +75 -91
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +29 -81
- package/.scannerwork/scanner-report/syntax-highlightings-13.pb +86 -170
- package/.scannerwork/scanner-report/syntax-highlightings-14.pb +78 -247
- package/.scannerwork/scanner-report/syntax-highlightings-15.pb +21 -16
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +103 -99
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +28 -13
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +293 -14
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +21 -296
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +832 -172
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +13 -31
- package/.scannerwork/scanner-report/syntax-highlightings-25.pb +188 -24
- package/.scannerwork/scanner-report/syntax-highlightings-26.pb +154 -593
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +194 -21
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +22 -58
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +354 -582
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +243 -0
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +70 -70
- package/.scannerwork/scanner-report/syntax-highlightings-31.pb +98 -46
- package/.scannerwork/scanner-report/syntax-highlightings-32.pb +144 -72
- package/.scannerwork/scanner-report/syntax-highlightings-33.pb +59 -155
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +27 -117
- package/.scannerwork/scanner-report/syntax-highlightings-4.pb +56 -79
- package/.scannerwork/scanner-report/syntax-highlightings-47.pb +46 -69
- package/.scannerwork/scanner-report/syntax-highlightings-48.pb +74 -146
- package/.scannerwork/scanner-report/syntax-highlightings-49.pb +346 -375
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +92 -49
- package/.scannerwork/scanner-report/syntax-highlightings-50.pb +14 -189
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +70 -28
- package/.scannerwork/scanner-report/syntax-highlightings-52.pb +158 -0
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +938 -127
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +445 -3544
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +200 -78
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +179 -20
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +156 -590
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +3733 -199
- package/.scannerwork/scanner-report/syntax-highlightings-66.pb +3724 -202
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +103 -0
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +55 -203
- package/.scannerwork/scanner-report/syntax-highlightings-8.pb +23 -19
- package/.scannerwork/scanner-report/syntax-highlightings-9.pb +15 -65
- package/CHANGES.md +7 -0
- package/package.json +4 -4
- package/test-16-results.xml +151 -151
- package/test-18-results.xml +143 -143
- package/test-iam-18-results.xml +49 -49
- package/.scannerwork/scanner-report/changesets-16.pb +0 -1
- package/.scannerwork/scanner-report/changesets-17.pb +0 -1
- package/.scannerwork/scanner-report/changesets-54.pb +0 -1
- package/.scannerwork/scanner-report/changesets-58.pb +0 -1
- package/.scannerwork/scanner-report/changesets-65.pb +0 -1
- package/.scannerwork/scanner-report/changesets-66.pb +0 -1
- package/.scannerwork/scanner-report/component-16.pb +0 -1
- package/.scannerwork/scanner-report/component-17.pb +0 -1
- package/.scannerwork/scanner-report/component-18.pb +0 -1
- package/.scannerwork/scanner-report/component-58.pb +0 -1
- package/.scannerwork/scanner-report/component-61.pb +0 -1
- package/.scannerwork/scanner-report/coverages-16.pb +0 -0
- package/.scannerwork/scanner-report/coverages-54.pb +0 -0
- package/.scannerwork/scanner-report/coverages-65.pb +0 -0
- package/.scannerwork/scanner-report/coverages-66.pb +0 -0
- package/.scannerwork/scanner-report/duplications-17.pb +0 -2
- package/.scannerwork/scanner-report/duplications-65.pb +0 -2
- package/.scannerwork/scanner-report/duplications-66.pb +0 -2
- package/.scannerwork/scanner-report/measures-16.pb +0 -0
- package/.scannerwork/scanner-report/measures-18.pb +0 -0
- package/.scannerwork/scanner-report/measures-61.pb +0 -0
- package/.scannerwork/scanner-report/source-16.txt +0 -111
- package/.scannerwork/scanner-report/source-18.txt +0 -167
- package/.scannerwork/scanner-report/source-61.txt +0 -509
- package/.scannerwork/scanner-report/symbols-16.pb +0 -59
- package/.scannerwork/scanner-report/symbols-54.pb +0 -28
- package/.scannerwork/scanner-report/symbols-65.pb +0 -153
- package/.scannerwork/scanner-report/symbols-66.pb +0 -180
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +0 -133
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +0 -949
- package/.scannerwork/scanner-report/syntax-highlightings-61.pb +0 -3748
- /package/.scannerwork/scanner-report/{coverages-17.pb → coverages-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-58.pb → coverages-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-16.pb → duplications-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-50.pb → duplications-3.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-54.pb → duplications-56.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-58.pb → duplications-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-22.pb → issues-21.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-19.pb → issues-31.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-24.pb → issues-35.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-26.pb → issues-49.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-17.pb → measures-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-58.pb → measures-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-17.txt → source-2.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-58.txt → source-68.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-17.pb → symbols-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-58.pb → symbols-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-17.pb → syntax-highlightings-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-58.pb → syntax-highlightings-68.pb} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
1
|
+
// Copyright © 2017, 2022 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -14,79 +14,98 @@
|
|
|
14
14
|
'use strict';
|
|
15
15
|
|
|
16
16
|
const fs = require('fs');
|
|
17
|
-
const stream = require('stream');
|
|
18
17
|
const liner = require('./liner.js');
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
change._transform = function(line, encoding, done) {
|
|
24
|
-
if (line && line[0] === ':') {
|
|
25
|
-
const obj = {
|
|
26
|
-
command: null,
|
|
27
|
-
batch: null,
|
|
28
|
-
docs: []
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
let matches;
|
|
32
|
-
|
|
33
|
-
// extract command
|
|
34
|
-
matches = line.match(/^:([a-z_]+) ?/);
|
|
35
|
-
if (matches) {
|
|
36
|
-
obj.command = matches[1];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// extract batch
|
|
40
|
-
matches = line.match(/ batch([0-9]+)/);
|
|
41
|
-
if (matches) {
|
|
42
|
-
obj.batch = parseInt(matches[1]);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// extract doc ids
|
|
46
|
-
if (getDocs && obj.command === 't') {
|
|
47
|
-
const json = line.replace(/^.* batch[0-9]+ /, '').trim();
|
|
48
|
-
obj.docs = JSON.parse(json);
|
|
49
|
-
}
|
|
50
|
-
onCommand(obj);
|
|
51
|
-
}
|
|
52
|
-
done();
|
|
53
|
-
};
|
|
54
|
-
return change;
|
|
55
|
-
};
|
|
18
|
+
const change = require('./change.js');
|
|
19
|
+
const error = require('./error.js');
|
|
20
|
+
const debug = require('debug')('couchbackup:spoolchanges');
|
|
56
21
|
|
|
57
22
|
/**
|
|
58
|
-
*
|
|
23
|
+
* Write log file for all changes from a database, ready for downloading
|
|
24
|
+
* in batches.
|
|
59
25
|
*
|
|
60
|
-
* @param {string}
|
|
61
|
-
* @param {
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
* batches are remaining batch IDs for download.
|
|
26
|
+
* @param {string} dbUrl - URL of database
|
|
27
|
+
* @param {string} log - path to log file to use
|
|
28
|
+
* @param {number} bufferSize - the number of changes per batch/log line
|
|
29
|
+
* @param {function(err)} callback - a callback to run on completion
|
|
65
30
|
*/
|
|
66
|
-
module.exports = function(log, callback) {
|
|
67
|
-
//
|
|
68
|
-
const
|
|
31
|
+
module.exports = function(db, log, bufferSize, ee, callback) {
|
|
32
|
+
// list of document ids to process
|
|
33
|
+
const buffer = [];
|
|
34
|
+
let batch = 0;
|
|
35
|
+
let lastSeq = null;
|
|
36
|
+
const logStream = fs.createWriteStream(log);
|
|
37
|
+
let pending = 0;
|
|
38
|
+
// The number of changes to fetch per request
|
|
39
|
+
const limit = 100000;
|
|
69
40
|
|
|
41
|
+
// send documents ids to the queue in batches of bufferSize + the last batch
|
|
42
|
+
const processBuffer = function(lastOne) {
|
|
43
|
+
if (buffer.length >= bufferSize || (lastOne && buffer.length > 0)) {
|
|
44
|
+
debug('writing', buffer.length, 'changes to the backup file');
|
|
45
|
+
const b = { docs: buffer.splice(0, bufferSize), batch: batch };
|
|
46
|
+
logStream.write(':t batch' + batch + ' ' + JSON.stringify(b.docs) + '\n');
|
|
47
|
+
ee.emit('changes', batch);
|
|
48
|
+
batch++;
|
|
49
|
+
}
|
|
70
50
|
};
|
|
71
|
-
let changesComplete = false;
|
|
72
51
|
|
|
73
|
-
// called
|
|
74
|
-
const
|
|
75
|
-
if (
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
52
|
+
// called once per received change
|
|
53
|
+
const onChange = function(c) {
|
|
54
|
+
if (c) {
|
|
55
|
+
if (c.error) {
|
|
56
|
+
ee.emit('error', new error.BackupError('InvalidChange', `Received invalid change: ${c}`));
|
|
57
|
+
} else if (c.changes) {
|
|
58
|
+
const obj = { id: c.id };
|
|
59
|
+
buffer.push(obj);
|
|
60
|
+
processBuffer(false);
|
|
61
|
+
} else if (c.last_seq) {
|
|
62
|
+
lastSeq = c.last_seq;
|
|
63
|
+
pending = c.pending;
|
|
64
|
+
}
|
|
81
65
|
}
|
|
82
66
|
};
|
|
83
67
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
68
|
+
function getChanges(since = 0) {
|
|
69
|
+
debug('making changes request since ' + since);
|
|
70
|
+
return db.service.postChangesAsStream({ db: db.db, since: since, limit: limit, seqInterval: limit })
|
|
71
|
+
.then(response => {
|
|
72
|
+
response.result.pipe(liner())
|
|
73
|
+
.on('error', function(err) {
|
|
74
|
+
logStream.end();
|
|
75
|
+
callback(err);
|
|
76
|
+
})
|
|
77
|
+
.pipe(change(onChange))
|
|
78
|
+
.on('error', function(err) {
|
|
79
|
+
logStream.end();
|
|
80
|
+
callback(err);
|
|
81
|
+
})
|
|
82
|
+
.on('finish', function() {
|
|
83
|
+
processBuffer(true);
|
|
84
|
+
if (!lastSeq) {
|
|
85
|
+
logStream.end();
|
|
86
|
+
debug('changes request terminated before last_seq was sent');
|
|
87
|
+
callback(new error.BackupError('SpoolChangesError', 'Changes request terminated before last_seq was sent'));
|
|
88
|
+
} else {
|
|
89
|
+
debug(`changes request completed with last_seq: ${lastSeq} and ${pending} changes pending.`);
|
|
90
|
+
if (pending > 0) {
|
|
91
|
+
// Return the next promise
|
|
92
|
+
return getChanges(lastSeq);
|
|
93
|
+
} else {
|
|
94
|
+
debug('finished streaming database changes');
|
|
95
|
+
logStream.end(':changes_complete ' + lastSeq + '\n', 'utf8', callback);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
})
|
|
100
|
+
.catch(err => {
|
|
101
|
+
logStream.end();
|
|
102
|
+
if (err.status && err.status >= 400) {
|
|
103
|
+
callback(error.convertResponseError(err));
|
|
104
|
+
} else if (err.name !== 'SpoolChangesError') {
|
|
105
|
+
callback(new error.BackupError('SpoolChangesError', `Failed changes request - ${err.message}`));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
getChanges();
|
|
92
111
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright © 2017
|
|
1
|
+
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -15,142 +15,15 @@
|
|
|
15
15
|
/* global describe it */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
const nock = require('nock');
|
|
20
|
-
const request = require('../includes/request.js');
|
|
21
|
-
const changes = require('../includes/spoolchanges.js');
|
|
18
|
+
const u = require('./citestutils.js');
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
function provideChanges(batchSize, totalChanges, fullResponse = false) {
|
|
31
|
-
let pending = totalChanges;
|
|
32
|
-
const sparseResultsArray = Array(batchSize).fill({
|
|
33
|
-
seq: null,
|
|
34
|
-
id: 'doc',
|
|
35
|
-
changes: [{ rev: '1-abcdef0123456789abcdef0123456789' }]
|
|
36
|
-
});
|
|
37
|
-
nock(url)
|
|
38
|
-
.post(`/${dbName}/_changes`)
|
|
39
|
-
.query(true)
|
|
40
|
-
.times(totalChanges / batchSize + (totalChanges % batchSize > 0 ? 1 : 0))
|
|
41
|
-
.reply(200, (uri, requestBody) => {
|
|
42
|
-
pending -= batchSize;
|
|
43
|
-
const lastSeq = (totalChanges - pending);
|
|
44
|
-
const seq = lastSeq - batchSize;
|
|
45
|
-
return {
|
|
46
|
-
results: fullResponse
|
|
47
|
-
? Array.from(Array(batchSize), (_, i) => {
|
|
48
|
-
return {
|
|
49
|
-
seq: `${seq + i}-${seqSuffix}`,
|
|
50
|
-
id: `doc${seq + i}`,
|
|
51
|
-
changes: [{ rev: '1-abcdef0123456789abcdef0123456789' }]
|
|
52
|
-
};
|
|
53
|
-
})
|
|
54
|
-
: sparseResultsArray,
|
|
55
|
-
pending: pending,
|
|
56
|
-
last_seq: `${lastSeq}-abc`
|
|
57
|
-
};
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe('#unit Check spool changes', function() {
|
|
62
|
-
it('should terminate on request error', function(done) {
|
|
63
|
-
nock(url)
|
|
64
|
-
.post(`/${dbName}/_changes`)
|
|
65
|
-
.query(true)
|
|
66
|
-
.times(3)
|
|
67
|
-
.replyWithError({ code: 'ECONNRESET', message: 'socket hang up' });
|
|
68
|
-
|
|
69
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
70
|
-
assert.strictEqual(err.name, 'SpoolChangesError');
|
|
71
|
-
assert.strictEqual(err.message, `Failed changes request - socket hang up: post ${url}/${dbName}/_changes`);
|
|
72
|
-
assert.ok(nock.isDone());
|
|
73
|
-
done();
|
|
74
|
-
});
|
|
75
|
-
}).timeout(longTestTimeout);
|
|
76
|
-
|
|
77
|
-
it('should terminate on bad HTTP status code response', function(done) {
|
|
78
|
-
nock(url)
|
|
79
|
-
.post(`/${dbName}/_changes`)
|
|
80
|
-
.query(true)
|
|
81
|
-
.times(3)
|
|
82
|
-
.reply(500, function(uri, requestBody) {
|
|
83
|
-
this.req.response.statusMessage = 'Internal Server Error';
|
|
84
|
-
return { error: 'foo', reason: 'bar' };
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
88
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
89
|
-
assert.strictEqual(err.message, `500 Internal Server Error: post ${url}/${dbName}/_changes - Error: foo, Reason: bar`);
|
|
90
|
-
assert.ok(nock.isDone());
|
|
91
|
-
done();
|
|
92
|
-
});
|
|
93
|
-
}).timeout(longTestTimeout);
|
|
94
|
-
|
|
95
|
-
it('should keep collecting changes', function(done) {
|
|
96
|
-
// This test validates that spooling will correctly
|
|
97
|
-
// continue across multiple requests
|
|
98
|
-
// (4 batches of 100000 to be precise).
|
|
99
|
-
// This test might take up to 10 seconds
|
|
100
|
-
this.timeout(10 * 1000);
|
|
101
|
-
|
|
102
|
-
// Use full changes for this test
|
|
103
|
-
provideChanges(100000, 400000, true);
|
|
104
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
105
|
-
assert.ok(!err);
|
|
106
|
-
assert.ok(nock.isDone());
|
|
107
|
-
done();
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('should keep collecting sparse changes', function(done) {
|
|
112
|
-
// This test checks that making thousands of requests doesn't
|
|
113
|
-
// make anything bad happen.
|
|
114
|
-
// This test might take up to 25 seconds
|
|
115
|
-
this.timeout(25 * 1000);
|
|
116
|
-
// Use sparse changes for this test and a batch size of 1
|
|
117
|
-
provideChanges(1, 2500);
|
|
118
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
119
|
-
assert.ok(!err);
|
|
120
|
-
assert.ok(nock.isDone());
|
|
121
|
-
done();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
describe('Longer spool changes checks', function() {
|
|
127
|
-
it('#slow should keep collecting changes (25M)', function(done) {
|
|
128
|
-
// This test might take up to 5 minutes
|
|
129
|
-
this.timeout(5 * 60 * 1000);
|
|
130
|
-
// Note changes spooling uses a constant batch size, we are setting
|
|
131
|
-
// a test value here and setting the buffer to match
|
|
132
|
-
const batch = 100000;
|
|
133
|
-
// Use sparse changes for this test
|
|
134
|
-
provideChanges(batch, 25000000);
|
|
135
|
-
changes(db, '/dev/null', batch, null, function(err) {
|
|
136
|
-
assert.ok(!err);
|
|
137
|
-
assert.ok(nock.isDone());
|
|
138
|
-
done();
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('#slower should keep collecting changes (500M)', function(done) {
|
|
143
|
-
// This test might take up to 90 minutes
|
|
144
|
-
this.timeout(90 * 60 * 1000);
|
|
145
|
-
// Note changes spooling uses a constant batch size, we are setting
|
|
146
|
-
// a test value here and setting the buffer to match
|
|
147
|
-
const batch = 1000000;
|
|
148
|
-
// Use full changes for this test to exercise load
|
|
149
|
-
provideChanges(batch, 500000000, true);
|
|
150
|
-
changes(db, '/dev/null', batch, null, function(err) {
|
|
151
|
-
assert.ok(!err);
|
|
152
|
-
assert.ok(nock.isDone());
|
|
153
|
-
done();
|
|
20
|
+
[{ useApi: true }, { useApi: false }].forEach(function(params) {
|
|
21
|
+
describe(u.scenario('#slowest End to end backup and restore', params), function() {
|
|
22
|
+
// 10 GB is about the largest the CI can handle before getting very upset
|
|
23
|
+
// about how long things are taking
|
|
24
|
+
it('should backup and restore largedb10g', function(done) {
|
|
25
|
+
u.setTimeout(this, 350 * 60);
|
|
26
|
+
u.testDirectBackupAndRestore(params, 'largedb10g', this.dbName, done);
|
|
154
27
|
});
|
|
155
28
|
});
|
|
156
29
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright ©
|
|
1
|
+
// Copyright © 2023 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -12,24 +12,89 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global describe it */
|
|
16
15
|
'use strict';
|
|
17
16
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
17
|
+
const chunk = require('lodash/chunk');
|
|
18
|
+
const difference = require('lodash/difference');
|
|
19
|
+
const forOwn = require('lodash/forOwn');
|
|
20
|
+
const isEmpty = require('lodash/isEmpty');
|
|
21
|
+
const union = require('lodash/union');
|
|
22
|
+
|
|
23
|
+
const compare = async(database1, database2, client) => {
|
|
24
|
+
// check docs same in both dbs
|
|
25
|
+
const allDocs1 = await getAllDocs(client, database1);
|
|
26
|
+
const allDocs2 = await getAllDocs(client, database2);
|
|
27
|
+
|
|
28
|
+
const onlyInDb1 = (difference(allDocs1, allDocs2));
|
|
29
|
+
const onlyInDb2 = (difference(allDocs2, allDocs1));
|
|
30
|
+
|
|
31
|
+
let databasesSame = isEmpty(onlyInDb1) && isEmpty(onlyInDb2);
|
|
32
|
+
|
|
33
|
+
if (!databasesSame) {
|
|
34
|
+
console.log(onlyInDb1.length + ' documents only in db 1.');
|
|
35
|
+
console.log('Document IDs only in db 1: ' + onlyInDb1);
|
|
36
|
+
console.log(onlyInDb2.length + ' documents only in db 2.');
|
|
37
|
+
console.log('Document IDs only in db 2: ' + onlyInDb2);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// check revs same in docs common to both dbs
|
|
41
|
+
const partitionSize = 500;
|
|
42
|
+
const batches = chunk(union(allDocs1, allDocs2), partitionSize);
|
|
43
|
+
|
|
44
|
+
const missingRevsInDb2 = await getMissingRevs(client, database1, database2, batches);
|
|
45
|
+
const missingRevsInDb1 = await getMissingRevs(client, database2, database1, batches);
|
|
46
|
+
|
|
47
|
+
databasesSame = databasesSame && isEmpty(missingRevsInDb1) && isEmpty(missingRevsInDb2);
|
|
48
|
+
|
|
49
|
+
if (!databasesSame) {
|
|
50
|
+
console.log('Missing revs in db 1:' + JSON.stringify(missingRevsInDb1));
|
|
51
|
+
console.log('Missing revs in db 2:' + JSON.stringify(missingRevsInDb2));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return databasesSame;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const getMissingRevs = async(client, databaseName1, databaseName2, batcheses) => {
|
|
58
|
+
const fakeRevisionId = '9999-a';
|
|
59
|
+
|
|
60
|
+
const missing = {};
|
|
61
|
+
|
|
62
|
+
// look in db1 - use a fake revision ID to fetch all leaf revisions
|
|
63
|
+
|
|
64
|
+
for (const batches of batcheses) {
|
|
65
|
+
const documentRevisions = {};
|
|
66
|
+
batches.forEach(id => (documentRevisions[id] = [fakeRevisionId]));
|
|
67
|
+
|
|
68
|
+
const result1 = await client.postRevsDiff({ db: databaseName1, documentRevisions });
|
|
69
|
+
const revsDiffRequestDb2 = {};
|
|
70
|
+
forOwn(result1.result, (v, k) => (revsDiffRequestDb2[k] = v.possible_ancestors));
|
|
71
|
+
// look in db2
|
|
72
|
+
const result2 = await client.postRevsDiff({ db: databaseName2, documentRevisions: revsDiffRequestDb2 });
|
|
73
|
+
forOwn(result2.result, (v, k) => {
|
|
74
|
+
if ('missing' in v) {
|
|
75
|
+
missing[k] = v.missing;
|
|
76
|
+
}
|
|
33
77
|
});
|
|
34
|
-
}
|
|
35
|
-
|
|
78
|
+
}
|
|
79
|
+
return missing;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const getAllDocs = async(client, database) => {
|
|
83
|
+
let allDocIds = [];
|
|
84
|
+
const limit = 2000;
|
|
85
|
+
let startKey = '\u0000';
|
|
86
|
+
do {
|
|
87
|
+
const pageOfDocIds = (await client.postAllDocs({ db: database, startKey, limit })).result.rows.map(r => r.id);
|
|
88
|
+
allDocIds = allDocIds.concat(pageOfDocIds);
|
|
89
|
+
if (pageOfDocIds.length < limit) {
|
|
90
|
+
startKey = null;
|
|
91
|
+
} else {
|
|
92
|
+
startKey = pageOfDocIds[limit - 1] + '\u0000';
|
|
93
|
+
}
|
|
94
|
+
} while (startKey != null);
|
|
95
|
+
return allDocIds;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
module.exports = {
|
|
99
|
+
compare
|
|
100
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
/* global describe it */
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
const assert = require('assert');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const u = require('./citestutils.js');
|
|
21
|
+
|
|
22
|
+
[{ useApi: true }, { useApi: false }].forEach(function(params) {
|
|
23
|
+
describe(u.scenario('Resume tests', params), function() {
|
|
24
|
+
it('should create a log file', function(done) {
|
|
25
|
+
// Allow up to 90 s for this test
|
|
26
|
+
u.setTimeout(this, 60);
|
|
27
|
+
|
|
28
|
+
const actualBackup = `./${this.fileName}`;
|
|
29
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
30
|
+
// Use abort parameter to terminate the backup a given number of ms after
|
|
31
|
+
// the first data write to the output file.
|
|
32
|
+
const p = u.p(params, { opts: { log: logFile } });
|
|
33
|
+
u.testBackupToFile(p, 'animaldb', actualBackup, function(err) {
|
|
34
|
+
if (err) {
|
|
35
|
+
done(err);
|
|
36
|
+
} else {
|
|
37
|
+
// Assert the log file exists
|
|
38
|
+
try {
|
|
39
|
+
assert.ok(fs.existsSync(logFile), 'The log file should exist.');
|
|
40
|
+
done();
|
|
41
|
+
} catch (err) {
|
|
42
|
+
done(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should restore corrupted animaldb to a database correctly', function(done) {
|
|
49
|
+
// Allow up to 60 s to restore and compare (again it should be faster)!
|
|
50
|
+
u.setTimeout(this, 60);
|
|
51
|
+
const input = fs.createReadStream('./test/fixtures/animaldb_corrupted.json');
|
|
52
|
+
const dbName = this.dbName;
|
|
53
|
+
input.on('open', function() {
|
|
54
|
+
u.testRestore(params, input, dbName, function(err) {
|
|
55
|
+
if (err) {
|
|
56
|
+
done(err);
|
|
57
|
+
} else {
|
|
58
|
+
u.dbCompare('animaldb', dbName, done);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should restore resumed animaldb with blank line to a database correctly', function(done) {
|
|
65
|
+
// Allow up to 60 s to restore and compare (again it should be faster)!
|
|
66
|
+
u.setTimeout(this, 60);
|
|
67
|
+
const input = fs.createReadStream('./test/fixtures/animaldb_resumed_blank.json');
|
|
68
|
+
const dbName = this.dbName;
|
|
69
|
+
input.on('open', function() {
|
|
70
|
+
u.testRestore(params, input, dbName, function(err) {
|
|
71
|
+
if (err) {
|
|
72
|
+
done(err);
|
|
73
|
+
} else {
|
|
74
|
+
u.dbCompare('animaldb', dbName, done);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('Resume tests', function() {
|
|
83
|
+
// Currently cannot abort API backups, when we do this test should be run for
|
|
84
|
+
// both API and CLI
|
|
85
|
+
it('should correctly backup and restore backup10m', function(done) {
|
|
86
|
+
// Allow up to 90 s for this test
|
|
87
|
+
u.setTimeout(this, 90);
|
|
88
|
+
|
|
89
|
+
const actualBackup = `./${this.fileName}`;
|
|
90
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
91
|
+
// Use abort parameter to terminate the backup a given number of ms after
|
|
92
|
+
// the first data write to the output file.
|
|
93
|
+
const p = u.p(params, { abort: true }, { opts: { log: logFile } });
|
|
94
|
+
const restoreDb = this.dbName;
|
|
95
|
+
// Set the database doc count as fewer than this should be written during
|
|
96
|
+
// resumed backup.
|
|
97
|
+
p.exclusiveMaxExpected = 5096;
|
|
98
|
+
|
|
99
|
+
u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb, done);
|
|
100
|
+
});
|
|
101
|
+
// Note --output is only valid for CLI usage, this test should only run for CLI
|
|
102
|
+
const params = { useApi: false };
|
|
103
|
+
it('should correctly backup and restore backup10m using --output', function(done) {
|
|
104
|
+
// Allow up to 90 s for this test
|
|
105
|
+
u.setTimeout(this, 90);
|
|
106
|
+
|
|
107
|
+
const actualBackup = `./${this.fileName}`;
|
|
108
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
109
|
+
// Use abort parameter to terminate the backup a given number of ms after
|
|
110
|
+
// the first data write to the output file.
|
|
111
|
+
const p = u.p(params, { abort: true }, { opts: { output: actualBackup, log: logFile } });
|
|
112
|
+
const restoreDb = this.dbName;
|
|
113
|
+
// Set the database doc count as fewer than this should be written during
|
|
114
|
+
// resumed backup.
|
|
115
|
+
p.exclusiveMaxExpected = 5096;
|
|
116
|
+
|
|
117
|
+
u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb, done);
|
|
118
|
+
});
|
|
119
|
+
});
|