Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1ZDVjl-0008Ta-82 for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Jul 2015 10:40:57 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1ZDVjk-0001Cp-HD for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Jul 2015 10:40:56 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1ZDVhv-00086a-HV for pgsql-hackers@postgresql.org; Fri, 10 Jul 2015 10:39:03 +0000 Received: from mail-lb0-x231.google.com ([2a00:1450:4010:c04::231]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZDVhn-0006oU-Jh for pgsql-hackers@postgresql.org; Fri, 10 Jul 2015 10:39:02 +0000 Received: by lblf12 with SMTP id f12so20683841lbl.2 for ; Fri, 10 Jul 2015 03:38:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:reply-to:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=FJzbYu09JZ9O/pY2OMQb+h8LQnmYWqFi2ub4bZ1KWOg=; b=VVeXJR1aJYnAzo0IftsYGwhjZkLjt4AmLcTKtvTmFcIdRFXCTf9ryZQY88k6pWklT8 42roxIozflBHXAyaH8ZckG1FjC1++MA0AlXbQxADwBSoS3LJwzCfBp4I9dS+xGsDbuhI PMPlXgWU6n7sVJGHKEFISiW41jjeS6GC01nCz2IcAJdpTnElapzhB6AdROfgwfQhcJf4 CjnOcAGhqW22u6schJNK/qmPO/SGX2WwHA6J+DJgn2LRaiXctcDrtA4v5UIgQjpfMbnD v9iZpKSN+yKfu6SFHPoWT6oHoXFP1gJupHomsdzTn+00DTQCzXFRythc7Sd9QIYYizUR 0HDA== X-Received: by 10.152.115.142 with SMTP id jo14mr1328748lab.62.1436524734398; Fri, 10 Jul 2015 03:38:54 -0700 (PDT) Received: from [192.168.1.84] (45-246-190-90.dyn.estpak.ee. [90.190.246.45]) by smtp.gmail.com with ESMTPSA id kc4sm2285336lbc.39.2015.07.10.03.38.51 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Jul 2015 03:38:53 -0700 (PDT) Message-ID: <559FA0BA.3080808@iki.fi> Date: Fri, 10 Jul 2015 13:38:50 +0300 From: Heikki Linnakangas Reply-To: hlinnaka@iki.fi User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-Version: 1.0 To: Andres Freund CC: Tom Lane , Fujii Masao , Martijn van Oosterhout , PostgreSQL-development Subject: Re: WAL logging problem in 9.4.3? References: <20150703164931.GI3291@awork2.anarazel.de> <20150703170229.GJ3291@awork2.anarazel.de> <20150703172605.GM3291@awork2.anarazel.de> <27532.1436195680@sss.pgh.pa.us> <20150706152123.GK8902@alap3.anarazel.de> <28415.1436197794@sss.pgh.pa.us> <20150709182315.GG10242@alap3.anarazel.de> <29916.1436483171@sss.pgh.pa.us> <559F8759.2090401@iki.fi> <20150710091420.GK340@alap3.anarazel.de> In-Reply-To: <20150710091420.GK340@alap3.anarazel.de> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Pg-Spam-Score: -2.4 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org On 07/10/2015 12:14 PM, Andres Freund wrote: > On 2015-07-10 11:50:33 +0300, Heikki Linnakangas wrote: >> On 07/10/2015 02:06 AM, Tom Lane wrote: >>> cab9a0656c36739f was based on an actual user complaint, so we have good >>> evidence that there are people out there who care about the cost of >>> truncating a table many times in one transaction. >> >> Yeah, if we specifically made that case cheap, in response to a complaint, >> it would be a regression to make it expensive again. We might get away with >> it in a major version, but would hate to backpatch that. > > Sure. But making COPY slower would also be one. Of a longer standing > behaviour, with massively bigger impact if somebody relies on it? I mean > a new relfilenode includes a couple heap and storage options. Missing > the skip wal optimization can easily double or triple COPY durations. Completely disabling the skip-WAL optimization is not acceptable either, IMO. It's a false dichotomy that we have to choose between those two options. We'll have to consider the exact scenarios where we'd have to disable the optimization vs. using a new relfilenode. >>>> My tentative guess is that the best course is to >>>> a) Make heap_truncate_one_rel() create a new relfeilnode. That fixes the >>>> truncation replay issue. >>>> b) Force new pages to be used when using the heap_sync mode in >>>> COPY. That avoids the INIT danger you found. It seems rather >>>> reasonable to avoid using pages that have already been the target of >>>> WAL logging here in general. >>> >>> And what reason is there to think that this would fix all the problems? >>> We know of those two, but we've not exactly looked hard for other cases. >> >> Hmm. Perhaps that could be made to work, but it feels pretty fragile. > > It does. I'm not very happy about this mess. > >> For >> example, you could have an insert trigger on the table that inserts >> additional rows to the same table, and those inserts would be intermixed >> with the rows inserted by COPY. > > That should be fine? As long as copy only uses new pages INSERT can use > the same ones without problem. I think... > >> Full-page images in general are a problem. > > With the above rules I don't think it'd be. They'd contain the previous > contents, and we'll not target them again with COPY. Well, you really have to ensure that COPY never uses a page that any other operation (INSERT, DELETE, UPDATE, hint-bit-update) has ever touched and created a FPW for. The naive approach, where you just reset the target block at beginning of COPY and use the HEAP_INSERT_SKIP_FSM option is not enough. It's possible, but requires a lot more bookkeeping than might seem at first glance. >> I think we should >> 1. reliably and explicitly keep track of whether we've WAL-logged any >> TRUNCATE, INSERT/UPDATE+INIT, or any other full-page-logging operations on >> the relation, and >> 2. make sure we never skip WAL-logging again if we have. >> >> Let's add a flag, rd_skip_wal_safe, to RelationData that's initially set >> when a new relfilenode is created, i.e. whenever rd_createSubid or >> rd_newRelfilenodeSubid is set. Whenever a TRUNCATE or a full-page image >> (including INSERT/UPDATE+INIT) is WAL-logged, clear the flag. In copy.c, >> only skip WAL-logging if the flag is still set. To deal with the case that >> the flag gets cleared in the middle of COPY, also check the flag whenever >> we're about to skip WAL-logging in heap_insert, and if it's been cleared, >> ignore the HEAP_INSERT_SKIP_WAL option and WAL-log anyway. > > Am I missing something or will this break the BEGIN; TRUNCATE; COPY; > pattern we use ourselves and have suggested a number of times ? Sorry, I was imprecise above. I meant "whenever an XLOG_SMGR_TRUNCATE record is WAL-logged", rather than a "whenever a TRUNCATE [command] is WAL-logged". TRUNCATE on a table that wasn't created in the same transaction doesn't emit an XLOG_SMGR_TRUNCATE record, because it creates a whole new relfilenode. So that's OK. In the long-term, I'd like to refactor this whole thing so that we never WAL-log any operations on a relation that's created in the same transaction (when wal_level=minimal). Instead, at COMMIT, we'd fsync() the relation, or if it's smaller than some threshold, WAL-log the contents of the whole file at that point. That would move all that more-difficult-than-it-seems-at-first-glance logic from COPY and indexam's to a central location, and it would allow the same optimization for all operations, not just COPY. But that probably isn't feasible to backpatch. - Heikki -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers