Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add email retry to all email events #37408

Merged
merged 30 commits into from
Jan 12, 2024
Merged

Add email retry to all email events #37408

merged 30 commits into from
Jan 12, 2024

Conversation

qwef
Copy link
Contributor

@qwef qwef commented Jan 8, 2024

Closes #23030

Description

  • Fixed retrying framework to support multiple retrying states
  • Made it easier to support new functions into the retrying framework
  • Added global email retrying

@qwef qwef requested a review from camsaul as a code owner January 8, 2024 19:35
@metabase-bot metabase-bot bot added the .Team/AdminWebapp Admin and Webapp team label Jan 8, 2024
@qwef qwef marked this pull request as draft January 8, 2024 19:35
@qwef qwef marked this pull request as ready for review January 8, 2024 20:42
@qwef qwef added the backport Automatically create PR on current release branch on merge label Jan 8, 2024
@qwef qwef changed the title Add email retry to password reset Add email retry to all email events Jan 9, 2024
:multiplier (email-retry-multiplier)
:randomization-factor (email-retry-randomization-factor)
:max-interval-millis (email-retry-max-interval-millis)}
(or config/is-dev? config/is-test?) (assoc :max-attempts 1)))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we set max attempts to 1 in dev?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume for testing purposes, I used it a bit to test the retry logic but can remove it.

[& args]
(try
(when-not @retry-state
(compare-and-set! retry-state nil (make-retry-state)))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this feels weird to me. We could likely send emails from lots of threads. Having a single global shared retry state feels quite strange.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah right that was also an issue with the old pulse retry logic code, I'll take a look into creating different retry states for different events

@qwef qwef requested a review from a team January 10, 2024 06:47
Copy link
Member

@noahmoss noahmoss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aside from nits, my main concern is about scrapping the mechanism that stores a single Retry object which is reused for each email send. I don't know if it would cause issues, but it's an easy optimization to not be recreating a Retry each time if the settings haven't changed.

Let me know if there's a reason for getting rid of that that I'm not aware of.

Edit: Thought about it again, I guess this is fine. (See comment below)

src/metabase/email.clj Outdated Show resolved Hide resolved
Comment on lines 182 to +186
(email/send-message!
:subject (trs "[{0}] Password Reset Request" (app-name-trs))
:recipients [email]
:message-type :html
:message message-body)))
{:subject (trs "[{0}] Password Reset Request" (app-name-trs))
:recipients [email]
:message-type :html
:message message-body})))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did this need to change to take the email settings as a map instead of as keyword args?

I see other calls of send-message! are still using keyword args. So I'm wondering if those need to be changed too. Plus the docstring for send-message!.

Or, otherwise, why not keep using the keyword args for this call site?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think both work actually since [& {:as msg-args}] will make it into a map.

:multiplier (retry-multiplier)
:randomization-factor (retry-randomization-factor)
:max-interval-millis (retry-max-interval-millis)}
(or config/is-dev? config/is-test?) (assoc :max-attempts 1)))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary? I wonder if tests should just override max-attempts if they explicitly don't want the retry.

It's probably not a big deal, but I think we should be very intentional about anything that changes behavior between dev and prod in case it makes issues trickier to reproduce.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea makes sense, will remove.

src/metabase/util/retry.clj Outdated Show resolved Hide resolved
:type :integer
:default 30000)

(defn- retry-configuration []
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a little weird that we have defaults defined for all these settings, but random-exponential-backoff-retry also has defaults that are used if options aren't passed in, and they have different values. I'm assuming that second set of defaults is never being used, so can we remove those and require the config to be passed in for all values?

Copy link
Contributor Author

@qwef qwef Jan 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea sounds good, my bad I didn't look too closely into the random-exponential-backoff-retry code

src/metabase/pulse.clj Show resolved Hide resolved
Comment on lines 134 to 137
retry/decorate (fn [f]
(fn [& args]
(let [callable (reify Callable (call [_] (apply f args)))]
(.call (Retry/decorateCallable test-retry callable)))))]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you pull this out as a test-retry-decorate-fn or something, similar to fake-inbox-email-fn? It's a bit verbose to repeat it in the setup for every test.

@noahmoss
Copy link
Member

Oh, just saw the comment from Dan above. Just looked at the docs for resilience4j as well.

I guess you're right that we need a separate Retry instance for each email send, but maybe the config could be shared if it's not changing? I won't block the PR on that though.

Other feedback still applies though—mostly nits.

(defn send-email-retrying!
"Like [[send-message-or-throw!]] but retries sending on errors according to the retry settings."
[& args]
(apply (retry/decorate send-message-or-throw!) args))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think, since send-message-or-throw! takes one arg, it's necessary to use [& args and apply here.

Also it seems like it's hiding the schema from dev-users (I guess just 1 layer of indirection), but if send-message-or-throw! is only called through send-email-retrtying! now, then I think it should be a mu/defn taking EmailMessage, and send-message-or-throw! can be a plain defn. The principle here is to use mu/defn on "api boundaries".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah good to know

Comment on lines +183 to +186
{:subject (trs "[{0}] Password Reset Request" (app-name-trs))
:recipients [email]
:message-type :html
:message message-body})))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, the style you changed it to is better. (data good, seqential key args bad)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, will change the comment and rest of the functions to match this

test/metabase/pulse_test.clj Outdated Show resolved Hide resolved
@qwef
Copy link
Contributor Author

qwef commented Jan 11, 2024

Oh, just saw the comment from Dan above. Just looked at the docs for resilience4j as well.

I guess you're right that we need a separate Retry instance for each email send, but maybe the config could be shared if it's not changing? I won't block the PR on that though.

Other feedback still applies though—mostly nits.

Not a big fan of creating a shared state for just the config, I don't think the performance gain would be worth it to keep the config always in memory.

Copy link

replay-io bot commented Jan 12, 2024

StatusComplete ↗︎
Commitd55c7dc
Results
1 Failed
  • should order columns correctly in saved native query exports when the query was modified but not re-run before save (#19889)
      AssertionError: Timed out retrying after 4000ms: Unable to find an element with the text: Started from. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
      Ignored nodes: comments, <script />, <style />
      <html
        lang="en"
        translate="no"
      >
        <head>
          <meta
            charset="utf-8"
          />
          <meta
            content="IE=edge"
            http-equiv="X-UA-Compatible"
          />
          <meta
            content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
            name="viewport"
          />
          <meta
            content="noindex"
            name="robots"
          />
          <meta
            content="yes"
            name="apple-mobile-web-app-capable"
          />
          <meta
            content="black-translucent"
            name="apple-mobile-web-app-status-bar-style"
          />
          <link
            href="app/assets/img/apple-touch-icon.png"
            rel="apple-touch-icon"
            sizes="180x180"
          />
          <link
            href="app/assets/img/favicon.ico"
            rel="icon"
          />
          <link
            crossorigin="use-credentials"
            href="app/assets/img/site.webmanifest"
            rel="manifest"
          />
          <meta
            content="#2d89ef"
            name="msapplication-TileColor"
          />
          <meta
            content="app/assets/img/browserconfig.xml"
            name="msapplication-config"
          />
          <meta
            content="#ffffff"
            name="theme-color"
          />
          <meta
            content="default"
            name="apple-mobile-web-app-status-bar-style"
          />
          <meta
            content="/"
            name="base-href"
          />
          <meta
            content="/question/80"
            name="uri"
          />
          <title>
            19889 · Metabase
          </title>
          <base
            href="/"
          />
          <link
            href="app/dist/styles.3ddf973fc967572ec34c.css"
            rel="stylesheet"
          />
          <link
            href="app/dist/app-main.8c3db53cb80ee9443da7.css"
            rel="stylesheet"
          />
        </head>
        <body>
          <div
            id="root"
          >
            <div
              class="spread emotion-1fttcpj enx0u2k2"
            >
              <header
                aria-label="Navigation bar"
                class="emotion-15xkiw5 es0756t0"
                data-testid="app-bar"
              >
                <div
                  class="emotion-1pt930v e4w71dr4"
                >
                  <div
                    class="emotion-cxb03 e4w71dr3"
                  >
                    <div
                      class="emotion-bjn8wh ehgm33i2"
                    >
                      <a
                        class="ehgm33i1 emotion-m53806 emeibx70"
                        data-metabase-event="Navbar;Logo"
                        href="/"
                      >
                        <svg
                          class="Icon text-brand"
                          data-testid="main-logo"
                          fill="currentcolor"
                          height="32"
                          viewBox="0 0 66 85"
                        >
                          <path
                            d="M46.8253288,70.4935014 C49.5764899,70.4935014 51.8067467,68.1774705 51.8067467,65.3205017 C51.8067467,62.4635329 49.5764899,60.147502 46.8253288,60.147502 C44.0741676,60.147502 41.8439108,62.4635329 41.8439108,65.3205017 C41.8439108,68.1774705 44.0741676,70.4935014 46.8253288,70.4935014 Z M32.8773585,84.9779005 C35.6285197,84.9779005 37.8587764,82.6618697 37.8587764,79.8049008 C37.8587764,76.947932 35.6285197,74.6319011 32.8773585,74.6319011 C30.1261973,74.6319011 27.8959405,76.947932 27.8959405,79.8049008 C27.8959405,82.6618697 30.1261973,84.9779005 32.8773585,84.9779005 Z M32.8773585,70.4935014 C35.6285197,70.4935014 37.8587764,68.1774705 37.8587764,65.3205017 C37.8587764,62.4635329 35.6285197,60.147502 32.8773585,60.147502 C30.1261973,60.147502 27.8959405,62.4635329 27.8959405,65.3205017 C27.8959405,68.1774705 30.1261973,70.4935014 32.8773585,70.4935014 Z M18.9293882,70.4935014 C21.6805494,70.4935014 23.9108062,68.1774705 23.9108062,65.3205017 C23.9108062,62.4635329 21.6805494,60.147502 18.9293882,60.147502 C16.1782271,60.147502 13.9479703,62.4635329 13.9479703,65.3205017 C13.9479703,68.1774705 16.1782271,70.4935014 18.9293882,70.4935014 Z M46.8253288,56.0091023 C49.5764899,56.0091023 51.8067467,53.6930714 51.8067467,50.8361026 C51.8067467,47.9791337 49.5764899,45.6631029 46.8253288,45.6631029 C44.0741676,45.6631029 41.8439108,47.9791337 41.8439108,50.8361026 C41.8439108,53.6930714 44.0741676,56.0091023 46.8253288,56.0091023 Z M18.9293882,56.0091023 C21.6805494,56.0091023 23.9108062,53.6930714 23.9108062,50.8361026 C23.9108062,47.9791337 21.6805494,45.6631029 18.9293882,45.6631029 C16.1782271,45.6631029 13.9479703,47.9791337 13.9479703,50.8361026 C13.9479703,53.6930714 16.1782271,56.0091023 18.9293882,56.0091023 Z M46.8253288,26.8995984 C49.5764899,26.8995984 51.8067467,24.5835675 51.8067467,21.7265987 C51.8067467,18.8696299 49.5764899,16.553599 46.8253288,16.553599 C44.0741676,16.553599 41.8439108,18.8696299 41.8439108,21.7265987 C41.8439108,24.5835675 44.0741676,26.8995984 46.8253288,26.8995984 Z M32.8773585,41.5247031 C35.6285197,41.5247031 37.8587764,39.2086723 37.8587764,36.3517034 C37.8587764,33.4947346 35.6285197,31.1787037 32.8773585,31.1787037 C30.1261973,31.1787037 27.8959405,33.4947346 27.8959405,36.3517034 C27.8959405,39.2086723 30.1261973,41.5247031 32.8773585,41.5247031 Z M32.8773585,10.3459994 C35.6285197,10.3459994 37.8587764,8.02996853 37.8587764,5.17299969 C37.8587764,2.31603085 35.6285197,0 32.8773585,0 C30.1261973,0 27.8959405,2.31603085 27.8959405,5.17299969 C27.8959405,8.02996853 30.1261973,10.3459994 32.8773585,10.3459994 Z M32.8773585,26.8995984 C35.6285197,26.8995984 37.8587764,24.5835675 37.8587764,21.7265987 C37.8587764,18.8696299 35.6285197,16.553599 32.8773585,16.553599 C30.1261973,16.553599 27.8959405,18.8696299 27.8959405,21.7265987 C27.8959405,24.5835675 30.1261973,26.8995984 32.8773585,26.8995984 Z M18.9293882,26.8995984 C21.6805494,26.8995984 23.9108062,24.5835675 23.9108062,21.7265987 C23.9108062,18.8696299 21.6805494,16.553599 18.9293882,16.553599 C16.1782271,16.553599 13.9479703,18.8696299 13.9479703,21.7265987 C13.9479703,24.5835675 16.1782271,26.8995984 18.9293882,26.8995984 Z"
                            opacity="0.2"
                          />
                          <path
                            d="M60.773299,70.4935014 C63.5244602,70.4935014 65.754717,68.1774705 65.754717,65.3205017 C65.754717,62.4635329 63.5244602,60.147502 60.773299,60.147502 C58.0221379,60.147502 55.7918811,62.4635329 55.7918811,65.3205017 C55.7918811,68.1774705 58.0221379,70.4935014 60.773299,70.4935014 Z M4.98141795,70.3527958 C7.73257912,70.3527958 9.96283591,68.0367649 9.96283591,65.1797961 C9.96283591,62.3228273 7.73257912,60.0067964 4.98141795,60.0067964 C2.23025679,60.0067964 0,62.3228273 0,65.1797961 C0,68.0367649 2.23025679,70.3527958 4.98141795,70.3527958 Z M60.773299,56.0091023 C63.5244602,56.0091023 65.754717,53.6930714 65.754717,50.8361026 C65.754717,47.9791337 63.5244602,45.6631029 60.773299,45.6631029 C58.0221379,45.6631029 55.7918811,47.9791337 55.7918811,50.8361026 C55.7918811,53.6930714 58.0221379,56.0091023 60.773299,56.0091023 Z M32.8773585,56.0091023 C35.6285197,56.0091023 37.8587764,53.6930714 37.8587764,50.8361026 C37.8587764,47.9791337 35.6285197,45.6631029 32.8773585,45.6631029 C30.1261973,45.6631029 27.8959405,47.9791337 27.8959405,50.8361026 C27.8959405,53.6930714 30.1261973,56.0091023 32.8773585,56.0091023 Z M4.98141795,55.8683967 C7.73257912,55.8683967 9.96283591,5...
      Because this error occurred during a `before each` hook we are skipping the remaining tests in the current suite: `issue 19889`
          at Context.eval (http://localhost:4000/__cypress/tests?p=e2e/test/scenarios/sharing/downloads/reproductions/19889-native-query-export-column-order.cy.spec.js:42948:10)
      AssertionError: Timed out retrying after 4000ms: Unable to find an element with the text: Started from. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
      Ignored nodes: comments, <script />, <style />
      <html
        lang="en"
        translate="no"
      >
        <head>
          <meta
            charset="utf-8"
          />
          <meta
            content="IE=edge"
            http-equiv="X-UA-Compatible"
          />
          <meta
            content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
            name="viewport"
          />
          <meta
            content="noindex"
            name="robots"
          />
          <meta
            content="yes"
            name="apple-mobile-web-app-capable"
          />
          <meta
            content="black-translucent"
            name="apple-mobile-web-app-status-bar-style"
          />
          <link
            href="app/assets/img/apple-touch-icon.png"
            rel="apple-touch-icon"
            sizes="180x180"
          />
          <link
            href="app/assets/img/favicon.ico"
            rel="icon"
          />
          <link
            crossorigin="use-credentials"
            href="app/assets/img/site.webmanifest"
            rel="manifest"
          />
          <meta
            content="#2d89ef"
            name="msapplication-TileColor"
          />
          <meta
            content="app/assets/img/browserconfig.xml"
            name="msapplication-config"
          />
          <meta
            content="#ffffff"
            name="theme-color"
          />
          <meta
            content="default"
            name="apple-mobile-web-app-status-bar-style"
          />
          <meta
            content="/"
            name="base-href"
          />
          <meta
            content="/question/80"
            name="uri"
          />
          <title>
            19889 · Metabase
          </title>
          <base
            href="/"
          />
          <link
            href="app/dist/styles.3ddf973fc967572ec34c.css"
            rel="stylesheet"
          />
          <link
            href="app/dist/app-main.8c3db53cb80ee9443da7.css"
            rel="stylesheet"
          />
        </head>
        <body>
          <div
            id="root"
          >
            <div
              class="spread emotion-1fttcpj enx0u2k2"
            >
              <header
                aria-label="Navigation bar"
                class="emotion-15xkiw5 es0756t0"
                data-testid="app-bar"
              >
                <div
                  class="emotion-1pt930v e4w71dr4"
                >
                  <div
                    class="emotion-cxb03 e4w71dr3"
                  >
                    <div
                      class="emotion-bjn8wh ehgm33i2"
                    >
                      <a
                        class="ehgm33i1 emotion-m53806 emeibx70"
                        data-metabase-event="Navbar;Logo"
                        href="/"
                      >
                        <svg
                          class="Icon text-brand"
                          data-testid="main-logo"
                          fill="currentcolor"
                          height="32"
                          viewBox="0 0 66 85"
                        >
                          <path
                            d="M46.8253288,70.4935014 C49.5764899,70.4935014 51.8067467,68.1774705 51.8067467,65.3205017 C51.8067467,62.4635329 49.5764899,60.147502 46.8253288,60.147502 C44.0741676,60.147502 41.8439108,62.4635329 41.8439108,65.3205017 C41.8439108,68.1774705 44.0741676,70.4935014 46.8253288,70.4935014 Z M32.8773585,84.9779005 C35.6285197,84.9779005 37.8587764,82.6618697 37.8587764,79.8049008 C37.8587764,76.947932 35.6285197,74.6319011 32.8773585,74.6319011 C30.1261973,74.6319011 27.8959405,76.947932 27.8959405,79.8049008 C27.8959405,82.6618697 30.1261973,84.9779005 32.8773585,84.9779005 Z M32.8773585,70.4935014 C35.6285197,70.4935014 37.8587764,68.1774705 37.8587764,65.3205017 C37.8587764,62.4635329 35.6285197,60.147502 32.8773585,60.147502 C30.1261973,60.147502 27.8959405,62.4635329 27.8959405,65.3205017 C27.8959405,68.1774705 30.1261973,70.4935014 32.8773585,70.4935014 Z M18.9293882,70.4935014 C21.6805494,70.4935014 23.9108062,68.1774705 23.9108062,65.3205017 C23.9108062,62.4635329 21.6805494,60.147502 18.9293882,60.147502 C16.1782271,60.147502 13.9479703,62.4635329 13.9479703,65.3205017 C13.9479703,68.1774705 16.1782271,70.4935014 18.9293882,70.4935014 Z M46.8253288,56.0091023 C49.5764899,56.0091023 51.8067467,53.6930714 51.8067467,50.8361026 C51.8067467,47.9791337 49.5764899,45.6631029 46.8253288,45.6631029 C44.0741676,45.6631029 41.8439108,47.9791337 41.8439108,50.8361026 C41.8439108,53.6930714 44.0741676,56.0091023 46.8253288,56.0091023 Z M18.9293882,56.0091023 C21.6805494,56.0091023 23.9108062,53.6930714 23.9108062,50.8361026 C23.9108062,47.9791337 21.6805494,45.6631029 18.9293882,45.6631029 C16.1782271,45.6631029 13.9479703,47.9791337 13.9479703,50.8361026 C13.9479703,53.6930714 16.1782271,56.0091023 18.9293882,56.0091023 Z M46.8253288,26.8995984 C49.5764899,26.8995984 51.8067467,24.5835675 51.8067467,21.7265987 C51.8067467,18.8696299 49.5764899,16.553599 46.8253288,16.553599 C44.0741676,16.553599 41.8439108,18.8696299 41.8439108,21.7265987 C41.8439108,24.5835675 44.0741676,26.8995984 46.8253288,26.8995984 Z M32.8773585,41.5247031 C35.6285197,41.5247031 37.8587764,39.2086723 37.8587764,36.3517034 C37.8587764,33.4947346 35.6285197,31.1787037 32.8773585,31.1787037 C30.1261973,31.1787037 27.8959405,33.4947346 27.8959405,36.3517034 C27.8959405,39.2086723 30.1261973,41.5247031 32.8773585,41.5247031 Z M32.8773585,10.3459994 C35.6285197,10.3459994 37.8587764,8.02996853 37.8587764,5.17299969 C37.8587764,2.31603085 35.6285197,0 32.8773585,0 C30.1261973,0 27.8959405,2.31603085 27.8959405,5.17299969 C27.8959405,8.02996853 30.1261973,10.3459994 32.8773585,10.3459994 Z M32.8773585,26.8995984 C35.6285197,26.8995984 37.8587764,24.5835675 37.8587764,21.7265987 C37.8587764,18.8696299 35.6285197,16.553599 32.8773585,16.553599 C30.1261973,16.553599 27.8959405,18.8696299 27.8959405,21.7265987 C27.8959405,24.5835675 30.1261973,26.8995984 32.8773585,26.8995984 Z M18.9293882,26.8995984 C21.6805494,26.8995984 23.9108062,24.5835675 23.9108062,21.7265987 C23.9108062,18.8696299 21.6805494,16.553599 18.9293882,16.553599 C16.1782271,16.553599 13.9479703,18.8696299 13.9479703,21.7265987 C13.9479703,24.5835675 16.1782271,26.8995984 18.9293882,26.8995984 Z"
                            opacity="0.2"
                          />
                          <path
                            d="M60.773299,70.4935014 C63.5244602,70.4935014 65.754717,68.1774705 65.754717,65.3205017 C65.754717,62.4635329 63.5244602,60.147502 60.773299,60.147502 C58.0221379,60.147502 55.7918811,62.4635329 55.7918811,65.3205017 C55.7918811,68.1774705 58.0221379,70.4935014 60.773299,70.4935014 Z M4.98141795,70.3527958 C7.73257912,70.3527958 9.96283591,68.0367649 9.96283591,65.1797961 C9.96283591,62.3228273 7.73257912,60.0067964 4.98141795,60.0067964 C2.23025679,60.0067964 0,62.3228273 0,65.1797961 C0,68.0367649 2.23025679,70.3527958 4.98141795,70.3527958 Z M60.773299,56.0091023 C63.5244602,56.0091023 65.754717,53.6930714 65.754717,50.8361026 C65.754717,47.9791337 63.5244602,45.6631029 60.773299,45.6631029 C58.0221379,45.6631029 55.7918811,47.9791337 55.7918811,50.8361026 C55.7918811,53.6930714 58.0221379,56.0091023 60.773299,56.0091023 Z M32.8773585,56.0091023 C35.6285197,56.0091023 37.8587764,53.6930714 37.8587764,50.8361026 C37.8587764,47.9791337 35.6285197,45.6631029 32.8773585,45.6631029 C30.1261973,45.6631029 27.8959405,47.9791337 27.8959405,50.8361026 C27.8959405,53.6930714 30.1261973,56.0091023 32.8773585,56.0091023 Z M4.98141795,55.8683967 C7.73257912,55.8683967 9.96283591,5...
      Because this error occurred during a `before each` hook we are skipping the remaining tests in the current suite: `issue 19889`
          at Context.eval (http://localhost:4000/__cypress/tests?p=e2e/test/scenarios/sharing/downloads/reproductions/19889-native-query-export-column-order.cy.spec.js:42948:10)
⚠️ 1 Flaky
  • should order columns correctly in saved native query exports
      Timed out retrying after 4000ms: Unable to find an element with the text: Started from. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
      Ignored nodes: comments, <script />, <style />
      <html
        lang="en"
        translate="no"
      >
        <head>
          <meta
            charset="utf-8"
          />
          <meta
            content="IE=edge"
            http-equiv="X-UA-Compatible"
          />
          <meta
            content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
            name="viewport"
          />
          <meta
            content="noindex"
            name="robots"
          />
          <meta
            content="yes"
            name="apple-mobile-web-app-capable"
          />
          <meta
            content="black-translucent"
            name="apple-mobile-web-app-status-bar-style"
          />
          <link
            href="app/assets/img/apple-touch-icon.png"
            rel="apple-touch-icon"
            sizes="180x180"
          />
          <link
            href="app/assets/img/favicon.ico"
            rel="icon"
          />
          <link
            crossorigin="use-credentials"
            href="app/assets/img/site.webmanifest"
            rel="manifest"
          />
          <meta
            content="#2d89ef"
            name="msapplication-TileColor"
          />
          <meta
            content="app/assets/img/browserconfig.xml"
            name="msapplication-config"
          />
          <meta
            content="#ffffff"
            name="theme-color"
          />
          <meta
            content="default"
            name="apple-mobile-web-app-status-bar-style"
          />
          <meta
            content="/"
            name="base-href"
          />
          <meta
            content="/question/80"
            name="uri"
          />
          <title>
            19889 · Metabase
          </title>
          <base
            href="/"
          />
          <link
            href="app/dist/styles.3ddf973fc967572ec34c.css"
            rel="stylesheet"
          />
          <link
            href="app/dist/app-main.8c3db53cb80ee9443da7.css"
            rel="stylesheet"
          />
        </head>
        <body>
          <div
            id="root"
          >
            <div
              class="spread emotion-1fttcpj enx0u2k2"
            >
              <header
                aria-label="Navigation bar"
                class="emotion-15xkiw5 es0756t0"
                data-testid="app-bar"
              >
                <div
                  class="emotion-1pt930v e4w71dr4"
                >
                  <div
                    class="emotion-cxb03 e4w71dr3"
                  >
                    <div
                      class="emotion-bjn8wh ehgm33i2"
                    >
                      <a
                        class="ehgm33i1 emotion-m53806 emeibx70"
                        data-metabase-event="Navbar;Logo"
                        href="/"
                      >
                        <svg
                          class="Icon text-brand"
                          data-testid="main-logo"
                          fill="currentcolor"
                          height="32"
                          viewBox="0 0 66 85"
                        >
                          <path
                            d="M46.8253288,70.4935014 C49.5764899,70.4935014 51.8067467,68.1774705 51.8067467,65.3205017 C51.8067467,62.4635329 49.5764899,60.147502 46.8253288,60.147502 C44.0741676,60.147502 41.8439108,62.4635329 41.8439108,65.3205017 C41.8439108,68.1774705 44.0741676,70.4935014 46.8253288,70.4935014 Z M32.8773585,84.9779005 C35.6285197,84.9779005 37.8587764,82.6618697 37.8587764,79.8049008 C37.8587764,76.947932 35.6285197,74.6319011 32.8773585,74.6319011 C30.1261973,74.6319011 27.8959405,76.947932 27.8959405,79.8049008 C27.8959405,82.6618697 30.1261973,84.9779005 32.8773585,84.9779005 Z M32.8773585,70.4935014 C35.6285197,70.4935014 37.8587764,68.1774705 37.8587764,65.3205017 C37.8587764,62.4635329 35.6285197,60.147502 32.8773585,60.147502 C30.1261973,60.147502 27.8959405,62.4635329 27.8959405,65.3205017 C27.8959405,68.1774705 30.1261973,70.4935014 32.8773585,70.4935014 Z M18.9293882,70.4935014 C21.6805494,70.4935014 23.9108062,68.1774705 23.9108062,65.3205017 C23.9108062,62.4635329 21.6805494,60.147502 18.9293882,60.147502 C16.1782271,60.147502 13.9479703,62.4635329 13.9479703,65.3205017 C13.9479703,68.1774705 16.1782271,70.4935014 18.9293882,70.4935014 Z M46.8253288,56.0091023 C49.5764899,56.0091023 51.8067467,53.6930714 51.8067467,50.8361026 C51.8067467,47.9791337 49.5764899,45.6631029 46.8253288,45.6631029 C44.0741676,45.6631029 41.8439108,47.9791337 41.8439108,50.8361026 C41.8439108,53.6930714 44.0741676,56.0091023 46.8253288,56.0091023 Z M18.9293882,56.0091023 C21.6805494,56.0091023 23.9108062,53.6930714 23.9108062,50.8361026 C23.9108062,47.9791337 21.6805494,45.6631029 18.9293882,45.6631029 C16.1782271,45.6631029 13.9479703,47.9791337 13.9479703,50.8361026 C13.9479703,53.6930714 16.1782271,56.0091023 18.9293882,56.0091023 Z M46.8253288,26.8995984 C49.5764899,26.8995984 51.8067467,24.5835675 51.8067467,21.7265987 C51.8067467,18.8696299 49.5764899,16.553599 46.8253288,16.553599 C44.0741676,16.553599 41.8439108,18.8696299 41.8439108,21.7265987 C41.8439108,24.5835675 44.0741676,26.8995984 46.8253288,26.8995984 Z M32.8773585,41.5247031 C35.6285197,41.5247031 37.8587764,39.2086723 37.8587764,36.3517034 C37.8587764,33.4947346 35.6285197,31.1787037 32.8773585,31.1787037 C30.1261973,31.1787037 27.8959405,33.4947346 27.8959405,36.3517034 C27.8959405,39.2086723 30.1261973,41.5247031 32.8773585,41.5247031 Z M32.8773585,10.3459994 C35.6285197,10.3459994 37.8587764,8.02996853 37.8587764,5.17299969 C37.8587764,2.31603085 35.6285197,0 32.8773585,0 C30.1261973,0 27.8959405,2.31603085 27.8959405,5.17299969 C27.8959405,8.02996853 30.1261973,10.3459994 32.8773585,10.3459994 Z M32.8773585,26.8995984 C35.6285197,26.8995984 37.8587764,24.5835675 37.8587764,21.7265987 C37.8587764,18.8696299 35.6285197,16.553599 32.8773585,16.553599 C30.1261973,16.553599 27.8959405,18.8696299 27.8959405,21.7265987 C27.8959405,24.5835675 30.1261973,26.8995984 32.8773585,26.8995984 Z M18.9293882,26.8995984 C21.6805494,26.8995984 23.9108062,24.5835675 23.9108062,21.7265987 C23.9108062,18.8696299 21.6805494,16.553599 18.9293882,16.553599 C16.1782271,16.553599 13.9479703,18.8696299 13.9479703,21.7265987 C13.9479703,24.5835675 16.1782271,26.8995984 18.9293882,26.8995984 Z"
                            opacity="0.2"
                          />
                          <path
                            d="M60.773299,70.4935014 C63.5244602,70.4935014 65.754717,68.1774705 65.754717,65.3205017 C65.754717,62.4635329 63.5244602,60.147502 60.773299,60.147502 C58.0221379,60.147502 55.7918811,62.4635329 55.7918811,65.3205017 C55.7918811,68.1774705 58.0221379,70.4935014 60.773299,70.4935014 Z M4.98141795,70.3527958 C7.73257912,70.3527958 9.96283591,68.0367649 9.96283591,65.1797961 C9.96283591,62.3228273 7.73257912,60.0067964 4.98141795,60.0067964 C2.23025679,60.0067964 0,62.3228273 0,65.1797961 C0,68.0367649 2.23025679,70.3527958 4.98141795,70.3527958 Z M60.773299,56.0091023 C63.5244602,56.0091023 65.754717,53.6930714 65.754717,50.8361026 C65.754717,47.9791337 63.5244602,45.6631029 60.773299,45.6631029 C58.0221379,45.6631029 55.7918811,47.9791337 55.7918811,50.8361026 C55.7918811,53.6930714 58.0221379,56.0091023 60.773299,56.0091023 Z M32.8773585,56.0091023 C35.6285197,56.0091023 37.8587764,53.6930714 37.8587764,50.8361026 C37.8587764,47.9791337 35.6285197,45.6631029 32.8773585,45.6631029 C30.1261973,45.6631029 27.8959405,47.9791337 27.8959405,50.8361026 C27.8959405,53.6930714 30.1261973,56.0091023 32.8773585,56.0091023 Z M4.98141795,55.8683967 C7.73257912,55.8683967 9.96283591,5...
2213 Passed

@qwef qwef enabled auto-merge (squash) January 12, 2024 19:21
@qwef qwef merged commit 672b07e into master Jan 12, 2024
104 of 105 checks passed
@qwef qwef deleted the jh-retry-reset-password branch January 12, 2024 19:54
Copy link

@qwef Did you forget to add a milestone to the issue for this PR? When and where should I add a milestone?

github-actions bot pushed a commit that referenced this pull request Jan 12, 2024
* add retry to password reset

* fix error case

* add to all emails

* fix misc stuff

* fix test

* fix test

* fix linter

* fix retrying framework

* fix linter

* fix e2e test

* add comment

* adress comments

* fix linter

* fix linter

* fix test

* fix test

* fix test

* fix test

* fix test

* fix e2e test

* fix e2e test

* fix e2e test

* fix test

* fix e2e test and unit tests

* remove paren

* fix linter

* fix e2e test

* fix e2e test

* finally actually fix e2e test
metabase-bot bot added a commit that referenced this pull request Jan 12, 2024
* add retry to password reset

* fix error case

* add to all emails

* fix misc stuff

* fix test

* fix test

* fix linter

* fix retrying framework

* fix linter

* fix e2e test

* add comment

* adress comments

* fix linter

* fix linter

* fix test

* fix test

* fix test

* fix test

* fix test

* fix e2e test

* fix e2e test

* fix e2e test

* fix test

* fix e2e test and unit tests

* remove paren

* fix linter

* fix e2e test

* fix e2e test

* finally actually fix e2e test

Co-authored-by: Jerry Huang <34140255+qwef@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport Automatically create PR on current release branch on merge .Team/AdminWebapp Admin and Webapp team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Possible to config or resend Email on EOF Error
4 participants