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

tzdata without timezone upon boot: (with time zone database Tzdata.TimeZoneDatabase), reason: :time_zone_not_found #135

Open
allenwyma opened this issue Jun 14, 2023 · 2 comments

Comments

@allenwyma
Copy link

Hi,

I'm a bit confused and haven't been able to figure out what the issue is that I'm having. Running my app with dev env, i am not having any issues, but when I make a release, it seems there's a startup order issue or something else with tzdata.

Elixir: 1.14.5
Erlang: 25.3.2
OS: Ubuntu image from phx.gen.release --docker

When I boot my app:

04:34:11.599 [notice] Application google_certs exited: GoogleCerts.Application.start(:normal, []) returned an error: shutdown: failed to start child: GoogleCerts.CertificateCache
    ** (EXIT) an exception was raised:
        ** (ArgumentError) cannot add 23635 second to ~U[2023-06-14 04:34:11.592268Z] (with time zone database Tzdata.TimeZoneDatabase), reason: :time_zone_not_found
            (elixir 1.14.5) lib/calendar/datetime.ex:1561: DateTime.add/4
            (google_certs 1.0.0) lib/google_certs/client.ex:96: GoogleCerts.Client.expiration/1
            (google_certs 1.0.0) lib/google_certs/client.ex:41: GoogleCerts.Client.get/1
            (google_certs 1.0.0) lib/google_certs.ex:95: GoogleCerts.refresh/1
            (elixir 1.14.5) lib/agent/server.ex:8: Agent.Server.init/1
            (stdlib 4.3.1) gen_server.erl:851: :gen_server.init_it/2
            (stdlib 4.3.1) gen_server.erl:814: :gen_server.init_it/6
            (stdlib 4.3.1) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
{"Kernel pid terminated",application_controller,"{application_start_failure,google_certs,{{shutdown,{failed_to_start_child,'Elixir.GoogleCerts.CertificateCache',{#{'__exception__' => true,'__struct__' => 'Elixir.ArgumentError',message => <<\"cannot add 23635 second to ~U[2023-06-14 04:34:11.592268Z] (with time zone database Tzdata.TimeZoneDatabase), reason: :time_zone_not_found\">>},[{'Elixir.DateTime',add,4,[{file,\"lib/calendar/datetime.ex\"},{line,1561}]},{'Elixir.GoogleCerts.Client',expiration,1,[{file,\"lib/google_certs/client.ex\"},{line,96}]},{'Elixir.GoogleCerts.Client',get,1,[{file,\"lib/google_certs/client.ex\"},{line,41}]},{'Elixir.GoogleCerts',refresh,1,[{file,\"lib/google_certs.ex\"},{line,95}]},{'Elixir.Agent.Server',init,1,[{file,\"lib/agent/server.ex\"},{line,8}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,851}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,814}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,240}]}]}}},{'Elixir.GoogleCerts.Application',start,[normal,[]]}}}"}
Kernel pid terminated (application_controller) ({application_start_failure,google_certs,{{shutdown,{failed_to_start_child,'Elixir.GoogleCerts.CertificateCache',{#{'__exception__' => true,'__struct__' => 'Elixir.ArgumentError',message => <<"cannot add 23635 second to ~U[2023-06-14 04:34:11.592268Z] (with time zone database Tzdata.TimeZoneDatabase), reason: :time_zone_not_found">>},[{'Elixir.DateTime',add,4,[{file,"lib/calendar/datetime.ex"},{line,1561}]},{'Elixir.GoogleCerts.Client',expiration,1,[{file,"lib/google_certs/client.ex"},{line,96}]},{'Elixir.GoogleCerts.Client',get,1,[{file,"lib/google_certs/client.ex"},{line,41}]},{'Elixir.GoogleCerts',refresh,1,[{file,"lib/google_certs.ex"},{line,95}]},{'Elixir.Agent.Server',init,1,[{file,"lib/agent/server.ex"},{line,8}]},{gen_server,init_it,2,[{file,"gen_server.erl"},{line,851}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,814}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,240}]}]}}},{'Elixir.GoogleCerts.Application',start,[normal,[]]}}})

I've already configured my app to use TzData: config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase
I've also defined the start order in my mix.exs file:

{:tzdata, "~> 1.1"},
{:google_certs, "~> 1.0"},

Is there a missing time database or something I need to do in order to make this work?

@lau
Copy link
Owner

lau commented Jun 21, 2023

Hi, it looks like google_certs is doing a DateTime calculation during compile time. Since TzData is configured, but not started, TzData is called before it is started. That means the ets table is not available yet.

You can try this branch static-utc-period (https://github.com/lau/tzdata/tree/static-utc-period) temporarily and see if that fixes your problem. The static-utc-period won't be available forever. I plan to release a similar fix in a new version.

@allenwyma
Copy link
Author

okay, interesting, strange part is it's failing only when doing a release, and NOT when running with mix.

I'll try to take a look.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants