From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by dcvr.yhbt.net (Postfix) with ESMTP id B5EE31F9FD for ; Fri, 12 Mar 2021 20:20:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234674AbhCLUUM (ORCPT ); Fri, 12 Mar 2021 15:20:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234690AbhCLUUC (ORCPT ); Fri, 12 Mar 2021 15:20:02 -0500 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 19B45C061574 for ; Fri, 12 Mar 2021 12:20:02 -0800 (PST) Received: by mail-wm1-x32c.google.com with SMTP id g20so4532190wmk.3 for ; Fri, 12 Mar 2021 12:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=oev4451zcfiJIRokI1RZPsQFi4LyNbqQe+VIWGZcV5k=; b=tiIg3iIzFdtUNJVVGRrnsQcH6k9qGUiEXnIZe+GPdxkqyvNDSYs0jWcgkI1nCnPU51 h3+baL9FE+vz0Fx9coNyRjH8eI0aAOj6OFDtN2ZU7dmmivBoetYGsft/fG2UON/WW2c+ a3cy3VSdyEUJ9aklmZXQ9VcRyRSK4370EZr9fK0+9oPX1tgYaPaSPwlnCgH7fuMiqSyt wb7TBFauwOrQWmrxXhcb2gmA+kJRCd32+/1uuTGcbbgBNHOY3iMQhjIypdZStkrDEHwU FRcScNhtCAD5giauTqhvYv+8Usa6Uo6GmP3cEeC1BZ66RoLxVX70NYhlKx5lh8TvJjVl dC5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=oev4451zcfiJIRokI1RZPsQFi4LyNbqQe+VIWGZcV5k=; b=fqcTi3peRu8FyGCr2Tss+R24mOwu5OR8XdHpJfxiMwzq1oOpbo2wPxjN2VRZvJ7Qv6 310j+MPbZHC92sKydU2FXB2VjVj0Ej684mOXO7KHkzrCXSmIGp6i9VgP1K83YUOo2y1k mYd+JJXNrBLZxqRt2IKDpcW54KJueZQTpHcdVMs+lObEMKnKw3KQ8DaCt+AWAhxOwpCl uYz5ds5j+YGZFk/PAEERI96fCAI+Avbdryx5apogv92D3VslhFHeKipAiZa86AUO4FMY QdXX1jFrfX9EXgD2a8L7NvKBzcFdxCgtw2WiCCi/hoUxjy0f0SU0JYv30m0EzmIU4jxR YxxA== X-Gm-Message-State: AOAM533Kc/N7QWQqqKnxDqfpTQqlFL2EjSHzFXa24Z0zulQkCItPVUmv 1e3noKvkVzLfzOx+ptxkuaeKSZQ3TvA= X-Google-Smtp-Source: ABdhPJxzCvnq+cBGG2xhbiSH31JC35HEdIUVQe9VR7ldiL5z7uwY4NyOt7kO+mry+hQd9GSkPUteOQ== X-Received: by 2002:a1c:1dd4:: with SMTP id d203mr14454031wmd.83.1615580400834; Fri, 12 Mar 2021 12:20:00 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id m3sm3258357wmc.48.2021.03.12.12.20.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Mar 2021 12:20:00 -0800 (PST) Message-Id: <1bd136f6a6df9f31e3788f16a70b935e197d674d.1615580397.git.gitgitgadget@gmail.com> In-Reply-To: References: From: "Han-Wen Nienhuys via GitGitGadget" Date: Fri, 12 Mar 2021 20:19:44 +0000 Subject: [PATCH v5 03/15] reftable: add error related functionality Fcc: Sent Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Jeff King , Ramsay Jones , Jonathan Nieder , Johannes Schindelin , Jonathan Tan , Josh Steadmon , Emily Shaffer , Patrick Steinhardt , =?UTF-8?Q?=C3=86var_Arnfj=C3=B6r=C3=B0?= Bjarmason , Felipe Contreras , Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys The reftable/ directory is structured as a library, so it cannot crash on misuse. Instead, it returns an error codes. In addition, the error code can be used to signal conditions from lower levels of the library to be handled by higher levels of the library. For example, a transaction might legitimately write an empty reftable file, but in that case, we'd want to shortcut the transaction overhead. Signed-off-by: Han-Wen Nienhuys --- reftable/error.c | 41 ++++++++++++++++++++++++++ reftable/reftable-error.h | 62 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 reftable/error.c create mode 100644 reftable/reftable-error.h diff --git a/reftable/error.c b/reftable/error.c new file mode 100644 index 000000000000..f6f16def9214 --- /dev/null +++ b/reftable/error.c @@ -0,0 +1,41 @@ +/* +Copyright 2020 Google LLC + +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file or at +https://developers.google.com/open-source/licenses/bsd +*/ + +#include "reftable-error.h" + +#include + +const char *reftable_error_str(int err) +{ + static char buf[250]; + switch (err) { + case REFTABLE_IO_ERROR: + return "I/O error"; + case REFTABLE_FORMAT_ERROR: + return "corrupt reftable file"; + case REFTABLE_NOT_EXIST_ERROR: + return "file does not exist"; + case REFTABLE_LOCK_ERROR: + return "data is outdated"; + case REFTABLE_API_ERROR: + return "misuse of the reftable API"; + case REFTABLE_ZLIB_ERROR: + return "zlib failure"; + case REFTABLE_NAME_CONFLICT: + return "file/directory conflict"; + case REFTABLE_EMPTY_TABLE_ERROR: + return "wrote empty table"; + case REFTABLE_REFNAME_ERROR: + return "invalid refname"; + case -1: + return "general error"; + default: + snprintf(buf, sizeof(buf), "unknown error code %d", err); + return buf; + } +} diff --git a/reftable/reftable-error.h b/reftable/reftable-error.h new file mode 100644 index 000000000000..6f89bedf1a58 --- /dev/null +++ b/reftable/reftable-error.h @@ -0,0 +1,62 @@ +/* +Copyright 2020 Google LLC + +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file or at +https://developers.google.com/open-source/licenses/bsd +*/ + +#ifndef REFTABLE_ERROR_H +#define REFTABLE_ERROR_H + +/* + * Errors in reftable calls are signaled with negative integer return values. 0 + * means success. + */ +enum reftable_error { + /* Unexpected file system behavior */ + REFTABLE_IO_ERROR = -2, + + /* Format inconsistency on reading data */ + REFTABLE_FORMAT_ERROR = -3, + + /* File does not exist. Returned from block_source_from_file(), because + * it needs special handling in stack. + */ + REFTABLE_NOT_EXIST_ERROR = -4, + + /* Trying to write out-of-date data. */ + REFTABLE_LOCK_ERROR = -5, + + /* Misuse of the API: + * - on writing a record with NULL refname. + * - on writing a reftable_ref_record outside the table limits + * - on writing a ref or log record before the stack's + * next_update_inde*x + * - on writing a log record with multiline message with + * exact_log_message unset + * - on reading a reftable_ref_record from log iterator, or vice versa. + * + * When a call misuses the API, the internal state of the library is + * kept unchanged. + */ + REFTABLE_API_ERROR = -6, + + /* Decompression error */ + REFTABLE_ZLIB_ERROR = -7, + + /* Wrote a table without blocks. */ + REFTABLE_EMPTY_TABLE_ERROR = -8, + + /* Dir/file conflict. */ + REFTABLE_NAME_CONFLICT = -9, + + /* Invalid ref name. */ + REFTABLE_REFNAME_ERROR = -10, +}; + +/* convert the numeric error code to a string. The string should not be + * deallocated. */ +const char *reftable_error_str(int err); + +#endif -- gitgitgadget