Signed-off-by: Juan Quintela <quintela(a)redhat.com>
---
docs/about/deprecated.rst | 8 +++
qapi/migration.json | 102 ++++++++++++++++++++++++--------------
migration/options.c | 13 +++++
3 files changed, 86 insertions(+), 37 deletions(-)
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
index 2d7c48185e..792de61c8b 100644
--- a/docs/about/deprecated.rst
+++ b/docs/about/deprecated.rst
@@ -457,3 +457,11 @@ Please see "QMP invocation for live storage migration with
``driver-mirror`` + NBD" in docs/interop/live-block-operations.rst for
a detailed explanation.
+old compression method (since 8.1)
+''''''''''''''''''''''''''''''''''
+
+Compression method fails too much. Too many races. We are going to
+remove it if nobody fixes it. For starters, migration-test
+compression tests are disabled becase they fail randomly. If you need
+compression, use multifd compression methods.
+
diff --git a/qapi/migration.json b/qapi/migration.json
index 08dee855cb..11f759b90b 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -244,7 +244,9 @@
#
# @compression: migration compression statistics, only returned if
# compression feature is on and status is 'active' or 'completed'
-# (Since 3.1)
+# This feature is unreliable and not tested. It is recommended to
+# use multifd migration instead, which offers an alternative
+# reliable and tested compression implementation. (Since 3.1)
#
# @socket-address: Only used for tcp, to know what the real port is
# (Since 4.0)
@@ -272,8 +274,11 @@
#
# Features:
#
-# @deprecated: @disk migration is deprecated. Use driver-mirror
-# with NBD instead.
+# @deprecated: @disk migration is deprecated. Use driver-mirror with
+# NBD instead. @compression is unreliable and untested. It is
+# recommended to use multifd migration, which offers an
+# alternative compression implementation that is reliable and
+# tested.
#
# Since: 0.14
##
@@ -291,7 +296,7 @@
'*blocked-reasons': ['str'],
'*postcopy-blocktime': 'uint32',
'*postcopy-vcpu-blocktime': ['uint32'],
- '*compression': 'CompressionStats',
+ '*compression': { 'type': 'CompressionStats',
'features': ['deprecated'] },
'*socket-address': ['SocketAddress'],
'*dirty-limit-throttle-time-per-round': 'uint64',
'*dirty-limit-ring-full-time': 'uint64'} }
@@ -446,7 +451,8 @@
# compress and xbzrle are both on, compress only takes effect in
# the ram bulk stage, after that, it will be disabled and only
# xbzrle takes effect, this can help to minimize migration
-# traffic. The feature is disabled by default. (since 2.4 )
+# traffic. The feature is disabled by default. Obsolete. Use
+# multifd compression methods if needed. (since 2.4 )
#
# @events: generate events for each migration state change (since 2.4
# )
@@ -525,8 +531,9 @@
#
# Features:
#
-# @deprecated: @block migration is deprecated. Use driver-mirror
-# with NBD instead.
+# @deprecated: @block migration is deprecated. Use driver-mirror with
+# NBD instead. @compress is obsolete, use multifd compression
+# methods instead.
#
# @unstable: Members @x-colo and @x-ignore-shared are experimental.
#
@@ -534,7 +541,8 @@
##
{ 'enum': 'MigrationCapability',
'data': ['xbzrle', 'rdma-pin-all', 'auto-converge',
'zero-blocks',
- 'compress', 'events', 'postcopy-ram',
+ { 'name': 'compress', 'features': [
'deprecated' ] },
+ 'events', 'postcopy-ram',
{ 'name': 'x-colo', 'features': [ 'unstable' ]
},
'release-ram',
{ 'name': 'block', 'features': [ 'deprecated'
] },
@@ -694,22 +702,24 @@
# migration, the compression level is an integer between 0 and 9,
# where 0 means no compression, 1 means the best compression
# speed, and 9 means best compression ratio which will consume
-# more CPU.
+# more CPU. Obsolete, see multifd compression if needed.
#
# @compress-threads: Set compression thread count to be used in live
# migration, the compression thread count is an integer between 1
-# and 255.
+# and 255. Obsolete, see multifd compression if needed.
#
# @compress-wait-thread: Controls behavior when all compression
# threads are currently busy. If true (default), wait for a free
# compression thread to become available; otherwise, send the page
-# uncompressed. (Since 3.1)
+# uncompressed. Obsolete, see multifd compression if
+# needed. (Since 3.1)
#
# @decompress-threads: Set decompression thread count to be used in
# live migration, the decompression thread count is an integer
# between 1 and 255. Usually, decompression is at least 4 times as
# fast as compression, so set the decompress-threads to the number
-# about 1/4 of compress-threads is adequate.
+# about 1/4 of compress-threads is adequate. Obsolete, see multifd
+# compression if needed.
#
# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
# bytes_xfer_period to trigger throttling. It is expressed as
@@ -829,7 +839,9 @@
# Features:
#
# @deprecated: Member @block-incremental is obsolete. Use
-# driver-mirror with NBD instead.
+# driver-mirror with NBD instead. Compression is obsolete, so
+# members @compress-level, @compress-threads, @decompress-threads
+# and @compress-wait-thread should not be used.
#
# @unstable: Members @x-checkpoint-delay and @x-vcpu-dirty-limit-period
# are experimental.
@@ -839,8 +851,11 @@
{ 'enum': 'MigrationParameter',
'data': ['announce-initial', 'announce-max',
'announce-rounds', 'announce-step',
- 'compress-level', 'compress-threads',
'decompress-threads',
- 'compress-wait-thread', 'throttle-trigger-threshold',
+ { 'name': 'compress-level', 'features': [
'deprecated' ] },
+ { 'name': 'compress-threads', 'features': [
'deprecated' ] },
+ { 'name': 'decompress-threads', 'features': [
'deprecated' ] },
+ { 'name': 'compress-wait-thread', 'features': [
'deprecated' ] },
+ 'throttle-trigger-threshold',
'cpu-throttle-initial', 'cpu-throttle-increment',
'cpu-throttle-tailslow',
'tls-creds', 'tls-hostname', 'tls-authz',
'max-bandwidth',
@@ -870,16 +885,17 @@
# @announce-step: Increase in delay (in milliseconds) between
# subsequent packets in the announcement (Since 4.0)
#
-# @compress-level: compression level
+# @compress-level: compression level. Obsolete and deprecated.
#
-# @compress-threads: compression thread count
+# @compress-threads: compression thread count. Obsolete and deprecated.
#
# @compress-wait-thread: Controls behavior when all compression
# threads are currently busy. If true (default), wait for a free
# compression thread to become available; otherwise, send the page
-# uncompressed. (Since 3.1)
+# uncompressed. Obsolete and deprecated. (Since 3.1)
#
-# @decompress-threads: decompression thread count
+# @decompress-threads: decompression thread count. Obsolete and
+# deprecated.
#
# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
# bytes_xfer_period to trigger throttling. It is expressed as
@@ -998,7 +1014,9 @@
# Features:
#
# @deprecated: Member @block-incremental is obsolete. Use
-# driver-mirror with NBD instead.
+# driver-mirror with NBD instead. Compression is obsolete, so
+# members @compress-level, @compress-threads, @decompress-threads
+# and @compress-wait-thread should not be used.
#
# @unstable: Members @x-checkpoint-delay and @x-vcpu-dirty-limit-period
# are experimental.
@@ -1013,10 +1031,14 @@
'*announce-max': 'size',
'*announce-rounds': 'size',
'*announce-step': 'size',
- '*compress-level': 'uint8',
- '*compress-threads': 'uint8',
- '*compress-wait-thread': 'bool',
- '*decompress-threads': 'uint8',
+ '*compress-level': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
+ '*compress-threads': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
+ '*compress-wait-thread': { 'type': 'bool',
+ 'features': [ 'deprecated' ] },
+ '*decompress-threads': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
'*throttle-trigger-threshold': 'uint8',
'*cpu-throttle-initial': 'uint8',
'*cpu-throttle-increment': 'uint8',
@@ -1052,7 +1074,7 @@
# Example:
#
# -> { "execute": "migrate-set-parameters" ,
-# "arguments": { "compress-level": 1 } }
+# "arguments": { "multifd-channels": 5 } }
# <- { "return": {} }
##
{ 'command': 'migrate-set-parameters', 'boxed': true,
@@ -1075,16 +1097,18 @@
# @announce-step: Increase in delay (in milliseconds) between
# subsequent packets in the announcement (Since 4.0)
#
-# @compress-level: compression level
+# @compress-level: compression level. Obsolete and deprecated.
#
-# @compress-threads: compression thread count
+# @compress-threads: compression thread count. Obsolete and
+# deprecated.
#
# @compress-wait-thread: Controls behavior when all compression
# threads are currently busy. If true (default), wait for a free
# compression thread to become available; otherwise, send the page
-# uncompressed. (Since 3.1)
+# uncompressed. Obsolete and deprecated. (Since 3.1)
#
-# @decompress-threads: decompression thread count
+# @decompress-threads: decompression thread count. Obsolete and
+# deprecated.
#
# @throttle-trigger-threshold: The ratio of bytes_dirty_period and
# bytes_xfer_period to trigger throttling. It is expressed as
@@ -1205,7 +1229,9 @@
# Features:
#
# @deprecated: Member @block-incremental is obsolete. Use
-# driver-mirror with NBD instead.
+# driver-mirror with NBD instead. Compression is obsolete, so
+# members @compress-level, @compress-threads, @decompress-threads
+# and @compress-wait-thread should not be used.
#
# @unstable: Members @x-checkpoint-delay and
# @x-vcpu-dirty-limit-period are experimental.
@@ -1217,10 +1243,14 @@
'*announce-max': 'size',
'*announce-rounds': 'size',
'*announce-step': 'size',
- '*compress-level': 'uint8',
- '*compress-threads': 'uint8',
- '*compress-wait-thread': 'bool',
- '*decompress-threads': 'uint8',
+ '*compress-level': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
+ '*compress-threads': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
+ '*compress-wait-thread': { 'type': 'bool',
+ 'features': [ 'deprecated' ] },
+ '*decompress-threads': { 'type': 'uint8',
+ 'features': [ 'deprecated' ] },
'*throttle-trigger-threshold': 'uint8',
'*cpu-throttle-initial': 'uint8',
'*cpu-throttle-increment': 'uint8',
@@ -1259,10 +1289,8 @@
#
# -> { "execute": "query-migrate-parameters" }
# <- { "return": {
-# "decompress-threads": 2,
+# "multifd-channels": 2,
# "cpu-throttle-increment": 10,
-# "compress-threads": 8,
-# "compress-level": 1,
# "cpu-throttle-initial": 20,
# "max-bandwidth": 33554432,
# "downtime-limit": 300
diff --git a/migration/options.c b/migration/options.c
index 24c883696f..7a25339156 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -466,6 +466,11 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps, Error
**errp)
"Use driver-mirror with NBD instead.");
}
+ if (new_caps[MIGRATION_CAPABILITY_COMPRESS]) {
+ warn_report("Old compression method is deprecated. "
+ "Use multifd compression methods instead.");
+ }
+
#ifndef CONFIG_REPLICATION
if (new_caps[MIGRATION_CAPABILITY_X_COLO]) {
error_setg(errp, "QEMU compiled without replication module"
@@ -1275,18 +1280,26 @@ static void migrate_params_apply(MigrateSetParameters *params,
Error **errp)
/* TODO use QAPI_CLONE() instead of duplicating it inline */
if (params->has_compress_level) {
+ warn_report("Old compression is deprecated. "
+ "Use multifd compression methods instead.");
s->parameters.compress_level = params->compress_level;
}
if (params->has_compress_threads) {
+ warn_report("Old compression is deprecated. "
+ "Use multifd compression methods instead.");
s->parameters.compress_threads = params->compress_threads;
}
if (params->has_compress_wait_thread) {
+ warn_report("Old compression is deprecated. "
+ "Use multifd compression methods instead.");
s->parameters.compress_wait_thread = params->compress_wait_thread;
}
if (params->has_decompress_threads) {
+ warn_report("Old compression is deprecated. "
+ "Use multifd compression methods instead.");
s->parameters.decompress_threads = params->decompress_threads;
}
--
2.40.1