Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1WxkZk-0002Kd-9q for pgsql-bugs@arkaria.postgresql.org; Thu, 19 Jun 2014 22:12:56 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1WxkZj-0005OA-Ox for pgsql-bugs@arkaria.postgresql.org; Thu, 19 Jun 2014 22:12:55 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1WxkZi-0005M8-7X for pgsql-bugs@postgresql.org; Thu, 19 Jun 2014 22:12:54 +0000 Received: from smtprelay0219.b.hostedemail.com ([64.98.42.219] helo=smtprelay.b.hostedemail.com) by magus.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1WxkZd-0008Jq-Rg for pgsql-bugs@postgresql.org; Thu, 19 Jun 2014 22:12:52 +0000 Received: from filter.hostedemail.com (b-bigip1 [10.5.19.254]) by smtprelay01.b.hostedemail.com (Postfix) with ESMTP id 1203E2D2A11; Thu, 19 Jun 2014 22:12:48 +0000 (UTC) X-Session-Marker: 616C76686572726540616C76682E6E6F2D69702E6F7267 X-Spam-Summary: 50, 0, 0, , d41d8cd98f00b204, alvherre@alvh.no-ip.org, :::::, RULES_HIT:41:355:379:599:871:966:967:968:973:988:989:1260:1311:1312:1313:1314:1345:1359:1437:1515:1516:1518:1519:1534:1541:1575:1594:1595:1596:1711:1730:1747:1764:1777:1792:2196:2199:2393:2525:2560:2563:2682:2685:2859:2933:2937:2939:2942:2945:2947:2951:2954:3022:3138:3139:3140:3141:3142:3352:3865:3866:3867:3868:3870:3871:3872:3874:3934:3936:3938:3941:3944:3947:3950:3953:3956:3959:4250:4385:4605:4659:5007:6119:6261:6748:7281:9025:9121:10004:10226:10400:10848:11256:11257:11604:11658:11914:12296:12517:12519:12663:13894:13895, 0, RBL:none, CacheIP:none, Bayesian:0.5, 0.5, 0.5, Netcheck:none, DomainCache:0, MSF:not bulk, SPF:fn, MSBL:0, DNSBL:none, Custom_rules:0:0:0 X-HE-Tag: cord26_8ccc95c004729 X-Filterd-Recvd-Size: 4487 Received: from eldon.alvh.no-ip.org (unknown [190.8.79.154]) (Authenticated sender: alvherre@alvh.no-ip.org) by omf02.b.hostedemail.com (Postfix) with ESMTPA; Thu, 19 Jun 2014 22:12:47 +0000 (UTC) Received: by eldon.alvh.no-ip.org (Postfix, from userid 1000) id 0F1451FCB; Thu, 19 Jun 2014 18:12:41 -0400 (CLT) Date: Thu, 19 Jun 2014 18:12:41 -0400 From: Alvaro Herrera To: Bruce Momjian Cc: Andres Freund , PostgreSQL Bugs Subject: Re: pg_upgrade < 9.3 -> >=9.3 misses a step around multixacts Message-ID: <20140619221240.GC27747@eldon.alvh.no-ip.org> References: <20140619020633.GA20469@momjian.us> <20140619015205.GD3806@momjian.us> <20140619014034.GC3806@momjian.us> <20140619220425.GQ18688@eldon.alvh.no-ip.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="3V7upXqbjpZ4EhLz" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140619220425.GQ18688@eldon.alvh.no-ip.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Pg-Spam-Score: -1.1 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-bugs Precedence: bulk Sender: pgsql-bugs-owner@postgresql.org --3V7upXqbjpZ4EhLz Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit BTW I hacked up pg_resetxlog a bit to make it generate the necessary pg_multixact/offset file when -m is given. This is not acceptable for commit because it duplicates the #defines from pg_multixact.c, but maybe we want this functionality enough that we're interested in a more complete version of this patch; also it unconditionally writes one zero byte to the file, which is of course wrong if the file exists and already contains data. It'd be nice to be able to write this in a way that lets it work for all existing SLRU users (pg_clog is the most common, but pg_multixact/members and the predicate locking stuff might also be useful). Not sure what would that look like. Another consideration is that it doesn't remove existing files that are outside of the new valid range according to freezing parameters and such, but I'm not sure this is really doable considering that we might need to change the relminmxid and datminmxid values, etc. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services --3V7upXqbjpZ4EhLz Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="resetxlog_multi.patch" diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index 54cc5b0..a094490 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -74,6 +74,7 @@ static void KillExistingXLOG(void); static void KillExistingArchiveStatus(void); static void WriteEmptyXLOG(void); static void usage(void); +static void ensure_multi(MultiXactId multi); int @@ -325,7 +326,10 @@ main(int argc, char *argv[]) ControlFile.checkPointCopy.nextOid = set_oid; if (set_mxid != 0) + { ControlFile.checkPointCopy.nextMulti = set_mxid; + ensure_multi(set_mxid); + } if (set_mxoff != -1) ControlFile.checkPointCopy.nextMultiOffset = set_mxoff; @@ -1013,6 +1017,43 @@ WriteEmptyXLOG(void) close(fd); } +static void +ensure_multi(MultiXactId multi) +{ + char path[MAXPGPATH]; + int fd; + char abyte; + int offset; + +#define SLRU_PAGES_PER_SEGMENT 32 +#define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset)) +#define MultiXactIdToOffsetPage(xid) \ + ((xid) / (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE) + + snprintf(path, MAXPGPATH, "pg_multixact/offsets/%04X", + MultiXactIdToOffsetPage(multi) / SLRU_PAGES_PER_SEGMENT); + if ((fd = open(path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0) + { + fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), + progname, path, strerror(errno)); + exit(1); + } + offset = (((multi % (SLRU_PAGES_PER_SEGMENT * MULTIXACT_OFFSETS_PER_PAGE)) / MULTIXACT_OFFSETS_PER_PAGE) + 1) * BLCKSZ - 1; + if (lseek(fd, offset, SEEK_SET) < 0) + { + fprintf(stderr, _("%s: could not seek in file \"%s\" to offset %u: %s\n"), + progname, path, offset, strerror(errno)); + exit(1); + } + abyte = '\0'; + if (write(fd, &abyte, 1) != 1) + { + fprintf(stderr, _("%s: could not write one byte in file \"%s\": %s\n"), + progname, path, strerror(errno)); + exit(1); + } + close(fd); +} static void usage(void) --3V7upXqbjpZ4EhLz Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs --3V7upXqbjpZ4EhLz--