@@ -15,9 +15,10 @@ defmodule RemotePersistentTerm.Fetcher.S3 do
1515 key: String . t ( ) ,
1616 region: region ,
1717 failover_buckets: [ failover_bucket ] | nil ,
18- version_id: String . t ( ) | nil
18+ version_id: String . t ( ) | nil ,
19+ versions: [ map ( ) ] | nil
1920 }
20- defstruct [ :bucket , :key , :region , :failover_buckets , :version_id ]
21+ defstruct [ :bucket , :key , :region , :failover_buckets , :version_id , :versions ]
2122
2223 @ failover_bucket_schema [
2324 bucket: [
@@ -92,7 +93,7 @@ defmodule RemotePersistentTerm.Fetcher.S3 do
9293 message: "Found latest version of object"
9394 )
9495
95- { :ok , etag }
96+ { :ok , etag , % { state | versions: versions } }
9697 else
9798 { :error , { :unexpected_response , % { body: reason } } } ->
9899 { :error , reason }
@@ -176,9 +177,11 @@ defmodule RemotePersistentTerm.Fetcher.S3 do
176177 version_id: state . version_id
177178 )
178179
179- with { :ok , versions } <- list_object_versions ( state ) ,
180+ versions = if state . versions , do: { :ok , state . versions } , else: list_object_versions ( state )
181+
182+ with { :ok , versions } <- versions ,
180183 { :ok , previous_version } <- find_previous_version ( versions , state . version_id ) do
181- { :ok , % { state | version_id: previous_version . version_id } }
184+ { :ok , % { state | version_id: previous_version . version_id , versions: versions } }
182185 else
183186 { :error , reason } ->
184187 Logger . error ( % {
@@ -194,13 +197,7 @@ defmodule RemotePersistentTerm.Fetcher.S3 do
194197
195198 defp find_previous_version ( versions , current_version_id ) do
196199 versions
197- |> Enum . sort_by (
198- fn version ->
199- { :ok , datetime , _ } = DateTime . from_iso8601 ( version . last_modified )
200- datetime
201- end ,
202- { :desc , DateTime }
203- )
200+ |> Enum . sort_by ( & & 1 . last_modified , :desc )
204201 |> Enum . find ( fn version ->
205202 version . version_id != current_version_id
206203 end )
0 commit comments