Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tDmzj-003CIR-Gx for pgsql-hackers@arkaria.postgresql.org; Wed, 20 Nov 2024 15:51:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tDmzi-006vHh-5P for pgsql-hackers@arkaria.postgresql.org; Wed, 20 Nov 2024 15:51:54 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tDmzh-006vHV-Nz for pgsql-hackers@lists.postgresql.org; Wed, 20 Nov 2024 15:51:53 +0000 Received: from mail-io1-xd2f.google.com ([2607:f8b0:4864:20::d2f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tDmze-002ts8-QL for pgsql-hackers@postgresql.org; Wed, 20 Nov 2024 15:51:52 +0000 Received: by mail-io1-xd2f.google.com with SMTP id ca18e2360f4ac-83e2d80ad51so81666639f.3 for ; Wed, 20 Nov 2024 07:51:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732117910; x=1732722710; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=VQSiHwdESbkET2YLk1J5q/PvgP0mk481bjOs0SYQrMM=; b=UctzfQ8AycJ+yjJywQByvcrW2RyFYHtrvGScb/eeUKkP1YEKf3htsScL+M0MU/9Qrg JufGnTe1JLREE9T5qdPCe/T/sohU/9eb8Xqz2jRdtxWCDrDRWMWKg4HI4ToTlVCPiDYd xj+FdVlTi/V/Sbni5b7qxouA2vC7263GenEm/gKBqsAuJNmArYYyrCyKBYhFC/CKNMEX J++d8zBmPteUyQyvQSYToAr0fQAGtk5SCyHVARgNfrtlexbQIvQsPcAI9jS5rl5hAQfH qkBv6S5zm3o3RX3+xjAirc39Qmsv9mSuE2siPecKvWdfSOQV+qfK9oPO9qwuNT24reAl kdXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732117910; x=1732722710; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=VQSiHwdESbkET2YLk1J5q/PvgP0mk481bjOs0SYQrMM=; b=qR6kDq3W+p1vZbcerdbcZ5HDtYjm9JEK5Bag1T9CoXkCSp7nItNj27Pw0ehm8akaZ5 ALIBCndYqWm5Pca1l3o+vZPTtJjb9+xIIyfw1xStK14bF+YpvFx6L/nVYUFI7ve0Xceq aAwiAMDHj8cG2scjFVWjYlU3NSRR6ctlkdMrNUeAyufOAu6lfZjcCS0PhnOiWIam/ob+ McsdHCNQR6WWOI9BtGTLmDwhQCaPXWWo4wzhK9fvs3l0ZRFX3iqXcPKc8199lwHRDQMV e7uT3LNgsgjEa8++GEeW2jnLZBtvlHTF7yG3mIj80mYhnZYLMn28xMjm5rYwaQX7OImn /GfA== X-Gm-Message-State: AOJu0Yxv4xsZjGw+iv/I1kYxxjOWn+A5hti8zxC37ocKyQQPv03lezPV 7Zuwu+/W9ukfbPM482rXrZ8BdinPP4blaT0PKJQueXR52X+7IsjqiKwTKLNJ0EsIHvYDsvea/tf +ZZ/OlKDyJdud9qX2I2Jy7iqBf8UvhIqR X-Gm-Gg: ASbGncvVGrUsabTejzVRkUyiWvGJWAXnkMSY/Jg0tdSkzKKE+K+SW287kWJDZEqh25q 8yTz8erSOSW5JqsyL7QDD3mNLlaCSPDw= X-Google-Smtp-Source: AGHT+IEO2bVHjsblDrFHp/CS2j1QVI0WTORqZwCXpCghB5t/BXEJCa09GUI+CYZaGApZT7vTfXocXejbzlkyRfYIfUE= X-Received: by 2002:a05:6602:1645:b0:83b:28e2:4985 with SMTP id ca18e2360f4ac-83eb6048a8cmr446956539f.12.1732117909658; Wed, 20 Nov 2024 07:51:49 -0800 (PST) MIME-Version: 1.0 From: Andrew Jackson Date: Wed, 20 Nov 2024 09:51:12 -0600 Message-ID: Subject: Add Option To Check All Addresses For Matching target_session_attr To: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000b70ecb06275a2048" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b70ecb06275a2048 Content-Type: multipart/alternative; boundary="000000000000b70ecb06275a2046" --000000000000b70ecb06275a2046 Content-Type: text/plain; charset="UTF-8" Hi, I was attempting to set up a high availability system using DNS and target_session_attrs. I was using a DNS setup similar to below and was trying to use the connection strings `psql postgresql:// user@pg.database.com/db_name?target_session=read-write` to have clients dynamically connect to the primary or `psql postgresql:// user@pg.database.com/db_name?target_session=read-only` to have clients connect to a read replica. The problem that I found with this setup is that if libpq is unable to get a matching target_session_attr on the first connection attempt it does not consider any further addresses for the given host. This patch is designed to provide an option that allows libpq to look at additional addresses for a given host if the target_session_attr check fails for previous addresses. Would appreciate any feedback on the applicability/relevancy of the goal here or the implementation. Example DNS setup ________________________________ Name | Type | Record ______________|______|___________ pg.database.com | A | ip_address_1 pg.database.com | A | ip_address_2 pg.database.com | A | ip_address_3 pg.database.com | A | ip_address_4 --000000000000b70ecb06275a2046 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

I was attempting to set up a high a= vailability system using DNS and target_session_attrs. I was using a DNS se= tup similar to below and was trying to use the connection strings `psql pos= tgresql://user@pg.database.com/db_name?target_session=3Dread-write` t= o have clients dynamically connect to the primary or `psql postgresql://us= er@pg.database.com/db_name?target_session=3Dread-only` to have=C2=A0cli= ents connect to a read replica.=C2=A0

The problem = that I found with this setup is that if libpq is unable to get a matching t= arget_session_attr on the first connection attempt it does not consider any= further addresses for the given host. This patch is designed to provide an= option that allows libpq to look at additional addresses=C2=A0for a given = host if the target_session_attr check fails for previous addresses.

Would appreciate any feedback on the applicability/releva= ncy of the goal here or the implementation.
=C2=A0
Exam= ple DNS setup
________________________________
Name=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Type=C2=A0 = =C2=A0 | Record
______________|______|___________
pg.database.com | A=C2=A0 =C2=A0 =C2=A0 = =C2=A0 | ip_address_1
pg.datab= ase.com | A=C2=A0 =C2=A0 =C2=A0 =C2=A0 | ip_address_2
pg.database.com | A=C2=A0 =C2=A0 =C2=A0= =C2=A0 | ip_address_3
pg.= database.com | A=C2=A0 =C2=A0 =C2=A0 =C2=A0 | ip_address_4
--000000000000b70ecb06275a2046-- --000000000000b70ecb06275a2048 Content-Type: text/x-patch; charset="US-ASCII"; name="postgres.patch" Content-Disposition: attachment; filename="postgres.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m3q1mxjg0 ZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYyBiL3NyYy9pbnRl cmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwppbmRleCA1MTA4M2RjZmQ4Li44NjVlYjc0ZmQ3IDEw MDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKKysrIGIvc3JjL2lu dGVyZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jCkBAIC0zNjUsNiArMzY1LDExIEBAIHN0YXRpYyBj b25zdCBpbnRlcm5hbFBRY29ubmluZm9PcHRpb24gUFFjb25uaW5mb09wdGlvbnNbXSA9IHsKIAkJ IkxvYWQtQmFsYW5jZS1Ib3N0cyIsICIiLCA4LAkvKiBzaXplb2YoImRpc2FibGUiKSA9IDggKi8K IAlvZmZzZXRvZihzdHJ1Y3QgcGdfY29ubiwgbG9hZF9iYWxhbmNlX2hvc3RzKX0sCiAKKwl7ImNo ZWNrX2FsbF9hZGRycyIsICJQR0NIRUNLQUxMQUREUlMiLAorCQlEZWZhdWx0TG9hZEJhbGFuY2VI b3N0cywgTlVMTCwKKwkJIkNoZWNrLUFsbC1BZGRycyIsICIiLCAxLAorCW9mZnNldG9mKHN0cnVj dCBwZ19jb25uLCBjaGVja19hbGxfYWRkcnMpfSwKKwogCS8qIFRlcm1pbmF0aW5nIGVudHJ5IC0t LSBNVVNUIEJFIExBU1QgKi8KIAl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAlOVUxMLCBOVUxM LCAwfQpAQCAtNDAzMCwxMSArNDAzNSwxMSBAQCBrZWVwX2dvaW5nOgkJCQkJCS8qIFdlIHdpbGwg Y29tZSBiYWNrIHRvIGhlcmUgdW50aWwgdGhlcmUgaXMKIAkJCQkJCWNvbm4tPnN0YXR1cyA9IENP Tk5FQ1RJT05fT0s7CiAJCQkJCQlzZW5kVGVybWluYXRlQ29ubihjb25uKTsKIAotCQkJCQkJLyoK LQkJCQkJCSAqIFRyeSBuZXh0IGhvc3QgaWYgYW55LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjb25z aWRlcgotCQkJCQkJICogYWRkaXRpb25hbCBhZGRyZXNzZXMgZm9yIHRoaXMgaG9zdC4KLQkJCQkJ CSAqLwotCQkJCQkJY29ubi0+dHJ5X25leHRfaG9zdCA9IHRydWU7CisJCQkJCQlpZiAoY29ubi0+ Y2hlY2tfYWxsX2FkZHJzICYmIGNvbm4tPmNoZWNrX2FsbF9hZGRyc1swXSA9PSAnMScpCisJCQkJ CQkJY29ubi0+dHJ5X25leHRfYWRkciA9IHRydWU7CisJCQkJCQllbHNlCisJCQkJCQkJY29ubi0+ dHJ5X25leHRfaG9zdCA9IHRydWU7CisKIAkJCQkJCWdvdG8ga2VlcF9nb2luZzsKIAkJCQkJfQog CQkJCX0KQEAgLTQwODUsMTEgKzQwOTAsMTEgQEAga2VlcF9nb2luZzoJCQkJCQkvKiBXZSB3aWxs IGNvbWUgYmFjayB0byBoZXJlIHVudGlsIHRoZXJlIGlzCiAJCQkJCQljb25uLT5zdGF0dXMgPSBD T05ORUNUSU9OX09LOwogCQkJCQkJc2VuZFRlcm1pbmF0ZUNvbm4oY29ubik7CiAKLQkJCQkJCS8q Ci0JCQkJCQkgKiBUcnkgbmV4dCBob3N0IGlmIGFueSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY29u c2lkZXIKLQkJCQkJCSAqIGFkZGl0aW9uYWwgYWRkcmVzc2VzIGZvciB0aGlzIGhvc3QuCi0JCQkJ CQkgKi8KLQkJCQkJCWNvbm4tPnRyeV9uZXh0X2hvc3QgPSB0cnVlOworCQkJCQkJaWYgKGNvbm4t PmNoZWNrX2FsbF9hZGRycyAmJiBjb25uLT5jaGVja19hbGxfYWRkcnNbMF0gPT0gJzEnKQorCQkJ CQkJCWNvbm4tPnRyeV9uZXh0X2FkZHIgPSB0cnVlOworCQkJCQkJZWxzZQorCQkJCQkJCWNvbm4t PnRyeV9uZXh0X2hvc3QgPSB0cnVlOworCiAJCQkJCQlnb3RvIGtlZXBfZ29pbmc7CiAJCQkJCX0K IAkJCQl9CkBAIC00NzAzLDYgKzQ3MDgsNyBAQCBmcmVlUEdjb25uKFBHY29ubiAqY29ubikKIAlm cmVlKGNvbm4tPnJvd0J1Zik7CiAJZnJlZShjb25uLT50YXJnZXRfc2Vzc2lvbl9hdHRycyk7CiAJ ZnJlZShjb25uLT5sb2FkX2JhbGFuY2VfaG9zdHMpOworCWZyZWUoY29ubi0+Y2hlY2tfYWxsX2Fk ZHJzKTsKIAl0ZXJtUFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVzc2FnZSk7CiAJdGVybVBRRXhw QnVmZmVyKCZjb25uLT53b3JrQnVmZmVyKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMv bGlicHEvbGlicHEtaW50LmggYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1pbnQuaAppbmRl eCAwOGNjMzkxY2JkLi5jNTFlYzI4MjM0IDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJw cS9saWJwcS1pbnQuaAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1pbnQuaApAQCAt NDI3LDYgKzQyNyw3IEBAIHN0cnVjdCBwZ19jb25uCiAJY2hhcgkgICAqdGFyZ2V0X3Nlc3Npb25f YXR0cnM7CS8qIGRlc2lyZWQgc2Vzc2lvbiBwcm9wZXJ0aWVzICovCiAJY2hhcgkgICAqcmVxdWly ZV9hdXRoOwkvKiBuYW1lIG9mIHRoZSBleHBlY3RlZCBhdXRoIG1ldGhvZCAqLwogCWNoYXIJICAg KmxvYWRfYmFsYW5jZV9ob3N0czsgLyogbG9hZCBiYWxhbmNlIG92ZXIgaG9zdHMgKi8KKwljaGFy ICAgICAgICpjaGVja19hbGxfYWRkcnM7ICAvKiB3aGV0aGVyIHRvIGNoZWNrIGFsbCBpcHMgd2l0 aGluIGEgaG9zdCBvciB0ZXJtaW5hdGUgb24gZmFpbHVyZSAqLwogCiAJYm9vbAkJY2FuY2VsUmVx dWVzdDsJLyogdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEKIAkJCQkJ CQkJICogY2FuY2VsIHJlcXVlc3QsIGluc3RlYWQgb2YgYmVpbmcgYSBub3JtYWwK --000000000000b70ecb06275a2048--