Use single letters for Redis metadata keys

Saves 16 characters per document object and 10
characters per directory object
This commit is contained in:
Garret Alfert 2016-03-02 15:00:33 +01:00
parent 650da91a1d
commit 88f2dceb27
3 changed files with 31 additions and 31 deletions

View File

@ -107,10 +107,10 @@ module RemoteStorage
metadata[metadata_values[idx]] = metadata_values[idx + 1] metadata[metadata_values[idx]] = metadata_values[idx + 1]
end end
listing[name] = {["ETag"] = metadata["etag"]} listing[name] = {["ETag"] = metadata["e"]}
if string.sub(name, -1) ~= "/" then if string.sub(name, -1) ~= "/" then
listing[name]["Content-Type"] = metadata["type"] listing[name]["Content-Type"] = metadata["t"]
listing[name]["Content-Length"] = tonumber(metadata["size"]) listing[name]["Content-Length"] = tonumber(metadata["s"])
end end
end end
@ -121,7 +121,7 @@ module RemoteStorage
end end
def get_directory_listing_from_redis(user, directory) def get_directory_listing_from_redis(user, directory)
etag = redis.hget "rsm:#{user}:#{directory}/", "etag" etag = redis.hget "rsm:#{user}:#{directory}/", "e"
none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").split(",").map(&:strip) none_match = (server.env["HTTP_IF_NONE_MATCH"] || "").split(",").map(&:strip)
server.halt 304 if none_match.include? etag server.halt 304 if none_match.include? etag
@ -192,10 +192,10 @@ module RemoteStorage
timestamp = (Time.now.to_f * 1000).to_i timestamp = (Time.now.to_f * 1000).to_i
metadata = { metadata = {
etag: res.headers[:etag], e: res.headers[:etag],
size: data.size, s: data.size,
type: content_type, t: content_type,
modified: timestamp m: timestamp
} }
if update_metadata_object(user, directory, key, metadata) && if update_metadata_object(user, directory, key, metadata) &&
@ -319,17 +319,17 @@ module RemoteStorage
else else
redis_key = redis_key..directory.."/"..key.."/" redis_key = redis_key..directory.."/"..key.."/"
end end
if redis.call("hget", redis_key, "etag") then if redis.call("hget", redis_key, "e") then
return true return true
end end
for index, dir in pairs(parent_directories) do for index, dir in pairs(parent_directories) do
if redis.call("hget", "rsm:"..user..":"..dir.."/", "etag") then if redis.call("hget", "rsm:"..user..":"..dir.."/", "e") then
-- the directory already exists, no need to do further checks -- the directory already exists, no need to do further checks
return false return false
else else
-- check for existing document with same name as directory -- check for existing document with same name as directory
if redis.call("hget", "rsm:"..user..":"..dir, "etag") then if redis.call("hget", "rsm:"..user..":"..dir, "e") then
return true return true
end end
end end
@ -419,7 +419,7 @@ module RemoteStorage
end end
key = "rsm:#{user}:#{dir}/" key = "rsm:#{user}:#{dir}/"
metadata = {etag: etag, modified: timestamp} metadata = {e: etag, m: timestamp}
redis.hmset(key, *metadata) redis.hmset(key, *metadata)
redis.sadd "rsm:#{user}:#{parent_directory_for(dir)}:i", "#{top_directory(dir)}/" redis.sadd "rsm:#{user}:#{parent_directory_for(dir)}:i", "#{top_directory(dir)}/"
end end
@ -459,7 +459,7 @@ module RemoteStorage
get_response = do_get_request("#{container_url_for(user)}/?format=json&path=") get_response = do_get_request("#{container_url_for(user)}/?format=json&path=")
etag = etag_for(get_response.body) etag = etag_for(get_response.body)
end end
metadata = {etag: etag, modified: timestamp} metadata = {e: etag, m: timestamp}
redis.hmset("rsm:#{user}:#{dir}/", *metadata) redis.hmset("rsm:#{user}:#{dir}/", *metadata)
end end
end end

View File

@ -93,8 +93,8 @@ class Migrator
def save_directory_data(dir, item, data, timestamp) def save_directory_data(dir, item, data, timestamp)
key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}" key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}"
metadata = { metadata = {
etag: data["ETag"], e: data["ETag"],
modified: timestamp_for(data["Last-Modified"]) m: timestamp_for(data["Last-Modified"])
} }
logger.debug "Metadata for dir #{key}: #{metadata}" logger.debug "Metadata for dir #{key}: #{metadata}"
@ -104,10 +104,10 @@ class Migrator
def save_document_data(dir, item, data) def save_document_data(dir, item, data)
key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}" key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}"
metadata = { metadata = {
etag: data["ETag"], e: data["ETag"],
size: data["Content-Length"], s: data["Content-Length"],
type: data["Content-Type"], t: data["Content-Type"],
modified: timestamp_for(data["Last-Modified"]) m: timestamp_for(data["Last-Modified"])
} }
logger.debug "Metadata for document #{key}: #{metadata}" logger.debug "Metadata for document #{key}: #{metadata}"
redis.hmset(key, *metadata) unless dry_run redis.hmset(key, *metadata) unless dry_run

View File

@ -32,10 +32,10 @@ describe "App" do
end end
metadata = redis.hgetall "rsm:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata["size"].must_equal "2" metadata["s"].must_equal "2"
metadata["type"].must_equal "text/plain; charset=utf-8" metadata["t"].must_equal "text/plain; charset=utf-8"
metadata["etag"].must_equal "bla" metadata["e"].must_equal "bla"
metadata["modified"].length.must_equal 13 metadata["m"].length.must_equal 13
end end
it "creates the directory objects metadata in redis" do it "creates the directory objects metadata in redis" do
@ -51,12 +51,12 @@ describe "App" do
end end
metadata = redis.hgetall "rsm:phil:/" metadata = redis.hgetall "rsm:phil:/"
metadata["etag"].must_equal "rootetag" metadata["e"].must_equal "rootetag"
metadata["modified"].length.must_equal 13 metadata["m"].length.must_equal 13
metadata = redis.hgetall "rsm:phil:food/" metadata = redis.hgetall "rsm:phil:food/"
metadata["etag"].must_equal "bla" metadata["e"].must_equal "bla"
metadata["modified"].length.must_equal 13 metadata["m"].length.must_equal 13
food_items = redis.smembers "rsm:phil:food/:i" food_items = redis.smembers "rsm:phil:food/:i"
food_items.each do |food_item| food_items.each do |food_item|
@ -82,7 +82,7 @@ describe "App" do
last_response.status.must_equal 200 last_response.status.must_equal 200
metadata = redis.hgetall "rsm:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata["size"].must_equal "2" metadata["s"].must_equal "2"
end end
it "conflicts when there is a directory with same name as document" do it "conflicts when there is a directory with same name as document" do
@ -198,9 +198,9 @@ describe "App" do
end end
metadata = redis.hgetall "rsm:phil:food/" metadata = redis.hgetall "rsm:phil:food/"
metadata["etag"].must_equal "newetag" metadata["e"].must_equal "newetag"
metadata["modified"].length.must_equal 13 metadata["m"].length.must_equal 13
metadata["modified"].wont_equal old_metadata["modified"] metadata["m"].wont_equal old_metadata["m"]
food_items = redis.smembers "rsm:phil:food/:i" food_items = redis.smembers "rsm:phil:food/:i"
food_items.must_equal ["camaron"] food_items.must_equal ["camaron"]