diff --git a/lib/remote_storage/swift.rb b/lib/remote_storage/swift.rb index 679d8b7..0a41055 100644 --- a/lib/remote_storage/swift.rb +++ b/lib/remote_storage/swift.rb @@ -159,6 +159,7 @@ module RemoteStorage if update_metadata_object(user, directory, key, metadata) if metadata_changed?(existing_metadata, metadata) update_dir_objects(user, directory, timestamp, checksum_for(data)) + log_size_difference(user, existing_metadata["s"], metadata[:s]) end server.headers["ETag"] = %Q("#{res.headers[:etag]}") @@ -168,6 +169,11 @@ module RemoteStorage end end + def log_size_difference(user, old_size, new_size) + delta = new_size.to_i - old_size.to_i + redis.incrby "rs:s:#{user}", delta + end + def checksum_for(data) Digest::MD5.hexdigest(data) end @@ -182,6 +188,7 @@ module RemoteStorage end do_delete_request(url) + log_size_difference(user, existing_metadata["s"], 0) delete_metadata_objects(user, directory, key) delete_dir_objects(user, directory) diff --git a/spec/swift/app_spec.rb b/spec/swift/app_spec.rb index a30c52e..eadbc68 100644 --- a/spec/swift/app_spec.rb +++ b/spec/swift/app_spec.rb @@ -74,6 +74,36 @@ describe "App" do root_items.must_equal ["food/"] end + context "logging usage size" do + before do + @put_stub = OpenStruct.new(headers: { + etag: "bla", + last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" + }) + + end + + it "logs the complete size when creating new objects" do + RestClient.stub :put, @put_stub do + put "/phil/food/aguacate", "1234567890" + end + + size_log = redis.get "rs:s:phil" + size_log.must_equal "10" + end + + it "logs the size difference when updating existing objects" do + RestClient.stub :put, @put_stub do + put "/phil/food/camaron", "1234567890" + put "/phil/food/aguacate", "1234567890" + put "/phil/food/aguacate", "123" + end + + size_log = redis.get "rs:s:phil" + size_log.must_equal "13" + end + end + describe "objects in root dir" do before do put_stub = OpenStruct.new(headers: { @@ -289,6 +319,17 @@ describe "App" do end end + it "decreases the size log by size of deleted object" do + RestClient.stub :delete, "" do + RemoteStorage::Swift.stub_any_instance :etag_for, "rootetag" do + delete "/phil/food/aguacate" + end + end + + size_log = redis.get "rs:s:phil" + size_log.must_equal "8" + end + it "deletes the metadata object in redis" do RestClient.stub :delete, "" do RemoteStorage::Swift.stub_any_instance :etag_for, "rootetag" do