workaround for inconsistent PutObjectCopy on R2

This commit is contained in:
byte[] 2022-11-05 09:23:56 -04:00
parent 419ebdfe83
commit 464cc26a85

View file

@ -3,19 +3,25 @@ defmodule Philomena.Objects do
Replication wrapper for object storage backends. Replication wrapper for object storage backends.
""" """
alias Philomena.Mime alias Philomena.Mime
require Logger
# #
# Fetch a key from the primary storage backend and # Fetch a key from the storage backend and
# write it into the destination file. # write it into the destination file.
# #
# sobelow_skip ["Traversal.FileModule"] # sobelow_skip ["Traversal.FileModule"]
@spec download_file(String.t(), String.t()) :: any() @spec download_file(String.t(), String.t()) :: any()
def download_file(key, file_path) do def download_file(key, file_path) do
[opts] = primary_opts()
contents = contents =
ExAws.S3.get_object(opts[:bucket], key) backends()
|> ExAws.request!(opts[:config_overrides]) |> Enum.find_value(fn opts ->
ExAws.S3.get_object(opts[:bucket], key)
|> ExAws.request(opts[:config_overrides])
|> case do
{:ok, result} -> result
_ -> nil
end
end)
File.write!(file_path, contents.body) File.write!(file_path, contents.body)
end end
@ -58,10 +64,16 @@ defmodule Philomena.Objects do
# #
@spec copy(String.t(), String.t()) :: any() @spec copy(String.t(), String.t()) :: any()
def copy(source_key, dest_key) do def copy(source_key, dest_key) do
run_all(fn opts -> # Potential workaround for inconsistent PutObjectCopy on R2
ExAws.S3.put_object_copy(opts[:bucket], dest_key, opts[:bucket], source_key) #
|> ExAws.request!(opts[:config_overrides]) # run_all(fn opts->
end) # ExAws.S3.put_object_copy(opts[:bucket], dest_key, opts[:bucket], source_key)
# |> ExAws.request!(opts[:config_overrides])
# end)
file_path = Briefly.create!()
download_file(source_key, file_path)
upload(dest_key, file_path)
end end
# #
@ -101,7 +113,7 @@ defmodule Philomena.Objects do
|> Enum.any?(fn {_, v} -> v == :error end) |> Enum.any?(fn {_, v} -> v == :error end)
|> case do |> case do
true -> true ->
raise "Failed to operate on all backends" Logger.warn("Failed to operate on all backends")
_ -> _ ->
:ok :ok