From d4151b64df60dd50e71ad93ca44471f9251b4c2b Mon Sep 17 00:00:00 2001 From: Garret Alfert Date: Mon, 1 Oct 2012 17:43:56 +0200 Subject: [PATCH] Save timestamps for directory objects as actual data to keep them consistent with the data objects --- lib/remote_storage/riak.rb | 29 ++++++++++++++++------------- spec/directories_spec.rb | 29 +++++++++++++++++------------ 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/lib/remote_storage/riak.rb b/lib/remote_storage/riak.rb index df69db8..5350ffa 100644 --- a/lib/remote_storage/riak.rb +++ b/lib/remote_storage/riak.rb @@ -48,8 +48,9 @@ module RemoteStorage def get_directory_listing(user, directory) directory_object = directory_bucket.get("#{user}:#{directory}") + timestamp = directory_object.data.to_i headers["Content-Type"] = "application/json" - headers["Last-Modified"] = directory_object.last_modified.to_s(:rfc822) + headers["Last-Modified"] = Time.at(timestamp).to_s(:rfc822) listing = directory_listing(user, directory) @@ -73,8 +74,10 @@ module RemoteStorage :directory_bin => [directory_index]}) object.store - create_missing_directory_objects(user, directory) - update_directory_object(user, directory) + object.reload + timestamp = object.last_modified.to_i + create_missing_directory_objects(user, directory, timestamp) + update_directory_object(user, directory, timestamp) rescue ::Riak::HTTPFailedRequest halt 422 end @@ -118,13 +121,12 @@ module RemoteStorage listing = {} sub_directories(user, directory).each do |entry| - timestamp = DateTime.rfc2822(entry["last_modified"]).to_time.to_i directory_name = CGI.unescape(entry["name"]).split("/").last - listing.merge!({ "#{directory_name}/" => timestamp }) + listing.merge!({ "#{directory_name}/" => entry["timestamp"] }) end directory_entries(user, directory).each do |entry| - timestamp = DateTime.rfc2822(entry["last_modified"]).to_time.to_i + timestamp = DateTime.rfc2822(entry["last_modified"]).to_i listing.merge!({ entry["name"] => timestamp }) end @@ -157,10 +159,10 @@ module RemoteStorage function(v){ keys = v.key.split(':'); key_name = keys[keys.length-1]; - last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified']; + timestamp = v.values[0]['data'] return [{ name: key_name, - last_modified: last_modified_date, + timestamp: timestamp, }]; } EOH @@ -171,23 +173,23 @@ module RemoteStorage run end - def create_missing_directory_objects(user, directory) + def create_missing_directory_objects(user, directory, timestamp) parent_directories = directory.split("/") parent_directories.pop while parent_directories.any? parent_directory = parent_directories.join("/") unless directory_bucket.exist?("#{user}:#{parent_directory}") - update_directory_object(user, parent_directory) + update_directory_object(user, parent_directory, timestamp) end parent_directories.pop end unless directory_bucket.exist?("#{user}:") - update_directory_object(user, "") + update_directory_object(user, "", timestamp) end end - def update_directory_object(user, directory) + def update_directory_object(user, directory, timestamp) if directory.match /\// parent_directory = directory[0..directory.rindex("/")-1] elsif directory != "" @@ -195,7 +197,8 @@ module RemoteStorage end directory_object = directory_bucket.new("#{user}:#{directory}") - directory_object.raw_data = "" + directory_object.content_type = "text/plain; charset=utf-8" + directory_object.data = timestamp.to_s directory_object.indexes.merge!({:user_id_bin => [user]}) if parent_directory directory_object.indexes.merge!({:directory_bin => [parent_directory]}) diff --git a/spec/directories_spec.rb b/spec/directories_spec.rb index bab11fb..9bbaeca 100644 --- a/spec/directories_spec.rb +++ b/spec/directories_spec.rb @@ -80,12 +80,14 @@ describe "Directories" do end it "does not update existing directory objects" do - tasks_timestamp = directory_bucket.get("jimmy:tasks").last_modified - wait_a_second + old_timestamp = (Time.now.to_i - 2).to_s + tasks_object = directory_bucket.get("jimmy:tasks") + tasks_object.data = old_timestamp + tasks_object.store + put "/jimmy/tasks/private/projects/world-domination/start", "write a manifesto" - tasks_object = directory_bucket.get("jimmy:tasks") - tasks_object.last_modified.must_equal tasks_timestamp + tasks_object.reload.data.must_equal old_timestamp end end end @@ -147,8 +149,11 @@ describe "Directories" do it "creates a new directory object" do put "/jimmy/tasks/home/trash", "take out the trash" - object = directory_bucket.get("jimmy:tasks/home") - object.last_modified.wont_be_nil + object = data_bucket.get("jimmy:tasks/home:trash") + directory = directory_bucket.get("jimmy:tasks/home") + + directory.data.wont_be_nil + directory.data.to_i.must_equal object.last_modified.to_i end it "sets the correct index for the directory object" do @@ -163,11 +168,11 @@ describe "Directories" do object = directory_bucket.get("jimmy:tasks") object.indexes["directory_bin"].must_include "/" - object.last_modified.wont_be_nil + object.data.wont_be_nil object = directory_bucket.get("jimmy:") object.indexes["directory_bin"].must_be_empty - object.last_modified.wont_be_nil + object.data.wont_be_nil end end @@ -175,17 +180,17 @@ describe "Directories" do before do @directory = directory_bucket.new("jimmy:tasks/home") @directory.content_type = "text/plain" - @directory.raw_data = "" + @directory.data = 2.seconds.ago.to_i.to_s @directory.store - @old_timestamp = @directory.reload.last_modified end it "updates the timestamp of the directory" do - wait_a_second put "/jimmy/tasks/home/trash", "take out the trash" + object = data_bucket.get("jimmy:tasks/home:trash") @directory.reload - @directory.last_modified.must_be :>, @old_timestamp + + @directory.data.to_i.must_equal object.last_modified.to_i end end end