Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nUw0C-00022c-9A for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Mar 2022 19:41:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nUw0B-0008SK-57 for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Mar 2022 19:41:39 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nUw0A-0008SB-Md for pgsql-hackers@lists.postgresql.org; Thu, 17 Mar 2022 19:41:38 +0000 Received: from mail-qt1-x835.google.com ([2607:f8b0:4864:20::835]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nUw07-0004Xs-LS for pgsql-hackers@postgresql.org; Thu, 17 Mar 2022 19:41:37 +0000 Received: by mail-qt1-x835.google.com with SMTP id 11so5234710qtt.9 for ; Thu, 17 Mar 2022 12:41:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telsasoft-com.20210112.gappssmtp.com; s=20210112; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=SGXNfXrL0jbds1VeCqIchAVzelLfaba98IjD26IfwFo=; b=cf+iMsnYJlj1aXKmgOF+Z6QU2Y924pwaoyl7+w962KFBvmbDQdoKJFKSXmdLEnQI1B xsoDONCML1hiFyhJ8ew5UMSGOSeWJTjOjp96bOgnisOieOyobEVtcebL2TsAc/HKkNSg KuQcbPZbIM2STnm7txdf6XjPC+JCRX5Z+tyXU8tKWHK+NU13OEnZxtTwEsInRvWU49/g wOSjSZbvCgMUXWHOan8KuBNTC0Pw5N0hhoqLDr+zBJ7QdI3XWRDE/YP9l4Mk4NTDC2ys pNQ1SeQ4qcphqnGvdX+J5TbYUr97+/w/ZdmSBN0bXKOJr5D7lnkHl+csCal9DzDRZrPr p8Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=SGXNfXrL0jbds1VeCqIchAVzelLfaba98IjD26IfwFo=; b=DF+MfTrRGOWwNkiPqi2D9bIbAfJ+RvvvGKknZ2GE4TEq8NyVqnX5pjw/QtDH6hi0sL nD5iVo3BzUROiH3PfvO9ksOvX2C0HrKLxCPMEfkEomsEc2ISwNd/6X3/EohyZLIEv+/y AVRb7ePyW+rfxeTd3Tp5iJZr4dEULPtTunU4PX5zLJJ4gXipnI2jA1q4zZR7GqmULhF1 sEB/u32JArBdGTJuSW51HyWA69gj12WLIEhLK6VG+Td4aUHKZ7DShf6YiCbJ/B6r67Bs d5sxk0Lo2KM+O/MKMg8ge0m1UppPzQOsV+wI9bq6MtL4PQRO6iVXhMl0XMDKUEuQFlMB tYww== X-Gm-Message-State: AOAM532O1rPU7asR+7E1dAqhNXxBLqgBMvrdvL7fduXAkxrcexbeQcK9 NDsiDmb31IljFXrvbK9CLrW/qg== X-Google-Smtp-Source: ABdhPJxw4kthPeqEoN/3VU+4ngnOcre70frQmL+PvPZJASrPqYSsLg2DPlPz2h6DQB2UZHhUEwrPHw== X-Received: by 2002:ac8:5a4f:0:b0:2e1:a7be:2d13 with SMTP id o15-20020ac85a4f000000b002e1a7be2d13mr5046387qta.598.1647546092937; Thu, 17 Mar 2022 12:41:32 -0700 (PDT) Received: from pryzbyj.telsasoft (charmander.telsasoft.com. [50.244.222.1]) by smtp.gmail.com with ESMTPSA id k73-20020a37a14c000000b0067b316a4161sm3000837qke.120.2022.03.17.12.41.32 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 Mar 2022 12:41:32 -0700 (PDT) Received: by pryzbyj.telsasoft (Postfix, from userid 1000) id EBADA801246; Thu, 17 Mar 2022 14:41:30 -0500 (CDT) Date: Thu, 17 Mar 2022 14:41:30 -0500 From: Justin Pryzby To: Robert Haas Cc: Dipesh Pandit , Andres Freund , Jeevan Ladhe , Alvaro Herrera , "Shinoda, Noriyoshi (PN Japan FSIP)" , Abhijit Menon-Sen , Dmitry Dolgov <9erthalion6@gmail.com>, Jeevan Ladhe , Mark Dilger , pgsql-hackers@postgresql.org, tushar Subject: Re: refactoring basebackup.c (zstd workers) Message-ID: <20220317194130.GM28503@telsasoft.com> References: <20220311010223.GI28503@telsasoft.com> <20220312015253.zokhkwdn5xbbd4vf@alap3.anarazel.de> <20220314163547.GT28503@telsasoft.com> <20220314171152.GU28503@telsasoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 9178c779ba..00c593f1af 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2731,14 +2731,24 @@ The commands accepted in replication mode are: + + For gzip the compression level should be an gzip comma +++ b/src/backend/replication/basebackup.c @@ -18,6 +18,7 @@ #include "access/xlog_internal.h" /* for pg_start/stop_backup */ #include "common/file_perm.h" +#include "common/backup_compression.h" alphabetical - errmsg("unrecognized compression algorithm: \"%s\"", + errmsg("unrecognized compression algorithm \"%s\"", Most other places seem to say "compression method". So I'd suggest to change that here, and in doc/src/sgml/ref/pg_basebackup.sgml. - if (o_compression_level && !o_compression) + if (o_compression_detail && !o_compression) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("compression level requires compression"))); s/level/detail/ /* + * Basic parsing of a value specified for -Z/--compress. + * + * We're not concerned here with understanding exactly what behavior the + * user wants, but we do need to know whether the user is requesting client + * or server side compression or leaving it unspecified, and we need to + * separate the name of the compression algorithm from the detail string. + * + * For instance, if the user writes --compress client-lz4:6, we want to + * separate that into (a) client-side compression, (b) algorithm "lz4", + * and (c) detail "6". Note, however, that all the client/server prefix is + * optional, and so is the detail. The algorithm name is required, unless + * the whole string is an integer, in which case we assume "gzip" as the + * algorithm and use the integer as the detail. .. */ static void +parse_compress_options(char *option, char **algorithm, char **detail, + CompressionLocation *locationres) It'd be great if this were re-usable for wal_compression, which I hope in pg16 will support at least level=N. And eventually pg_dump. But those clients shouldn't accept a client/server prefix. Maybe the way to handle that is for those tools to check locationres and reject it if it was specified. + * We're not concerned with validation at this stage, so if the user writes + * --compress client-turkey:sandwhich, the requested algorithm is "turkey" + * and the detail string is "sandwhich". We'll sort out whether that's legal sp: sandwich + WalCompressionMethod wal_compress_method; This is confusingly similar to src/include/access/xlog.h:WalCompression. I think someone else mentioned this before ? + * A compression specification specifies the parameters that should be used + * when * performing compression with a specific algorithm. The simplest star +/* + * Get the human-readable name corresponding to a particular compression + * algorithm. + */ +char * +get_bc_algorithm_name(bc_algorithm algorithm) should be const ? + /* As a special case, the specification can be a bare integer. */ + bare_level = strtol(specification, &bare_level_endp, 10); Should this call expect_integer_value()? See below. + result->parse_error = + pstrdup("found empty string where a compression option was expected"); Needs to be localized with _() ? Also, document that it's pstrdup'd. +/* + * Parse 'value' as an integer and return the result. + * + * If parsing fails, set result->parse_error to an appropriate message + * and return -1. + */ +static int +expect_integer_value(char *keyword, char *value, bc_specification *result) -1 isn't great, since it's also an integer, and, also a valid compression level for zstd (did you see my message about that?). Maybe INT_MIN is ok. +{ + int ivalue; + char *ivalue_endp; + + ivalue = strtol(value, &ivalue_endp, 10); Should this also set/check errno ? And check if value != ivalue_endp ? See strtol(3) +char * +validate_bc_specification(bc_specification *spec) ... + /* + * If a compression level was specified, check that the algorithm expects + * a compression level and that the level is within the legal range for + * the algorithm. It would be nice if this could be shared with wal_compression and pg_dump. We shouldn't need multiple places with structures giving the algorithms and range of compression levels. + unsigned options; /* OR of BACKUP_COMPRESSION_OPTION constants */ Should be "unsigned int" or "bits32" ? The server crashes if I send an unknown option - you should hit that in the regression tests. $ src/bin/pg_basebackup/pg_basebackup --wal-method fetch -Ft -D - -h /tmp --no-sync --no-manifest --compress=server-lz4:a |wc -c TRAP: FailedAssertion("pointer != NULL", File: "../../../../src/include/utils/memutils.h", Line: 123, PID: 8627) postgres: walsender pryzbyj [local] BASE_BACKUP(ExceptionalCondition+0xa0)[0x560b45d7b64b] postgres: walsender pryzbyj [local] BASE_BACKUP(pfree+0x5d)[0x560b45dad1ea] postgres: walsender pryzbyj [local] BASE_BACKUP(parse_bc_specification+0x154)[0x560b45dc5d4f] postgres: walsender pryzbyj [local] BASE_BACKUP(+0x43d56c)[0x560b45bc556c] postgres: walsender pryzbyj [local] BASE_BACKUP(SendBaseBackup+0x2d)[0x560b45bc85ca] postgres: walsender pryzbyj [local] BASE_BACKUP(exec_replication_command+0x3a2)[0x560b45bdddb2] postgres: walsender pryzbyj [local] BASE_BACKUP(PostgresMain+0x6b2)[0x560b45c39131] postgres: walsender pryzbyj [local] BASE_BACKUP(+0x40530e)[0x560b45b8d30e] postgres: walsender pryzbyj [local] BASE_BACKUP(+0x408572)[0x560b45b90572] postgres: walsender pryzbyj [local] BASE_BACKUP(+0x4087b9)[0x560b45b907b9] postgres: walsender pryzbyj [local] BASE_BACKUP(PostmasterMain+0x1135)[0x560b45b91d9b] postgres: walsender pryzbyj [local] BASE_BACKUP(main+0x229)[0x560b45ad0f78] This is interpreted like client-gzip-1; should multiple specifications of compress be prohibited ? | src/bin/pg_basebackup/pg_basebackup --wal-method fetch -Ft -D - -h /tmp --no-sync --no-manifest --compress=server-lz4 --compress=1