Shorten Redis metadata keys

Use rsm:<username>:<dir>:i instead of
rs_meta:<username>:<dir>:items
This commit is contained in:
Garret Alfert 2016-03-02 14:43:28 +01:00
parent 067f4a1553
commit 650da91a1d
3 changed files with 37 additions and 37 deletions

View File

@ -87,11 +87,11 @@ module RemoteStorage
lua_script = <<-EOF lua_script = <<-EOF
local user = ARGV[1] local user = ARGV[1]
local directory = ARGV[2] local directory = ARGV[2]
local items = redis.call("smembers", "rs_meta:"..user..":"..directory.."/:items") local items = redis.call("smembers", "rsm:"..user..":"..directory.."/:i")
local listing = {} local listing = {}
for index, name in pairs(items) do for index, name in pairs(items) do
local redis_key = "rs_meta:"..user..":" local redis_key = "rsm:"..user..":"
if directory == "" then if directory == "" then
redis_key = redis_key..name redis_key = redis_key..name
else else
@ -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 "rs_meta:#{user}:#{directory}/", "etag" etag = redis.hget "rsm:#{user}:#{directory}/", "etag"
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
@ -313,7 +313,7 @@ module RemoteStorage
end end
-- check for existing directory with the same name as the document -- check for existing directory with the same name as the document
local redis_key = "rs_meta:"..user..":" local redis_key = "rsm:"..user..":"
if directory == "" then if directory == "" then
redis_key = redis_key..key.."/" redis_key = redis_key..key.."/"
else else
@ -324,12 +324,12 @@ module RemoteStorage
end end
for index, dir in pairs(parent_directories) do for index, dir in pairs(parent_directories) do
if redis.call("hget", "rs_meta:"..user..":"..dir.."/", "etag") then if redis.call("hget", "rsm:"..user..":"..dir.."/", "etag") 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", "rs_meta:"..user..":"..dir, "etag") then if redis.call("hget", "rsm:"..user..":"..dir, "etag") then
return true return true
end end
end end
@ -401,9 +401,9 @@ module RemoteStorage
end end
def update_metadata_object(user, directory, key, metadata) def update_metadata_object(user, directory, key, metadata)
redis_key = "rs_meta:#{user}:#{directory}/#{key}" redis_key = "rsm:#{user}:#{directory}/#{key}"
redis.hmset(redis_key, *metadata) redis.hmset(redis_key, *metadata)
redis.sadd "rs_meta:#{user}:#{directory}/:items", key redis.sadd "rsm:#{user}:#{directory}/:i", key
true true
end end
@ -418,10 +418,10 @@ module RemoteStorage
etag = etag_for(get_response.body) etag = etag_for(get_response.body)
end end
key = "rs_meta:#{user}:#{dir}/" key = "rsm:#{user}:#{dir}/"
metadata = {etag: etag, modified: timestamp} metadata = {etag: etag, modified: timestamp}
redis.hmset(key, *metadata) redis.hmset(key, *metadata)
redis.sadd "rs_meta:#{user}:#{parent_directory_for(dir)}:items", "#{top_directory(dir)}/" redis.sadd "rsm:#{user}:#{parent_directory_for(dir)}:i", "#{top_directory(dir)}/"
end end
true true
@ -436,9 +436,9 @@ module RemoteStorage
end end
def delete_metadata_objects(user, directory, key) def delete_metadata_objects(user, directory, key)
redis_key = "rs_meta:#{user}:#{directory}/#{key}" redis_key = "rsm:#{user}:#{directory}/#{key}"
redis.del(redis_key) redis.del(redis_key)
redis.srem "rs_meta:#{user}:#{directory}/:items", key redis.srem "rsm:#{user}:#{directory}/:i", key
end end
def delete_dir_objects(user, directory) def delete_dir_objects(user, directory)
@ -449,8 +449,8 @@ module RemoteStorage
unless dir == "" unless dir == ""
do_delete_request("#{url_for_directory(user, dir)}/") do_delete_request("#{url_for_directory(user, dir)}/")
end end
redis.del "rs_meta:#{user}:#{directory}/" redis.del "rsm:#{user}:#{directory}/"
redis.srem "rs_meta:#{user}:#{parent_directory_for(dir)}:items", "#{dir}/" redis.srem "rsm:#{user}:#{parent_directory_for(dir)}:i", "#{dir}/"
else else
unless dir == "" unless dir == ""
res = do_put_request("#{url_for_directory(user, dir)}/", timestamp.to_s, "text/plain") res = do_put_request("#{url_for_directory(user, dir)}/", timestamp.to_s, "text/plain")
@ -460,14 +460,14 @@ module RemoteStorage
etag = etag_for(get_response.body) etag = etag_for(get_response.body)
end end
metadata = {etag: etag, modified: timestamp} metadata = {etag: etag, modified: timestamp}
redis.hmset("rs_meta:#{user}:#{dir}/", *metadata) redis.hmset("rsm:#{user}:#{dir}/", *metadata)
end end
end end
end end
def dir_empty?(user, dir) def dir_empty?(user, dir)
if directory_backend(user).match(/new/) if directory_backend(user).match(/new/)
redis.smembers("rs_meta:#{user}:#{dir}/:items").empty? redis.smembers("rsm:#{user}:#{dir}/:i").empty?
else else
do_get_request("#{container_url_for(user)}/?format=plain&limit=1&path=#{escape(dir)}/") do |res| do_get_request("#{container_url_for(user)}/?format=plain&limit=1&path=#{escape(dir)}/") do |res|
return res.headers[:content_length] == "0" return res.headers[:content_length] == "0"

View File

@ -85,13 +85,13 @@ class Migrator
end end
def add_item_to_parent_dir(dir, item) def add_item_to_parent_dir(dir, item)
key = "rs_meta:#{username}:#{parent_directory_for(dir)}:items" key = "rsm:#{username}:#{parent_directory_for(dir)}:i"
logger.debug "Adding item #{item} to #{key}" logger.debug "Adding item #{item} to #{key}"
redis.sadd(key, item) unless dry_run redis.sadd(key, item) unless dry_run
end end
def save_directory_data(dir, item, data, timestamp) def save_directory_data(dir, item, data, timestamp)
key = "rs_meta:#{username}:#{dir.gsub(/^\//, "")}#{item}" key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}"
metadata = { metadata = {
etag: data["ETag"], etag: data["ETag"],
modified: timestamp_for(data["Last-Modified"]) modified: timestamp_for(data["Last-Modified"])
@ -102,7 +102,7 @@ class Migrator
end end
def save_document_data(dir, item, data) def save_document_data(dir, item, data)
key = "rs_meta:#{username}:#{dir.gsub(/^\//, "")}#{item}" key = "rsm:#{username}:#{dir.gsub(/^\//, "")}#{item}"
metadata = { metadata = {
etag: data["ETag"], etag: data["ETag"],
size: data["Content-Length"], size: data["Content-Length"],

View File

@ -31,7 +31,7 @@ describe "App" do
put "/phil/food/aguacate", "si" put "/phil/food/aguacate", "si"
end end
metadata = redis.hgetall "rs_meta:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata["size"].must_equal "2" metadata["size"].must_equal "2"
metadata["type"].must_equal "text/plain; charset=utf-8" metadata["type"].must_equal "text/plain; charset=utf-8"
metadata["etag"].must_equal "bla" metadata["etag"].must_equal "bla"
@ -50,20 +50,20 @@ describe "App" do
end end
end end
metadata = redis.hgetall "rs_meta:phil:/" metadata = redis.hgetall "rsm:phil:/"
metadata["etag"].must_equal "rootetag" metadata["etag"].must_equal "rootetag"
metadata["modified"].length.must_equal 13 metadata["modified"].length.must_equal 13
metadata = redis.hgetall "rs_meta:phil:food/" metadata = redis.hgetall "rsm:phil:food/"
metadata["etag"].must_equal "bla" metadata["etag"].must_equal "bla"
metadata["modified"].length.must_equal 13 metadata["modified"].length.must_equal 13
food_items = redis.smembers "rs_meta:phil:food/:items" food_items = redis.smembers "rsm:phil:food/:i"
food_items.each do |food_item| food_items.each do |food_item|
["camaron", "aguacate"].must_include food_item ["camaron", "aguacate"].must_include food_item
end end
root_items = redis.smembers "rs_meta:phil:/:items" root_items = redis.smembers "rsm:phil:/:i"
root_items.must_equal ["food/"] root_items.must_equal ["food/"]
end end
@ -81,7 +81,7 @@ describe "App" do
last_response.status.must_equal 200 last_response.status.must_equal 200
metadata = redis.hgetall "rs_meta:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata["size"].must_equal "2" metadata["size"].must_equal "2"
end end
@ -94,7 +94,7 @@ describe "App" do
last_response.status.must_equal 409 last_response.status.must_equal 409
metadata = redis.hgetall "rs_meta:phil:food" metadata = redis.hgetall "rsm:phil:food"
metadata.must_be_empty metadata.must_be_empty
end end
@ -107,7 +107,7 @@ describe "App" do
last_response.status.must_equal 409 last_response.status.must_equal 409
metadata = redis.hgetall "rs_meta:phil:food/aguacate/empanado" metadata = redis.hgetall "rsm:phil:food/aguacate/empanado"
metadata.must_be_empty metadata.must_be_empty
end end
end end
@ -123,7 +123,7 @@ describe "App" do
last_response.status.must_equal 503 last_response.status.must_equal 503
metadata = redis.hgetall "rs_meta:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata.must_be_empty metadata.must_be_empty
end end
end end
@ -138,7 +138,7 @@ describe "App" do
last_response.status.must_equal 503 last_response.status.must_equal 503
metadata = redis.hgetall "rs_meta:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata.must_be_empty metadata.must_be_empty
end end
end end
@ -178,12 +178,12 @@ describe "App" do
end end
end end
metadata = redis.hgetall "rs_meta:phil:food/aguacate" metadata = redis.hgetall "rsm:phil:food/aguacate"
metadata.must_be_empty metadata.must_be_empty
end end
it "deletes the directory objects metadata in redis" do it "deletes the directory objects metadata in redis" do
old_metadata = redis.hgetall "rs_meta:phil:food/" old_metadata = redis.hgetall "rsm:phil:food/"
put_stub = OpenStruct.new(headers: {etag: "newetag"}) put_stub = OpenStruct.new(headers: {etag: "newetag"})
get_stub = OpenStruct.new(body: "rootbody") get_stub = OpenStruct.new(body: "rootbody")
@ -197,15 +197,15 @@ describe "App" do
end end
end end
metadata = redis.hgetall "rs_meta:phil:food/" metadata = redis.hgetall "rsm:phil:food/"
metadata["etag"].must_equal "newetag" metadata["etag"].must_equal "newetag"
metadata["modified"].length.must_equal 13 metadata["modified"].length.must_equal 13
metadata["modified"].wont_equal old_metadata["modified"] metadata["modified"].wont_equal old_metadata["modified"]
food_items = redis.smembers "rs_meta:phil:food/:items" food_items = redis.smembers "rsm:phil:food/:i"
food_items.must_equal ["camaron"] food_items.must_equal ["camaron"]
root_items = redis.smembers "rs_meta:phil:/:items" root_items = redis.smembers "rsm:phil:/:i"
root_items.must_equal ["food/"] root_items.must_equal ["food/"]
end end
@ -223,13 +223,13 @@ describe "App" do
end end
end end
metadata = redis.hgetall "rs_meta:phil:food/" metadata = redis.hgetall "rsm:phil:food/"
metadata.must_be_empty metadata.must_be_empty
food_items = redis.smembers "rs_meta:phil:food/:items" food_items = redis.smembers "rsm:phil:food/:i"
food_items.must_be_empty food_items.must_be_empty
root_items = redis.smembers "rs_meta:phil:/:items" root_items = redis.smembers "rsm:phil:/:i"
root_items.must_be_empty root_items.must_be_empty
end end
end end