diff --git a/SOURCES/openvswitch-2.13.0.patch b/SOURCES/openvswitch-2.13.0.patch
index 8741dc9..5746669 100644
--- a/SOURCES/openvswitch-2.13.0.patch
+++ b/SOURCES/openvswitch-2.13.0.patch
@@ -81873,6 +81873,19 @@ index 7e48630f0e..4e2874c22e 100644
                  }
              } else if (retval < 0) {
                  VLOG_FATAL("waitpid failed (%s)", ovs_strerror(errno));
+diff --git a/lib/dns-resolve.c b/lib/dns-resolve.c
+index 1ff58960fe..6a6b24d981 100644
+--- a/lib/dns-resolve.c
++++ b/lib/dns-resolve.c
+@@ -253,7 +253,7 @@ resolve_callback__(void *req_, int err, struct ub_result *result)
+     if (err != 0 || (result->qtype == ns_t_aaaa && !result->havedata)) {
+         ub_resolve_free(result);
+         req->state = RESOLVE_ERROR;
+-        VLOG_ERR_RL(&rl, "%s: failed to resolve", req->name);
++        VLOG_WARN_RL(&rl, "%s: failed to resolve", req->name);
+         return;
+     }
+ 
 diff --git a/lib/dp-packet.c b/lib/dp-packet.c
 index cd2623500e..1e3b0ec609 100644
 --- a/lib/dp-packet.c
@@ -86472,6 +86485,132 @@ index eda265dfc5..a635ff7689 100644
  
  #define SHA1_FMT \
          "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" \
+diff --git a/lib/socket-util.c b/lib/socket-util.c
+index 4f1ffecf5d..38705cc51e 100644
+--- a/lib/socket-util.c
++++ b/lib/socket-util.c
+@@ -62,7 +62,8 @@ static bool parse_sockaddr_components(struct sockaddr_storage *ss,
+                                       const char *port_s,
+                                       uint16_t default_port,
+                                       const char *s,
+-                                      bool resolve_host);
++                                      bool resolve_host,
++                                      bool *dns_failure);
+ 
+ /* Sets 'fd' to non-blocking mode.  Returns 0 if successful, otherwise a
+  * positive errno value. */
+@@ -438,7 +439,7 @@ parse_sockaddr_components_dns(struct sockaddr_storage *ss OVS_UNUSED,
+     dns_resolve(host_s, &tmp_host_s);
+     if (tmp_host_s != NULL) {
+         parse_sockaddr_components(ss, tmp_host_s, port_s,
+-                                  default_port, s, false);
++                                  default_port, s, false, NULL);
+         free(tmp_host_s);
+         return true;
+     }
+@@ -450,11 +451,15 @@ parse_sockaddr_components(struct sockaddr_storage *ss,
+                           char *host_s,
+                           const char *port_s, uint16_t default_port,
+                           const char *s,
+-                          bool resolve_host)
++                          bool resolve_host, bool *dns_failure)
+ {
+     struct sockaddr_in *sin = sin_cast(sa_cast(ss));
+     int port;
+ 
++    if (dns_failure) {
++        *dns_failure = false;
++    }
++
+     if (port_s && port_s[0]) {
+         if (!str_to_int(port_s, 10, &port) || port < 0 || port > 65535) {
+             VLOG_ERR("%s: bad port number \"%s\"", s, port_s);
+@@ -501,10 +506,15 @@ parse_sockaddr_components(struct sockaddr_storage *ss,
+     return true;
+ 
+ resolve:
+-    if (resolve_host && parse_sockaddr_components_dns(ss, host_s, port_s,
+-                                                      default_port, s)) {
+-        return true;
+-    } else if (!resolve_host) {
++    if (resolve_host) {
++        if (parse_sockaddr_components_dns(ss, host_s, port_s,
++                                          default_port, s)) {
++            return true;
++        }
++        if (dns_failure) {
++            *dns_failure = true;
++        }
++    } else {
+         VLOG_ERR("%s: bad IP address \"%s\"", s, host_s);
+     }
+ exit:
+@@ -521,10 +531,12 @@ exit:
+  * It resolves the host if 'resolve_host' is true.
+  *
+  * On success, returns true and stores the parsed remote address into '*ss'.
+- * On failure, logs an error, stores zeros into '*ss', and returns false. */
++ * On failure, logs an error, stores zeros into '*ss', and returns false,
++ * '*dns_failure' indicates if the host resolution failed. */
+ bool
+ inet_parse_active(const char *target_, int default_port,
+-                  struct sockaddr_storage *ss, bool resolve_host)
++                  struct sockaddr_storage *ss,
++                  bool resolve_host, bool *dns_failure)
+ {
+     char *target = xstrdup(target_);
+     char *port, *host;
+@@ -539,7 +551,7 @@ inet_parse_active(const char *target_, int default_port,
+         ok = false;
+     } else {
+         ok = parse_sockaddr_components(ss, host, port, default_port,
+-                                       target_, resolve_host);
++                                       target_, resolve_host, dns_failure);
+     }
+     if (!ok) {
+         memset(ss, 0, sizeof *ss);
+@@ -576,7 +588,7 @@ inet_open_active(int style, const char *target, int default_port,
+     int error;
+ 
+     /* Parse. */
+-    if (!inet_parse_active(target, default_port, &ss, true)) {
++    if (!inet_parse_active(target, default_port, &ss, true, NULL)) {
+         error = EAFNOSUPPORT;
+         goto exit;
+     }
+@@ -660,7 +672,7 @@ inet_parse_passive(const char *target_, int default_port,
+         ok = false;
+     } else {
+         ok = parse_sockaddr_components(ss, host, port, default_port,
+-                                       target_, true);
++                                       target_, true, NULL);
+     }
+     if (!ok) {
+         memset(ss, 0, sizeof *ss);
+@@ -783,7 +795,8 @@ inet_parse_address(const char *target_, struct sockaddr_storage *ss)
+ {
+     char *target = xstrdup(target_);
+     char *host = unbracket(target);
+-    bool ok = parse_sockaddr_components(ss, host, NULL, 0, target_, false);
++    bool ok = parse_sockaddr_components(ss, host, NULL, 0,
++                                        target_, false, NULL);
+     if (!ok) {
+         memset(ss, 0, sizeof *ss);
+     }
+diff --git a/lib/socket-util.h b/lib/socket-util.h
+index 9ccb7d4cc4..bf66393df9 100644
+--- a/lib/socket-util.h
++++ b/lib/socket-util.h
+@@ -49,7 +49,8 @@ ovs_be32 guess_netmask(ovs_be32 ip);
+ void inet_parse_host_port_tokens(char *s, char **hostp, char **portp);
+ void inet_parse_port_host_tokens(char *s, char **portp, char **hostp);
+ bool inet_parse_active(const char *target, int default_port,
+-                       struct sockaddr_storage *ssp, bool resolve_host);
++                       struct sockaddr_storage *ssp,
++                       bool resolve_host, bool *dns_failure);
+ int inet_open_active(int style, const char *target, int default_port,
+                      struct sockaddr_storage *ssp, int *fdp, uint8_t dscp);
+ 
 diff --git a/lib/stopwatch.c b/lib/stopwatch.c
 index f5602163bc..1c71df1a12 100644
 --- a/lib/stopwatch.c
@@ -86547,6 +86686,19 @@ index 809b405a52..a869b5f390 100644
          p->error_count++;
          goto out;
      }
+diff --git a/lib/stream.c b/lib/stream.c
+index e246b37735..99559fde91 100644
+--- a/lib/stream.c
++++ b/lib/stream.c
+@@ -763,7 +763,7 @@ stream_parse_target_with_default_port(const char *target, int default_port,
+                                       struct sockaddr_storage *ss)
+ {
+     return ((!strncmp(target, "tcp:", 4) || !strncmp(target, "ssl:", 4))
+-            && inet_parse_active(target + 4, default_port, ss, true));
++            && inet_parse_active(target + 4, default_port, ss, true, NULL));
+ }
+ 
+ /* Attempts to guess the content type of a stream whose first few bytes were
 diff --git a/lib/tc.c b/lib/tc.c
 index 12af0192b6..de3fc50dbb 100644
 --- a/lib/tc.c
@@ -87578,10 +87730,20 @@ index 147ef9c333..97699cb905 100644
      memcpy(flow->regs, md->regs, sizeof flow->regs);
      flow->in_port.ofp_port = md->in_port;
 diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
-index f9ea47a2f1..6324e74d52 100644
+index f9ea47a2f1..2f0d3795b5 100644
 --- a/ofproto/ofproto-dpif-sflow.c
 +++ b/ofproto/ofproto-dpif-sflow.c
-@@ -1291,10 +1291,10 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet,
+@@ -468,7 +468,8 @@ sflow_choose_agent_address(const char *agent_device,
+     const char *target;
+     SSET_FOR_EACH (target, targets) {
+         struct sockaddr_storage ss;
+-        if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &ss, true)) {
++        if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT,
++                              &ss, true, NULL)) {
+             /* sFlow only supports target in default routing table with
+              * packet mark zero.
+              */
+@@ -1291,10 +1292,10 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet,
      ovs_be16 vlan_tci;
  
      ovs_mutex_lock(&mutex);
@@ -88870,10 +89032,18 @@ index 338f3bc299..b8bd1c2d57 100644
  .so lib/vlog-unixctl.man
  .so lib/memory-unixctl.man
 diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
-index b6957d7300..2bc0a69066 100644
+index b6957d7300..ef558efb38 100644
 --- a/ovsdb/ovsdb-server.c
 +++ b/ovsdb/ovsdb-server.c
-@@ -76,8 +76,12 @@ static char *ssl_protocols;
+@@ -26,6 +26,7 @@
+ #include "command-line.h"
+ #include "daemon.h"
+ #include "dirs.h"
++#include "dns-resolve.h"
+ #include "openvswitch/dynamic-string.h"
+ #include "fatal-signal.h"
+ #include "file.h"
+@@ -76,8 +77,12 @@ static char *ssl_protocols;
  static char *ssl_ciphers;
  static bool bootstrap_ca_cert;
  
@@ -88886,7 +89056,7 @@ index b6957d7300..2bc0a69066 100644
  static unixctl_cb_func ovsdb_server_reconnect;
  static unixctl_cb_func ovsdb_server_perf_counters_clear;
  static unixctl_cb_func ovsdb_server_perf_counters_show;
-@@ -242,7 +246,7 @@ main_loop(struct server_config *config,
+@@ -242,7 +247,7 @@ main_loop(struct server_config *config,
                            xasprintf("removing database %s because storage "
                                      "disconnected permanently", node->name));
              } else if (ovsdb_storage_should_snapshot(db->db->storage)) {
@@ -88895,7 +89065,15 @@ index b6957d7300..2bc0a69066 100644
              }
          }
          if (run_process) {
-@@ -409,6 +413,9 @@ main(int argc, char *argv[])
+@@ -314,6 +319,7 @@ main(int argc, char *argv[])
+     service_start(&argc, &argv);
+     fatal_ignore_sigpipe();
+     process_init();
++    dns_resolve_init(true);
+ 
+     bool active = false;
+     parse_options(argc, argv, &db_filenames, &remotes, &unixctl_path,
+@@ -409,6 +415,9 @@ main(int argc, char *argv[])
      unixctl_command_register("exit", "", 0, 0, ovsdb_server_exit, &exiting);
      unixctl_command_register("ovsdb-server/compact", "", 0, 1,
                               ovsdb_server_compact, &all_dbs);
@@ -88905,7 +89083,15 @@ index b6957d7300..2bc0a69066 100644
      unixctl_command_register("ovsdb-server/reconnect", "", 0, 0,
                               ovsdb_server_reconnect, jsonrpc);
  
-@@ -540,7 +547,7 @@ close_db(struct server_config *config, struct db *db, char *comment)
+@@ -490,6 +499,7 @@ main(int argc, char *argv[])
+                       run_command, process_status_msg(status));
+         }
+     }
++    dns_resolve_destroy();
+     perf_counters_destroy();
+     service_stop();
+     return 0;
+@@ -540,7 +550,7 @@ close_db(struct server_config *config, struct db *db, char *comment)
  
  static struct ovsdb_error * OVS_WARN_UNUSED_RESULT
  parse_txn(struct server_config *config, struct db *db,
@@ -88914,7 +89100,7 @@ index b6957d7300..2bc0a69066 100644
            const struct uuid *txnid)
  {
      if (schema) {
-@@ -548,7 +555,9 @@ parse_txn(struct server_config *config, struct db *db,
+@@ -548,7 +558,9 @@ parse_txn(struct server_config *config, struct db *db,
           * (first grabbing its storage), then replace it with the new schema.
           * The transaction must also include the replacement data.
           *
@@ -88925,7 +89111,7 @@ index b6957d7300..2bc0a69066 100644
          ovs_assert(txn_json);
          ovs_assert(ovsdb_storage_is_clustered(db->db->storage));
  
-@@ -558,13 +567,17 @@ parse_txn(struct server_config *config, struct db *db,
+@@ -558,13 +570,17 @@ parse_txn(struct server_config *config, struct db *db,
              return error;
          }
  
@@ -88949,7 +89135,7 @@ index b6957d7300..2bc0a69066 100644
  
          /* Force update to schema in _Server database. */
          db->row_uuid = UUID_ZERO;
-@@ -613,6 +626,7 @@ read_db(struct server_config *config, struct db *db)
+@@ -613,6 +629,7 @@ read_db(struct server_config *config, struct db *db)
          } else {
              error = parse_txn(config, db, schema, txn_json, &txnid);
              json_destroy(txn_json);
@@ -88957,7 +89143,7 @@ index b6957d7300..2bc0a69066 100644
              if (error) {
                  break;
              }
-@@ -637,8 +651,6 @@ add_db(struct server_config *config, struct db *db)
+@@ -637,8 +654,6 @@ add_db(struct server_config *config, struct db *db)
  static struct ovsdb_error * OVS_WARN_UNUSED_RESULT
  open_db(struct server_config *config, const char *filename)
  {
@@ -88966,7 +89152,7 @@ index b6957d7300..2bc0a69066 100644
      /* If we know that the file is already open, return a good error message.
       * Otherwise, if the file is open, we'll fail later on with a harder to
       * interpret file locking error. */
-@@ -653,9 +665,6 @@ open_db(struct server_config *config, const char *filename)
+@@ -653,9 +668,6 @@ open_db(struct server_config *config, const char *filename)
          return error;
      }
  
@@ -88976,7 +89162,7 @@ index b6957d7300..2bc0a69066 100644
      struct ovsdb_schema *schema;
      if (ovsdb_storage_is_clustered(storage)) {
          schema = NULL;
-@@ -668,6 +677,9 @@ open_db(struct server_config *config, const char *filename)
+@@ -668,6 +680,9 @@ open_db(struct server_config *config, const char *filename)
          }
          ovs_assert(schema && !txn_json);
      }
@@ -88986,7 +89172,7 @@ index b6957d7300..2bc0a69066 100644
      db->db = ovsdb_create(schema, storage);
      ovsdb_jsonrpc_server_add_db(config->jsonrpc, db->db);
  
-@@ -1481,7 +1493,8 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
+@@ -1481,7 +1496,8 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
                  VLOG_INFO("compacting %s database by user request",
                            node->name);
  
@@ -88996,7 +89182,7 @@ index b6957d7300..2bc0a69066 100644
                  if (error) {
                      char *s = ovsdb_error_to_string(error);
                      ds_put_format(&reply, "%s\n", s);
-@@ -1504,6 +1517,35 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
+@@ -1504,6 +1520,35 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc,
      ds_destroy(&reply);
  }
  
@@ -89142,6 +89328,22 @@ index 32e5333163..72e127c847 100644
  
  void ovsdb_replace(struct ovsdb *dst, struct ovsdb *src);
  
+diff --git a/ovsdb/raft-private.c b/ovsdb/raft-private.c
+index 26d39a087f..7b7bcd74ac 100644
+--- a/ovsdb/raft-private.c
++++ b/ovsdb/raft-private.c
+@@ -33,7 +33,10 @@ raft_address_validate(const char *address)
+         return NULL;
+     } else if (!strncmp(address, "ssl:", 4) || !strncmp(address, "tcp:", 4)) {
+         struct sockaddr_storage ss;
+-        if (!inet_parse_active(address + 4, -1, &ss, true)) {
++        bool dns_failure = false;
++
++        if (!inet_parse_active(address + 4, -1, &ss, true, &dns_failure)
++            && !dns_failure) {
+             return ovsdb_error(NULL, "%s: syntax error in address", address);
+         }
+         return NULL;
 diff --git a/ovsdb/raft-private.h b/ovsdb/raft-private.h
 index ac8656d42f..76b097b891 100644
 --- a/ovsdb/raft-private.h
diff --git a/SPECS/openvswitch2.13.spec b/SPECS/openvswitch2.13.spec
index 2c32f1f..121e9b8 100644
--- a/SPECS/openvswitch2.13.spec
+++ b/SPECS/openvswitch2.13.spec
@@ -59,7 +59,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.13.0
-Release: 169%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist}
+Release: 170%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -715,6 +715,12 @@ exit 0
 %endif
 
 %changelog
+* Wed Mar 30 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.13.0-170
+- Merging upstream branch-2.13 [RH git: 7ec8e5d0e5]
+    Commit list:
+    3ceb5dbe92 ovsdb: raft: Fix inability to read the database with DNS host names. (#2055097)
+
+
 * Fri Mar 25 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.13.0-169
 - Merging upstream branch-2.13 [RH git: 81f1610a56]
     Commit list: