Module: Dogtag

Extended by:
Mixins::Redis
Defined in:
lib/dogtag.rb,
lib/dogtag/id.rb,
lib/dogtag/request.rb,
lib/dogtag/version.rb,
lib/dogtag/response.rb,
lib/dogtag/generator.rb,
lib/dogtag/timestamp.rb,
lib/dogtag/lua_script.rb,
lib/dogtag/mixins/redis.rb

Defined Under Namespace

Modules: LuaScript, Mixins Classes: Generator, Id, Request, Response, Timestamp

Constant Summary collapse

CUSTOM_EPOCH =

in milliseconds

1483228800000
TIMESTAMP_BITS =
40
LOGICAL_SHARD_ID_BITS =
5
DATA_TYPE_BITS =
8
SEQUENCE_BITS =
10
MIN_LOGICAL_SHARD_ID =
0
MAX_LOGICAL_SHARD_ID =
~(-1 << LOGICAL_SHARD_ID_BITS)
LOGICAL_SHARD_ID_ALLOWED_RANGE =
(MIN_LOGICAL_SHARD_ID..MAX_LOGICAL_SHARD_ID).freeze
MIN_DATA_TYPE =
0
MAX_DATA_TYPE =
~(-1 << DATA_TYPE_BITS)
DATA_TYPE_ALLOWED_RANGE =
(MIN_DATA_TYPE..MAX_DATA_TYPE).freeze
MAX_SEQUENCE =
~(-1 << SEQUENCE_BITS)
SEQUENCE_SHIFT =
0
DATA_TYPE_SHIFT =
SEQUENCE_BITS
LOGICAL_SHARD_ID_SHIFT =
SEQUENCE_BITS + DATA_TYPE_BITS
TIMESTAMP_SHIFT =
SEQUENCE_BITS + DATA_TYPE_BITS + LOGICAL_SHARD_ID_BITS
LOGICAL_SHARD_ID_RANGE_KEY =
'dogtag-generator-logical-shard-id-range'.freeze
VERSION =
'1.2.0'.freeze

Constants included from Mixins::Redis

Mixins::Redis::DEFAULT_REDIS_URL

Class Method Summary collapse

Methods included from Mixins::Redis

redis

Class Method Details

.generate_id(data_type) ⇒ Object



49
50
51
# File 'lib/dogtag.rb', line 49

def self.generate_id(data_type)
  Generator.new(data_type, 1).ids.first
end

.generate_ids(data_type, count) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/dogtag.rb', line 53

def self.generate_ids(data_type, count)
  ids = []

  # The Lua script can't always return as many IDs as you may want. So we loop
  # until we have the exact amount.
  while ids.length < count
    initial_id_count = ids.length
    ids += Generator.new(data_type, count - ids.length).ids

    # Ensure the ids array keeps growing as infinite loop insurance
    return ids unless ids.length > initial_id_count
  end

  ids
end

.logical_shard_id_range=(logical_shard_id_range) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/dogtag.rb', line 31

def self.logical_shard_id_range=(logical_shard_id_range)
  unless logical_shard_id_range.is_a? Range
    raise ArgumentError, 'logical_shard_id_range must be a range'
  end

  unless (Dogtag::LOGICAL_SHARD_ID_ALLOWED_RANGE.to_a & logical_shard_id_range.to_a) == logical_shard_id_range.to_a
    raise ArgumentError, "logical_shard_id_range is outside the allowed range of #{Dogtag::LOGICAL_SHARD_ID_ALLOWED_RANGE}"
  end

  if redis.exists LOGICAL_SHARD_ID_RANGE_KEY
    redis.lset LOGICAL_SHARD_ID_RANGE_KEY, 0, logical_shard_id_range.min
    redis.lset LOGICAL_SHARD_ID_RANGE_KEY, 1, logical_shard_id_range.max
  else
    redis.rpush LOGICAL_SHARD_ID_RANGE_KEY, logical_shard_id_range.min
    redis.rpush LOGICAL_SHARD_ID_RANGE_KEY, logical_shard_id_range.max
  end
end