Skip to content

Commit

Permalink
Merge pull request #1421 from fatkodima/memcache-client-to-dalli
Browse files Browse the repository at this point in the history
Deprecate Rack::Session::Memcache in favor of Rack::Session::Dalli from dalli gem
  • Loading branch information
rafaelfranca committed Dec 4, 2019
2 parents 04467b2 + 5460077 commit d6668ee
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 416 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Expand Up @@ -20,7 +20,7 @@ gem "rubocop", "0.68.1", require: false

group :extra do
gem 'fcgi', platforms: c_platforms
gem 'memcache-client'
gem 'dalli'
gem 'thin', platforms: c_platforms
end

Expand Down
4 changes: 2 additions & 2 deletions README.rdoc
Expand Up @@ -145,11 +145,11 @@ installation and bacon.
To run the test suite completely, you need:

* fcgi
* memcache-client
* dalli
* thin

To test Memcache sessions, you need memcached (will be
run on port 11211) and memcache-client installed.
run on port 11211) and dalli installed.

== Configuration

Expand Down
94 changes: 3 additions & 91 deletions lib/rack/session/memcache.rb
@@ -1,98 +1,10 @@
# frozen_string_literal: true

# AUTHOR: blink <blinketje@gmail.com>; blink#ruby-lang@irc.freenode.net

require 'rack/session/abstract/id'
require 'memcache'
require 'rack/core_ext/regexp'
require 'rack/session/dalli'

module Rack
module Session
# Rack::Session::Memcache provides simple cookie based session management.
# Session data is stored in memcached. The corresponding session key is
# maintained in the cookie.
# You may treat Session::Memcache as you would Session::Pool with the
# following caveats.
#
# * Setting :expire_after to 0 would note to the Memcache server to hang
# onto the session data until it would drop it according to it's own
# specifications. However, the cookie sent to the client would expire
# immediately.
#
# Note that memcache does drop data before it may be listed to expire. For
# a full description of behaviour, please see memcache's documentation.

class Memcache < Abstract::ID
using ::Rack::RegexpExtensions

attr_reader :mutex, :pool

DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge \
namespace: 'rack:session',
memcache_server: 'localhost:11211'

def initialize(app, options = {})
super

@mutex = Mutex.new
mserv = @default_options[:memcache_server]
mopts = @default_options.reject{|k, v| !MemCache::DEFAULT_OPTIONS.include? k }

@pool = options[:cache] || MemCache.new(mserv, mopts)
unless @pool.active? and @pool.servers.any?(&:alive?)
raise 'No memcache servers'
end
end

def generate_sid
loop do
sid = super
break sid unless @pool.get(sid, true)
end
end

def get_session(env, sid)
with_lock(env) do
unless sid and session = @pool.get(sid)
sid, session = generate_sid, {}
unless /^STORED/.match?(@pool.add(sid, session))
raise "Session collision on '#{sid.inspect}'"
end
end
[sid, session]
end
end

def set_session(env, session_id, new_session, options)
expiry = options[:expire_after]
expiry = expiry.nil? ? 0 : expiry + 1

with_lock(env) do
@pool.set session_id, new_session, expiry
session_id
end
end

def destroy_session(env, session_id, options)
with_lock(env) do
@pool.delete(session_id)
generate_sid unless options[:drop]
end
end

def with_lock(env)
@mutex.lock if env[RACK_MULTITHREAD]
yield
rescue MemCache::MemCacheError, Errno::ECONNREFUSED
if $VERBOSE
warn "#{self} is unable to find memcached server."
warn $!.inspect
end
raise
ensure
@mutex.unlock if @mutex.locked?
end

end
warn "Rack::Session::Memcache is deprecated, please use Rack::Session::Dalli from 'dalli' gem instead."
Memcache = Dalli
end
end

0 comments on commit d6668ee

Please sign in to comment.