Received: from makus.postgresql.org (makus.postgresql.org [98.129.198.125]) by mail.postgresql.org (Postfix) with ESMTP id 2E09F126090C for ; Wed, 27 Jun 2012 10:55:51 -0300 (ADT) Received: from exprod7og123.obsmtp.com ([64.18.2.24]) by makus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1Sjsik-0000vM-4r for pgsql-hackers@postgresql.org; Wed, 27 Jun 2012 13:55:50 +0000 Received: from mail-pz0-f53.google.com ([209.85.210.53]) (using TLSv1) by exprod7ob123.postini.com ([64.18.6.12]) with SMTP ID DSNKT+sQ2XyBGcJ+fcjJabeTYIxPbCPFkoPx@postini.com; Wed, 27 Jun 2012 06:55:50 PDT Received: by dadg9 with SMTP id g9so1753472dad.26 for ; Wed, 27 Jun 2012 06:55:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=W9n6Fs3nqCl7DVpB9Kr7T9Eum0Omgtpm4X9Ab6ly+9A=; b=R8TA2uPRqy2wriTq1QsT0tFDWUcJRqR64YZJWjkOWtukX1rGSboIE+pWPO5nbCjCCi Gy4E3ZM0qpW/ZQHN47+GTEfWeR4uEc5BrKwqnt2XAZR/GGNAoYFnzdYLjAdgE+LWBr31 Xmomb06tE5zWXKV6wgevVY+d+KMXKFrGV2J6U2a/V+yJftAUFWwTNMP/BLPc5g9r1Zup xsFWn4zQTj2IUlrBB3SH+PtpTJjI2+caVU3woBMw98I4MF2kFe8LrUAW21AnHub2TYTV olyRHLKFNSFyLEZzRPuxjOEFARtoZb+9BRXP1qb/1AXS/1bX150EnwyVi4+qCChv0cxG iycA== Received: by 10.68.221.72 with SMTP id qc8mr64401821pbc.63.1340805336885; Wed, 27 Jun 2012 06:55:36 -0700 (PDT) Received: from [172.20.101.245] ([66.201.48.54]) by mx.google.com with ESMTPS id se9sm15254835pbc.25.2012.06.27.06.55.35 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 27 Jun 2012 06:55:35 -0700 (PDT) Message-ID: <4FEB10D6.4050204@enterprisedb.com> Date: Wed, 27 Jun 2012 16:55:34 +0300 From: Heikki Linnakangas User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.4) Gecko/20120510 Icedove/10.0.4 MIME-Version: 1.0 To: Andres Freund CC: pgsql-hackers@postgresql.org Subject: Re: [PATCH 07/16] Log enough data into the wal to reconstruct logical changes from it if wal_level=logical References: <201206131327.24092.andres@2ndquadrant.com> <1339586927-13156-7-git-send-email-andres@2ndquadrant.com> In-Reply-To: <1339586927-13156-7-git-send-email-andres@2ndquadrant.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQklCYHNNwhGcsLVdr5yacxXZScLAQl4r0B85lUbR6ZlZzB/+Q0bkiiy44MZ+s8IQysfzfMn X-Pg-Spam-Score: -4.2 (----) X-Archive-Number: 201206/1636 X-Sequence-Number: 210476 On 13.06.2012 14:28, Andres Freund wrote: > @@ -2584,6 +2610,73 @@ l1: > rdata[1].buffer_std = true; > rdata[1].next = NULL; > > + /* > + * XXX: We could decide not to log changes when the origin is not the > + * local node, that should reduce redundant logging. > + */ > + if(need_tuple){ > + xl_heap_header xlhdr; > ... > + relationFindPrimaryKey(relation,&indexoid,&pknratts, pkattnum, pktypoid, pkopclass); > + > + if(!indexoid){ > + elog(WARNING, "Could not find primary key for table with oid %u", > + relation->rd_id); > + goto no_index_found; > + } > + > + index_rel = index_open(indexoid, AccessShareLock); > + > + indexdesc = RelationGetDescr(index_rel); > + > + for(natt = 0; natt< indexdesc->natts; natt++){ > + idxvals[natt] = > + fastgetattr(&tp, pkattnum[natt], desc,&idxisnull[natt]); > + Assert(!idxisnull[natt]); > + } > + > + idxtuple = heap_form_tuple(indexdesc, idxvals, idxisnull); > + > + xlhdr.t_infomask2 = idxtuple->t_data->t_infomask2; > + xlhdr.t_infomask = idxtuple->t_data->t_infomask; > + xlhdr.t_hoff = idxtuple->t_data->t_hoff; > + > + rdata[1].next =&(rdata[2]); > + rdata[2].data = (char*)&xlhdr; > + rdata[2].len = SizeOfHeapHeader; > + rdata[2].buffer = InvalidBuffer; > + rdata[2].next = NULL; > + > + rdata[2].next =&(rdata[3]); > + rdata[3].data = (char *) idxtuple->t_data + offsetof(HeapTupleHeaderData, t_bits); > + rdata[3].len = idxtuple->t_len - offsetof(HeapTupleHeaderData, t_bits); > + rdata[3].buffer = InvalidBuffer; > + rdata[3].next = NULL; > + > + heap_close(index_rel, NoLock); > + no_index_found: > + ; > + } > + > recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata); > > PageSetLSN(page, recptr); It's not cool to do all that primary key lookup stuff within the critical section, while holding a lock on the page. -- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com