sohm 0.10.1 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 859ccb91894c9f987316960595b6fe50084b5755
4
- data.tar.gz: 4fddfad5a05999a99dc46fc65df4e36405ef582e
3
+ metadata.gz: 39fb619f570ad3f62832bbcdd996cdc69415be89
4
+ data.tar.gz: f41f415ad11975dac2524514ad4cbc37cefe850f
5
5
  SHA512:
6
- metadata.gz: 219278de40db8ec365bc2fbfe553bcda87dd08407c200e6ad200f0d3b66ed94d24a67ca4baf8f5a04e4a3c25ea473c23eda6530b4d9ad048ff36bc15ec7a8993
7
- data.tar.gz: dfbd6ab50d8e91b0eb77ccff049d93fdb063a16b71e76477366ae5754789040d8fe94f7bf672024d6feb725087e574b92577e456b3bc53d1d1e5804e6fadc219
6
+ metadata.gz: 9d9ed24c9db23f038e4df3f68a2f674668b08f29358266891e4d925799be03efee441910de76a9e61a05213e516287ec9bd07ba26f4dfb9766914ef639c2d5de
7
+ data.tar.gz: a2a0b78bb3e19a8af9a798059b0bdd80a183482358d997790c77331bf8b303d7fe1961204a578b4659102d0cced8d26b0a6b033faeb9985004ffb1b7eb250425
@@ -6,7 +6,8 @@ if (not ctoken) or ctoken == ARGV[2] then
6
6
  else
7
7
  ntoken = tonumber(ctoken) + 1
8
8
  end
9
- redis.call('HMSET', KEYS[1], '_sdata', ARGV[1], '_cas', ntoken)
9
+ redis.call('HMSET', KEYS[1], '_sdata', ARGV[1],
10
+ '_cas', ntoken, '_ndata', ARGV[3])
10
11
  return ntoken
11
12
  else
12
13
  error('cas_error')
data/lib/sohm.rb CHANGED
@@ -108,6 +108,19 @@ module Sohm
108
108
  @mutex
109
109
  end
110
110
 
111
+ # If this is true, Sohm::Model#save would refresh all indices inline
112
+ # when called, this might hurt performance in certain cases. You can
113
+ # use this flag here to disable this inline refreshing, then use external
114
+ # background workers to refresh indices by calling Sohm::Model#refresh_indices
115
+ @refresh_indices_inline = true
116
+ def self.refresh_indices_inline=(flag)
117
+ @refresh_indices_inline = flag
118
+ end
119
+
120
+ def self.refresh_indices_inline
121
+ @refresh_indices_inline
122
+ end
123
+
111
124
  # By default, EVALSHA is used
112
125
  def self.enable_evalsha
113
126
  defined?(@enable_evalsha) ? @enable_evalsha : true
@@ -1060,7 +1073,8 @@ module Sohm
1060
1073
  if serial_attributes_changed
1061
1074
  response = script(LUA_SAVE, 1, key,
1062
1075
  sanitize_attributes(serial_attributes).to_msgpack,
1063
- cas_token)
1076
+ cas_token,
1077
+ sanitize_attributes(attributes).to_msgpack)
1064
1078
 
1065
1079
  if response.is_a?(RuntimeError)
1066
1080
  if response.message =~ /cas_error/
@@ -1072,16 +1086,62 @@ module Sohm
1072
1086
 
1073
1087
  @cas_token = response
1074
1088
  @serial_attributes_changed = false
1089
+ else
1090
+ redis.call("HSET", key, "_ndata",
1091
+ sanitize_attributes(attributes).to_msgpack)
1075
1092
  end
1076
1093
 
1077
- redis.call("HSET", key, "_ndata",
1078
- sanitize_attributes(attributes).to_msgpack)
1079
-
1080
- refresh_indices
1094
+ if Sohm.refresh_indices_inline
1095
+ refresh_indices
1096
+ end
1081
1097
 
1082
1098
  return self
1083
1099
  end
1084
1100
 
1101
+ # Refresh model indices
1102
+ def refresh_indices
1103
+ memo_key = key["_indices"]
1104
+ # Add new indices first
1105
+ commands = fetch_indices.each_pair.map do |field, vals|
1106
+ vals.map do |val|
1107
+ index_key = model.key["_indices"][field][val]
1108
+ [["SADD", memo_key, index_key], ["SADD", index_key, id]]
1109
+ end
1110
+ end.flatten(2)
1111
+
1112
+ model.synchronize do
1113
+ commands.each do |command|
1114
+ redis.queue(*command)
1115
+ end
1116
+ redis.commit
1117
+ end
1118
+
1119
+ # Remove old indices
1120
+ index_set = ::Set.new(redis.call("SMEMBERS", memo_key))
1121
+ # Here we are fetching the latest model to avoid concurrency issue
1122
+ valid_list = model[id].send(:fetch_indices).each_pair.map do |field, vals|
1123
+ vals.map do |val|
1124
+ model.key["_indices"][field][val]
1125
+ end
1126
+ end.flatten(1)
1127
+ valid_set = ::Set.new(valid_list)
1128
+ diff_set = index_set - valid_set
1129
+ if diff_set.size > 0
1130
+ diff_list = diff_set.to_a
1131
+ commands = diff_list.map do |key|
1132
+ ["SREM", key, id]
1133
+ end + [["SREM", memo_key] + diff_list]
1134
+
1135
+ model.synchronize do
1136
+ commands.each do |command|
1137
+ redis.queue(*command)
1138
+ end
1139
+ redis.commit
1140
+ end
1141
+ end
1142
+ true
1143
+ end
1144
+
1085
1145
  # Delete the model, including all the following keys:
1086
1146
  #
1087
1147
  # - <Model>:<id>
@@ -1215,48 +1275,6 @@ module Sohm
1215
1275
  indices
1216
1276
  end
1217
1277
 
1218
- # This is performed asynchronously
1219
- def refresh_indices
1220
- memo_key = key["_indices"]
1221
- # Add new indices first
1222
- commands = fetch_indices.each_pair.map do |field, vals|
1223
- vals.map do |val|
1224
- index_key = model.key["_indices"][field][val]
1225
- [["SADD", memo_key, index_key], ["SADD", index_key, id]]
1226
- end
1227
- end.flatten(2)
1228
-
1229
- # TODO: Think about switching to a redis pool later
1230
- model.synchronize do
1231
- commands.each do |command|
1232
- redis.queue(*command)
1233
- end
1234
- redis.commit
1235
- end
1236
-
1237
- # Remove old indices
1238
- # TODO: we can do this asynchronously, or maybe in a background queue
1239
- index_set = ::Set.new(redis.call("SMEMBERS", memo_key))
1240
- valid_list = model[id].send(:fetch_indices).each_pair.map do |field, vals|
1241
- vals.map do |val|
1242
- model.key["_indices"][field][val]
1243
- end
1244
- end.flatten(1)
1245
- valid_set = ::Set.new(valid_list)
1246
- diff_set = index_set - valid_set
1247
- diff_list = diff_set.to_a
1248
- commands = diff_list.map do |key|
1249
- ["SREM", key, id]
1250
- end + [["SREM", memo_key] + diff_list]
1251
-
1252
- model.synchronize do
1253
- commands.each do |command|
1254
- redis.queue(*command)
1255
- end
1256
- redis.commit
1257
- end
1258
- end
1259
-
1260
1278
  # Unpack hash returned by redis, which contains _cas, _sdata, _ndata
1261
1279
  # columns
1262
1280
  def unpack_attrs(attrs)
data/sohm.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "sohm"
3
- s.version = "0.10.1"
3
+ s.version = "0.10.2"
4
4
  s.summary = %{Slim ohm for twemproxy-like system}
5
5
  s.description = %Q{Slim ohm is a forked ohm that works with twemproxy-like redis system, only a limited set of features in ohm is supported}
6
6
  s.authors = ["Xuejie Xiao"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sohm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xuejie Xiao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-11 00:00:00.000000000 Z
11
+ date: 2015-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redic