diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml
index a511de908..fc24a6cd5 100644
--- a/doc/xml/user-guide.xml
+++ b/doc/xml/user-guide.xml
@@ -1576,6 +1576,26 @@
While file bundling is generally more efficient, the downside is that it is more difficult to manually retrieve files from the repository. It may not be ideal for deduplicated storage since each full backup will arrange files in the bundles differently. Lastly, file bundles cannot be resumed, so be careful not to set repo-bundle-size too high.
+
+
+ Block Incremental
+
+ This feature is in beta release and should not be used in production. The on-disk format will change before the GA release. The beta option must be enabled to prevent accidental usage of beta features.
+
+ Block incremental backups save space by only storing the parts of a file that have changed since the prior backup rather than storing the entire file.
+
+ The block incremental feature is enabled with the repo-block option and it works best when enabled for all backup types. File bundling must also be enabled.
+
+
+ Configure repo1-block
+
+ y
+ y
+
+
+ The repo-block-size-map, repo-block-size-super, repo-block-size-super-full, repo-block-age-map, and repo-block-checksum-size-map options can be used for tuning, though the defaults should be optimal in most cases. Note that these options may not be be available after the beta since they are primarily intended to allow experimentation to find the optimal values.
+
+
Backup Annotations
diff --git a/src/build/config/config.yaml b/src/build/config/config.yaml
index 4757be257..5f112c594 100644
--- a/src/build/config/config.yaml
+++ b/src/build/config/config.yaml
@@ -1881,7 +1881,7 @@ option:
section: global
group: repo
type: boolean
- internal: true
+ beta: true
default: false
command:
backup: {}
@@ -1898,7 +1898,7 @@ option:
group: repo
type: hash
required: false
- internal: true
+ beta: true
command: repo-block
command-role:
main: {}
@@ -1919,7 +1919,7 @@ option:
type: size
default: 256KiB
allow-range: [32KiB, 16MiB]
- internal: true
+ beta: true
command: repo-block
command-role:
main: {}
diff --git a/src/build/help/help.xml b/src/build/help/help.xml
index 1b6526eca..016e583ed 100644
--- a/src/build/help/help.xml
+++ b/src/build/help/help.xml
@@ -539,7 +539,7 @@
Map file age (in days) to a block multiplier. Files that have not been modified recently are less likely to be modified in the future, so the block size is multiplied to reduce the map size. By default, if the file is old enough it will not be stored as a block incremental.
- 7=2
+ 7=2|14=4
@@ -549,7 +549,7 @@
Map block size to checksum size. Smaller checksums save space in the map but may not be able to reliably detect changes in the block.
- 7=2
+ 32KiB=7|128KiB=8
@@ -559,7 +559,7 @@
Map file size to block size. Block size is the minimum unit that will be stored in the block incremental. Smaller sizes allow for more granular incremental backups but larger sizes mean smaller maps.
- 16KiB=8KiB
+ 16KiB=8KiB|128KiB=16KiB|512KiB=32KiB
diff --git a/src/config/parse.auto.c.inc b/src/config/parse.auto.c.inc
index 09057d5b0..eb438ec95 100644
--- a/src/config/parse.auto.c.inc
+++ b/src/config/parse.auto.c.inc
@@ -5076,6 +5076,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block
PARSE_RULE_OPTION_NAME("repo-block"), // opt/repo-block
PARSE_RULE_OPTION_TYPE(cfgOptTypeBoolean), // opt/repo-block
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block
PARSE_RULE_OPTION_NEGATE(true), // opt/repo-block
PARSE_RULE_OPTION_RESET(true), // opt/repo-block
PARSE_RULE_OPTION_REQUIRED(true), // opt/repo-block
@@ -5111,6 +5112,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block-age-map
PARSE_RULE_OPTION_NAME("repo-block-age-map"), // opt/repo-block-age-map
PARSE_RULE_OPTION_TYPE(cfgOptTypeHash), // opt/repo-block-age-map
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block-age-map
PARSE_RULE_OPTION_RESET(true), // opt/repo-block-age-map
PARSE_RULE_OPTION_REQUIRED(false), // opt/repo-block-age-map
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/repo-block-age-map
@@ -5140,6 +5142,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block-checksum-size-map
PARSE_RULE_OPTION_NAME("repo-block-checksum-size-map"), // opt/repo-block-checksum-size-map
PARSE_RULE_OPTION_TYPE(cfgOptTypeHash), // opt/repo-block-checksum-size-map
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block-checksum-size-map
PARSE_RULE_OPTION_RESET(true), // opt/repo-block-checksum-size-map
PARSE_RULE_OPTION_REQUIRED(false), // opt/repo-block-checksum-size-map
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/repo-block-checksum-size-map
@@ -5169,6 +5172,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block-size-map
PARSE_RULE_OPTION_NAME("repo-block-size-map"), // opt/repo-block-size-map
PARSE_RULE_OPTION_TYPE(cfgOptTypeHash), // opt/repo-block-size-map
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block-size-map
PARSE_RULE_OPTION_RESET(true), // opt/repo-block-size-map
PARSE_RULE_OPTION_REQUIRED(false), // opt/repo-block-size-map
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/repo-block-size-map
@@ -5198,6 +5202,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block-size-super
PARSE_RULE_OPTION_NAME("repo-block-size-super"), // opt/repo-block-size-super
PARSE_RULE_OPTION_TYPE(cfgOptTypeSize), // opt/repo-block-size-super
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block-size-super
PARSE_RULE_OPTION_RESET(true), // opt/repo-block-size-super
PARSE_RULE_OPTION_REQUIRED(true), // opt/repo-block-size-super
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/repo-block-size-super
@@ -5238,6 +5243,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
( // opt/repo-block-size-super-full
PARSE_RULE_OPTION_NAME("repo-block-size-super-full"), // opt/repo-block-size-super-full
PARSE_RULE_OPTION_TYPE(cfgOptTypeSize), // opt/repo-block-size-super-full
+ PARSE_RULE_OPTION_BETA(true), // opt/repo-block-size-super-full
PARSE_RULE_OPTION_RESET(true), // opt/repo-block-size-super-full
PARSE_RULE_OPTION_REQUIRED(true), // opt/repo-block-size-super-full
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/repo-block-size-super-full