From nobody Sat May 18 19:47:52 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1612357366; cv=none; d=zohomail.com; s=zohoarc; b=CKkp9uVc9y+os4gn9QIBCvIdVko1SVKfwpOfdQchMLG6B+pl13Bt81Vpjju+1S2dL1oO+/nr8qStOtg82CAgh6GMxjRkjKXb7bqAxoIZgTs1PDGXCxz81N02Z1LXIrw9FHMXSm7dFrXkRCnyzbltJNrENfjMjzrmZr21u9ujrVM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1612357366; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=DmIAzyRnhWry6wAxQk/s329dcyRgVitrm2Gl7GwqFsE=; b=htdmXehGDbIDKcUNjbYi7pvlXJ43QLAro3pwhzlJLnXIlwQS2edehFW8yYFqAU2I0xoToxRax9aXxaUr1Uc454cuzg3mAYRTc8/Iveuw3H/Y8bf37kX31CLOdk0ZllYjuRJC/23/cG1jSMd0v3XzsE6x+4XcxnVdoGh4ooyNd0Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1612357366169736.8099135742171; Wed, 3 Feb 2021 05:02:46 -0800 (PST) Received: from localhost ([::1]:53060 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l7Hnw-0005NC-4z for importer@patchew.org; Wed, 03 Feb 2021 08:02:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:50150) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l7HlU-00040V-7z for qemu-devel@nongnu.org; Wed, 03 Feb 2021 08:00:12 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:36125) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l7HlR-0003ng-Ov for qemu-devel@nongnu.org; Wed, 03 Feb 2021 08:00:11 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-46-4CMFSSlfOW6xQhsqRIroEQ-1; Wed, 03 Feb 2021 08:00:07 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0AACD79EC4; Wed, 3 Feb 2021 13:00:06 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3E63A6F979; Wed, 3 Feb 2021 13:00:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612357208; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DmIAzyRnhWry6wAxQk/s329dcyRgVitrm2Gl7GwqFsE=; b=VX1MRmNRXsj2ve8QTDbStdT2zYd8daV0xqho87v3feiX+wgUIQ4PRdsj+MaD+1VVQMOgVn rQLWibf+A4Sw5ju137czANufov6acyucCAqM2q3eXuJSZjaCG35jcVHWGYF8cIF1BvcxN6 8HyKQIKoDVzLCDx7CaL6nwscVhtB/QE= X-MC-Unique: 4CMFSSlfOW6xQhsqRIroEQ-1 From: Peter Krempa To: qemu-devel@nongnu.org Subject: [PATCH 1/2] migration: dirty-bitmap: Convert alias map inner members to a struct Date: Wed, 3 Feb 2021 13:59:59 +0100 Message-Id: <8e40a7337e3b9a0a4f11ee3b0e2f3ae4c76f2dbd.1612356810.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pkrempa@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=pkrempa@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -32 X-Spam_score: -3.3 X-Spam_bar: --- X-Spam_report: (-3.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.539, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: John Snow , Vladimir Sementsov-Ogievskiy , Markus Armbruster , qemu-block@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Currently the alias mapping hash stores just strings of the target objects internally. In further patches we'll be adding another member which will need to be stored in the map so convert the members to a struct. Signed-off-by: Peter Krempa Reviewed-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy --- migration/block-dirty-bitmap.c | 37 ++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index c61d382be8..b0403dd00c 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -169,6 +169,18 @@ typedef struct DBMState { static DBMState dbm_state; +typedef struct AliasMapInnerBitmap { + char *string; +} AliasMapInnerBitmap; + +static void free_alias_map_inner_bitmap(void *amin_ptr) +{ + AliasMapInnerBitmap *amin =3D amin_ptr; + + g_free(amin->string); + g_free(amin); +} + /* For hash tables that map node/bitmap names to aliases */ typedef struct AliasMapInnerNode { char *string; @@ -264,7 +276,7 @@ static GHashTable *construct_alias_map(const BitmapMigr= ationNodeAliasList *bbm, } bitmaps_map =3D g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); + g_free, free_alias_map_inner_b= itmap); amin =3D g_new(AliasMapInnerNode, 1); *amin =3D (AliasMapInnerNode){ @@ -277,6 +289,7 @@ static GHashTable *construct_alias_map(const BitmapMigr= ationNodeAliasList *bbm, for (bmbal =3D bmna->bitmaps; bmbal; bmbal =3D bmbal->next) { const BitmapMigrationBitmapAlias *bmba =3D bmbal->value; const char *bmap_map_from, *bmap_map_to; + AliasMapInnerBitmap *bmap_inner; if (strlen(bmba->alias) > UINT8_MAX) { error_setg(errp, @@ -311,8 +324,11 @@ static GHashTable *construct_alias_map(const BitmapMig= rationNodeAliasList *bbm, } } + bmap_inner =3D g_new0(AliasMapInnerBitmap, 1); + bmap_inner->string =3D g_strdup(bmap_map_to); + g_hash_table_insert(bitmaps_map, - g_strdup(bmap_map_from), g_strdup(bmap_map= _to)); + g_strdup(bmap_map_from), bmap_inner); } } @@ -538,11 +554,16 @@ static int add_bitmaps_to_list(DBMSaveState *s, Block= DriverState *bs, } if (bitmap_aliases) { - bitmap_alias =3D g_hash_table_lookup(bitmap_aliases, bitmap_na= me); - if (!bitmap_alias) { + AliasMapInnerBitmap *bmap_inner; + + bmap_inner =3D g_hash_table_lookup(bitmap_aliases, bitmap_name= ); + + if (!bmap_inner) { /* Skip bitmaps with no alias */ continue; } + + bitmap_alias =3D bmap_inner->string; } else { if (strlen(bitmap_name) > UINT8_MAX) { error_report("Cannot migrate bitmap '%s' on node '%s': " @@ -1074,14 +1095,18 @@ static int dirty_bitmap_load_header(QEMUFile *f, DB= MLoadState *s, bitmap_name =3D s->bitmap_alias; if (!s->cancelled && bitmap_alias_map) { - bitmap_name =3D g_hash_table_lookup(bitmap_alias_map, + AliasMapInnerBitmap *bmap_inner; + + bmap_inner =3D g_hash_table_lookup(bitmap_alias_map, s->bitmap_alias); - if (!bitmap_name) { + if (!bmap_inner) { error_report("Error: Unknown bitmap alias '%s' on node " "'%s' (alias '%s')", s->bitmap_alias, s->bs->node_name, s->node_alias); cancel_incoming_locked(s); } + + bitmap_name =3D bmap_inner->string; } if (!s->cancelled) { --=20 2.29.2 From nobody Sat May 18 19:47:52 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1612357494; cv=none; d=zohomail.com; s=zohoarc; b=Ul9kcWJ5v3UhTPpbxvme8popK8WDlvFqyWxEcx5MsR6yBUbqTY2Z+FwvFx0XlhNC+CfZFh3Ey6XWy4Q5u40VV8evc4nK6PhWF6fOVGLVLpwpiB2qbFLOJCuRnzfzbwF6vxEkTwv8aWr8pLJhGW2CqdUkEzLT017xFYlLgKbUfIY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1612357494; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=cHoIWqq9sWuJLvovuiB+9ciBQTK0nsKndjBS7Ld7rOg=; b=iCIILRoBk/KwUhBjJqBlW/fPMrasbQAIxWrLWGs+dNZAzBVHl0UaThitbT6u1BD3zgnJqOkZuu86rsBndKBTnEetPSI8yWFa5wdMe+ENNDA8JZfvgu5nsXLSNqwogEVW9gsrWiZnyZVMbmkaw5tORyedamjTuvDHfic1ViuwzyA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1612357494585800.8135821264171; Wed, 3 Feb 2021 05:04:54 -0800 (PST) Received: from localhost ([::1]:57360 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l7Hq1-0007IF-Hs for importer@patchew.org; Wed, 03 Feb 2021 08:04:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:50236) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l7HlZ-00048V-D3 for qemu-devel@nongnu.org; Wed, 03 Feb 2021 08:00:17 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:58756) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l7HlX-0003rW-Gt for qemu-devel@nongnu.org; Wed, 03 Feb 2021 08:00:17 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-34-GhESpVNGMWeZjzD112RhKQ-1; Wed, 03 Feb 2021 08:00:13 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F1F8E1800D41; Wed, 3 Feb 2021 13:00:11 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id 70FDE3828; Wed, 3 Feb 2021 13:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612357214; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cHoIWqq9sWuJLvovuiB+9ciBQTK0nsKndjBS7Ld7rOg=; b=ZvkN1MEKrz7ov5KxKRRW9Uf+cTe0vaH4INzUvBe0pV9mLszhNyb373vNF7etjiY8xaoC6P 8sbv2iJeoWWhxRrra00kgIMO3yl6IMYb+2nk7elSUa+rte5aF4fSnY1FGzdbQBSlDBY5ck QlIZQsBfuF6yyheaF/a6hkAtHxntSls= X-MC-Unique: GhESpVNGMWeZjzD112RhKQ-1 From: Peter Krempa To: qemu-devel@nongnu.org Subject: [PATCH 2/2] migration: dirty-bitmap: Allow control of bitmap persistence on destination Date: Wed, 3 Feb 2021 14:00:00 +0100 Message-Id: <3afd4b353cf75c01c9260ca65e073d897e8c42d2.1612356810.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pkrempa@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pkrempa@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -32 X-Spam_score: -3.3 X-Spam_bar: --- X-Spam_report: (-3.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.539, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: John Snow , Vladimir Sementsov-Ogievskiy , Markus Armbruster , qemu-block@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Bitmap's source persistence is transported over the migration stream and the destination mirrors it. In some cases the destination might want to persist bitmaps which are not persistent on the source (e.g. the result of merge of bitmaps from a number of layers on the source when migrating into a squashed image) but currently it would need to create another set of persistent bitmaps and merge them. This adds 'dest-persistent' optional property to 'BitmapMigrationBitmapAlias' which when present overrides the bitmap presence state from the source. Signed-off-by: Peter Krempa Reviewed-by: Eric Blake --- migration/block-dirty-bitmap.c | 30 +++++++++++++++++++++++++++++- qapi/migration.json | 7 ++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index b0403dd00c..1876c94c45 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -149,6 +149,9 @@ typedef struct DBMLoadState { bool before_vm_start_handled; /* set in dirty_bitmap_mig_before_vm_sta= rt */ + bool has_dest_persistent; + bool dest_persistent; + /* * cancelled * Incoming migration is cancelled for some reason. That means that we @@ -171,6 +174,10 @@ static DBMState dbm_state; typedef struct AliasMapInnerBitmap { char *string; + + /* for destination's properties setting bitmap state */ + bool has_dest_persistent; + bool dest_persistent; } AliasMapInnerBitmap; static void free_alias_map_inner_bitmap(void *amin_ptr) @@ -289,6 +296,8 @@ static GHashTable *construct_alias_map(const BitmapMigr= ationNodeAliasList *bbm, for (bmbal =3D bmna->bitmaps; bmbal; bmbal =3D bmbal->next) { const BitmapMigrationBitmapAlias *bmba =3D bmbal->value; const char *bmap_map_from, *bmap_map_to; + bool bmap_has_dest_persistent =3D false; + bool bmap_dest_persistent =3D false; AliasMapInnerBitmap *bmap_inner; if (strlen(bmba->alias) > UINT8_MAX) { @@ -317,6 +326,9 @@ static GHashTable *construct_alias_map(const BitmapMigr= ationNodeAliasList *bbm, bmap_map_from =3D bmba->alias; bmap_map_to =3D bmba->name; + bmap_has_dest_persistent =3D bmba->has_dest_persistent; + bmap_dest_persistent =3D bmba->dest_persistent; + if (g_hash_table_contains(bitmaps_map, bmba->alias)) { error_setg(errp, "The bitmap alias '%s'/'%s' is used t= wice", bmna->alias, bmba->alias); @@ -326,6 +338,8 @@ static GHashTable *construct_alias_map(const BitmapMigr= ationNodeAliasList *bbm, bmap_inner =3D g_new0(AliasMapInnerBitmap, 1); bmap_inner->string =3D g_strdup(bmap_map_to); + bmap_inner->has_dest_persistent =3D bmap_has_dest_persistent; + bmap_inner->dest_persistent =3D bmap_dest_persistent; g_hash_table_insert(bitmaps_map, g_strdup(bmap_map_from), bmap_inner); @@ -798,6 +812,7 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoad= State *s) uint32_t granularity =3D qemu_get_be32(f); uint8_t flags =3D qemu_get_byte(f); LoadBitmapState *b; + bool persistent; if (s->cancelled) { return 0; @@ -822,7 +837,13 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoa= dState *s) return -EINVAL; } - if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) { + if (s->has_dest_persistent) { + persistent =3D s->dest_persistent; + } else { + persistent =3D flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT; + } + + if (persistent) { bdrv_dirty_bitmap_set_persistence(s->bitmap, true); } @@ -1087,6 +1108,8 @@ static int dirty_bitmap_load_header(QEMUFile *f, DBML= oadState *s, if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) { const char *bitmap_name; + bool bitmap_has_dest_persistent =3D false; + bool bitmap_dest_persistent =3D false; if (!qemu_get_counted_string(f, s->bitmap_alias)) { error_report("Unable to read bitmap alias string"); @@ -1107,12 +1130,17 @@ static int dirty_bitmap_load_header(QEMUFile *f, DB= MLoadState *s, } bitmap_name =3D bmap_inner->string; + bitmap_has_dest_persistent =3D bmap_inner->has_dest_persistent; + bitmap_dest_persistent =3D bmap_inner->dest_persistent; } if (!s->cancelled) { g_strlcpy(s->bitmap_name, bitmap_name, sizeof(s->bitmap_name)); s->bitmap =3D bdrv_find_dirty_bitmap(s->bs, s->bitmap_name); + s->has_dest_persistent =3D bitmap_has_dest_persistent; + s->dest_persistent =3D bitmap_dest_persistent; + /* * bitmap may be NULL here, it wouldn't be an error if it is t= he * first occurrence of the bitmap diff --git a/qapi/migration.json b/qapi/migration.json index d1d9632c2a..32e64dbce6 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -533,12 +533,17 @@ # @alias: An alias name for migration (for example the bitmap name on # the opposite site). # +# @dest-persistent: If populated set the bitmap will be turned persistent +# or transient depending on this parameter. +# (since 6.0) +# # Since: 5.2 ## { 'struct': 'BitmapMigrationBitmapAlias', 'data': { 'name': 'str', - 'alias': 'str' + 'alias': 'str', + '*dest-persistent': 'bool' } } ## --=20 2.29.2