From beae63f592be44bef4ceb3a09aca47724b3f03d1 Mon Sep 17 00:00:00 2001 From: parker Date: Fri, 6 Dec 2024 12:58:48 -0500 Subject: [PATCH] WIP exploring better migration --- lib/triton/setup.ex | 6 +++- lib/triton/setup/db_connection.ex | 40 +++++++++++++++++++++++++++ lib/triton/setup/keyspace.ex | 7 +++-- lib/triton/setup/materialized_view.ex | 9 ++++-- lib/triton/setup/table.ex | 10 +++++-- 5 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 lib/triton/setup/db_connection.ex diff --git a/lib/triton/setup.ex b/lib/triton/setup.ex index 0b714ed..d4c2a58 100644 --- a/lib/triton/setup.ex +++ b/lib/triton/setup.ex @@ -1,4 +1,6 @@ defmodule Triton.Setup do + alias Triton.Setup.DbConnection + defmacro __before_compile__(_) do module = __CALLER__.module statements = Module.get_attribute(module, :setup_statements) @@ -17,8 +19,10 @@ defmodule Triton.Setup do node_config = Keyword.put(node_config, :nodes, node_config[:nodes]) {:ok, _apps} = Application.ensure_all_started(:xandra) - {:ok, conn} = Xandra.Cluster.start_link(node_config) + {:ok, cluster} = DbConnection.get_cluster(node_config) + IO.puts "SETUP!!!!!!!!!" Xandra.Cluster.execute!(conn, "USE #{node_config[:keyspace]};", _params = []) + IO.puts "SETUP2!!!!!!!!!" Xandra.Cluster.execute!(conn, statement, _params = []) rescue err -> IO.inspect(err) diff --git a/lib/triton/setup/db_connection.ex b/lib/triton/setup/db_connection.ex new file mode 100644 index 0000000..982f9d3 --- /dev/null +++ b/lib/triton/setup/db_connection.ex @@ -0,0 +1,40 @@ +defmodule Triton.Setup.DbConnection do + def get_cluster(config) do + # nodes = Enum.shuffle(config[:nodes] || []) + nodes = config[:nodes] || [] + + node_config = Keyword.merge(config, [ + name: __MODULE__, + nodes: nodes, + # backoff_type: :stop, + backoff_max: 5_000, + # connect_timeout: 2_000, + # refresh_topology_interval: 10_000, + queue_checkouts_before_connecting: [ + max_size: 1000, + timeout: 50_000 + ] + ]) + |> Keyword.drop([:autodiscovery]) + + case Xandra.Cluster.start_link(node_config) do + {:ok, cluster} -> + IO.inspect(cluster, label: "new connection") + IO.inspect(nodes, label: "nodes") + test_connection(cluster) + |> IO.inspect(label: "test_connection") + {:ok, cluster} + + {:error, {:already_started, cluster}} -> + IO.inspect(cluster, label: "already started") + {:ok, cluster} + + {:error, _reason} = err -> + {:error, :connection_failed} + end + end + + defp test_connection(cluster) do + Xandra.Cluster.execute!(cluster, "SELECT now() FROM system.local", _params = []) + end +end diff --git a/lib/triton/setup/keyspace.ex b/lib/triton/setup/keyspace.ex index 8f7ee61..cf09c3e 100644 --- a/lib/triton/setup/keyspace.ex +++ b/lib/triton/setup/keyspace.ex @@ -1,4 +1,6 @@ defmodule Triton.Setup.Keyspace do + alias Triton.Setup.DbConnection + def setup(schema_module) do blueprint = schema_module.__struct__ try do @@ -9,10 +11,11 @@ defmodule Triton.Setup.Keyspace do node_config = Keyword.put(node_config, :nodes, node_config[:nodes]) {:ok, _apps} = Application.ensure_all_started(:xandra) - {:ok, conn} = Xandra.Cluster.start_link(node_config) + {:ok, cluster} = DbConnection.get_cluster(node_config) statement = build_cql(schema_module) - Xandra.Cluster.execute!(conn, statement, _params = []) + IO.puts "KEYSPACE!!!!!!!!!" + Xandra.Cluster.execute!(cluster, statement, _params = []) rescue err -> IO.inspect(err) end diff --git a/lib/triton/setup/materialized_view.ex b/lib/triton/setup/materialized_view.ex index f46f2ca..a520f99 100644 --- a/lib/triton/setup/materialized_view.ex +++ b/lib/triton/setup/materialized_view.ex @@ -1,4 +1,6 @@ defmodule Triton.Setup.MaterializedView do + alias Triton.Setup.DbConnection + def setup(schema_module) do blueprint = Triton.Metadata.schema(schema_module).__struct__ try do @@ -35,11 +37,12 @@ defmodule Triton.Setup.MaterializedView do node_config = Keyword.put(node_config, :nodes, node_config[:nodes]) {:ok, _apps} = Application.ensure_all_started(:xandra) - {:ok, conn} = Xandra.Cluster.start_link(node_config) + {:ok, cluster} = DbConnection.get_cluster(node_config) statement = build_cql(schema_module) - Xandra.Cluster.execute!(conn, "USE #{node_config[:keyspace]};", _params = []) - Xandra.Cluster.execute!(conn, statement, _params = []) + IO.puts "MATERIALIZED VIEW!!!!!!!!!" + Xandra.Cluster.execute!(cluster, "USE #{node_config[:keyspace]};", _params = []) + Xandra.Cluster.execute!(cluster, statement, _params = []) end def build_cql(schema_module) do diff --git a/lib/triton/setup/table.ex b/lib/triton/setup/table.ex index 3ad042b..ca5af2e 100644 --- a/lib/triton/setup/table.ex +++ b/lib/triton/setup/table.ex @@ -7,6 +7,8 @@ defmodule Triton.Setup.Table do @doc """ Attempts to create tables at compile time by connecting to DB with Xandra """ + alias Triton.Setup.DbConnection + def setup(schema_module) do blueprint = Triton.Metadata.schema(schema_module).__struct__ try do @@ -38,11 +40,13 @@ defmodule Triton.Setup.Table do node_config = Keyword.put(node_config, :nodes, node_config[:nodes]) {:ok, _apps} = Application.ensure_all_started(:xandra) - {:ok, conn} = Xandra.Cluster.start_link(node_config) + {:ok, cluster} = DbConnection.get_cluster(node_config) statement = build_cql(schema_module) - Xandra.Cluster.execute!(conn, "USE #{node_config[:keyspace]};", _params = []) - Xandra.Cluster.execute!(conn, statement, _params = []) + IO.puts "TABLE!!!!!!!!!" + Xandra.Cluster.execute!(cluster, "USE #{node_config[:keyspace]};", _params = []) + IO.puts "TABLE2!!!!!!!!!" + Xandra.Cluster.execute!(cluster, statement, _params = []) end def build_cql(schema_module) do