From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronnie Sahlberg Subject: [PATCH v18 34/48] walker.c: use ref transaction for ref updates Date: Tue, 17 Jun 2014 08:53:48 -0700 Message-ID: <1403020442-31049-35-git-send-email-sahlberg@google.com> References: <1403020442-31049-1-git-send-email-sahlberg@google.com> Cc: Ronnie Sahlberg To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Tue Jun 17 17:55:12 2014 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Wwvj4-0004aq-C9 for gcvg-git-2@plane.gmane.org; Tue, 17 Jun 2014 17:55:10 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933210AbaFQPzB (ORCPT ); Tue, 17 Jun 2014 11:55:01 -0400 Received: from mail-pd0-f201.google.com ([209.85.192.201]:61157 "EHLO mail-pd0-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756339AbaFQPyH (ORCPT ); Tue, 17 Jun 2014 11:54:07 -0400 Received: by mail-pd0-f201.google.com with SMTP id v10so601283pde.2 for ; Tue, 17 Jun 2014 08:54:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=W4VspUsqU/VmZWSPybVzHOik0/p+Qwh4Qkf8P0WDtVY=; b=aYlnSMTG6CZQJbuIlSxhhqwF0gZxY14ZayIcLUolg4QZULVeaS9JnvJqqo7fqigGjJ bbRwMU1sfg79CFRJ4Izeq4BszsFSfBW6Z6f0jhxf7J8WzocR0oA4AdVlFUOnG9TED9+V CxEYO/6UkxrFjrQfO4CTdmkr95KkoN2Frx6z+XbBNDdqV/3FLN6jDvO/OEdBO3zgx2Pm jXAJMtE/H71M+TfrJmBjzybuNhNm0XL44mQDhVPCv7leHmmfBdfPqL9pe1DRBu1/b19c LxVvBAWRpK3nO568MU9d5rxQlRcQuh1a/ruG4Glkfz+ak05G+pXqP29x2iGRwzlagHNK GdUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=W4VspUsqU/VmZWSPybVzHOik0/p+Qwh4Qkf8P0WDtVY=; b=SvJncl/93ZR4vpn2vZXrwpI+6428lRAuW0sbeA+Qsi2ChxSY5Dyf07jwMK62G6LexG frd6ImuE3jIGcMON/eC4GCsP5Nf///WgAdaOIOikMG85HNrWU0wcuSYtSZry15HrySRs jPCNQRGq0PlfbgIAig6wjfT2VCKTdMyaRJW1IsbdlkghAKbxMMl/kHdN5pfxNmbFefbe n0cvsmuMKVU8DkJ+WrNbo7u/8yjQD//9Jy/x4zeXHO7nTNzzXH2ulbfCtars4hLt6MGM Ceg/JqxZGSPPyVagez5cjVRp4ZQDiQBd70X5nwUj+TQF1uR6aG4B7oo4BbASYYDDL+lE kftg== X-Gm-Message-State: ALoCoQluD4GhueQIFWjAP4qwYQ2caTzXMYL2St0/uyGKzhwaHBm1SySDOTlHGFDDuy99AHRJ3WBg X-Received: by 10.66.151.140 with SMTP id uq12mr1249979pab.23.1403020445747; Tue, 17 Jun 2014 08:54:05 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id o69si1208005yhp.6.2014.06.17.08.54.05 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 17 Jun 2014 08:54:05 -0700 (PDT) Received: from sahlberg1.mtv.corp.google.com (sahlberg1.mtv.corp.google.com [172.27.69.52]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id 6EDB131C76D; Tue, 17 Jun 2014 08:54:05 -0700 (PDT) Received: by sahlberg1.mtv.corp.google.com (Postfix, from userid 177442) id 4A9F0E0EE0; Tue, 17 Jun 2014 08:54:05 -0700 (PDT) X-Mailer: git-send-email 2.0.0.438.gec92e5c In-Reply-To: <1403020442-31049-1-git-send-email-sahlberg@google.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Switch to using ref transactions in walker_fetch(). As part of the refactoring to use ref transactions we also fix a potential memory leak where in the original code if write_ref_sha1() would fail we would end up returning from the function without free()ing the msg string. Note that this function is only called when fetching from a remote HTTP repository onto the local (most of the time single-user) repository which likely means that the type of collissions that the previous locking would protect against and cause the fetch to fail for to be even more rare. Reviewed-by: Jonathan Nieder Signed-off-by: Ronnie Sahlberg --- walker.c | 59 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/walker.c b/walker.c index 1dd86b8..60d9f9e 100644 --- a/walker.c +++ b/walker.c @@ -251,39 +251,36 @@ void walker_targets_free(int targets, char **target, const char **write_ref) int walker_fetch(struct walker *walker, int targets, char **target, const char **write_ref, const char *write_ref_log_details) { - struct ref_lock **lock = xcalloc(targets, sizeof(struct ref_lock *)); + struct strbuf ref_name = STRBUF_INIT; + struct strbuf err = STRBUF_INIT; + struct ref_transaction *transaction = NULL; unsigned char *sha1 = xmalloc(targets * 20); - char *msg; - int ret; + char *msg = NULL; int i; save_commit_buffer = 0; - for (i = 0; i < targets; i++) { - if (!write_ref || !write_ref[i]) - continue; - - lock[i] = lock_ref_sha1(write_ref[i], NULL); - if (!lock[i]) { - error("Can't lock ref %s", write_ref[i]); - goto unlock_and_fail; + if (write_ref) { + transaction = ref_transaction_begin(&err); + if (!transaction) { + error("%s", err.buf); + goto rollback_and_fail; } } - if (!walker->get_recover) for_each_ref(mark_complete, NULL); for (i = 0; i < targets; i++) { if (interpret_target(walker, target[i], &sha1[20 * i])) { error("Could not interpret response from server '%s' as something to pull", target[i]); - goto unlock_and_fail; + goto rollback_and_fail; } if (process(walker, lookup_unknown_object(&sha1[20 * i]))) - goto unlock_and_fail; + goto rollback_and_fail; } if (loop(walker)) - goto unlock_and_fail; + goto rollback_and_fail; if (write_ref_log_details) { msg = xmalloc(strlen(write_ref_log_details) + 12); @@ -294,19 +291,33 @@ int walker_fetch(struct walker *walker, int targets, char **target, for (i = 0; i < targets; i++) { if (!write_ref || !write_ref[i]) continue; - ret = write_ref_sha1(lock[i], &sha1[20 * i], msg ? msg : "fetch (unknown)"); - lock[i] = NULL; - if (ret) - goto unlock_and_fail; + strbuf_reset(&ref_name); + strbuf_addf(&ref_name, "refs/%s", write_ref[i]); + if (ref_transaction_update(transaction, ref_name.buf, + &sha1[20 * i], NULL, 0, 0, + &err)) { + error("%s", err.buf); + goto rollback_and_fail; + } + } + if (write_ref) { + if (ref_transaction_commit(transaction, + msg ? msg : "fetch (unknown)", + &err)) { + error("%s", err.buf); + goto rollback_and_fail; + } + ref_transaction_free(transaction); } - free(msg); + free(msg); return 0; -unlock_and_fail: - for (i = 0; i < targets; i++) - if (lock[i]) - unlock_ref(lock[i]); +rollback_and_fail: + ref_transaction_free(transaction); + free(msg); + strbuf_release(&err); + strbuf_release(&ref_name); return -1; } -- 2.0.0.438.gec92e5c