Fixed - getBuckets().set() method throws CROSSSLOT #3810

pull/3826/head
Nikita Koksharov 4 years ago
parent 402d4cf851
commit c875cc3003

@ -127,17 +127,30 @@ public class RedissonBuckets implements RBuckets {
return RedissonPromise.newSucceededFuture(null);
}
List<Object> params = new ArrayList<Object>(buckets.size());
for (Entry<String, ?> entry : buckets.entrySet()) {
params.add(entry.getKey());
try {
params.add(codec.getValueEncoder().encode(entry.getValue()));
} catch (IOException e) {
throw new IllegalArgumentException(e);
return commandExecutor.writeBatchedAsync(codec, RedisCommands.MSET, new SlotCallback<Void, Void>() {
@Override
public void onSlotResult(Void result) {
}
@Override
public Void onFinish() {
return null;
}
}
return commandExecutor.writeAsync(params.get(0).toString(), RedisCommands.MSET, params.toArray());
@Override
public Object[] createParams(List<String> keys) {
List<Object> params = new ArrayList<>(keys.size());
for (String key : keys) {
params.add(key);
try {
params.add(codec.getValueEncoder().encode(buckets.get(key)));
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
return params.toArray();
}
}, buckets.keySet().toArray(new String[]{}));
}
}

@ -28,10 +28,14 @@ import java.util.List;
*/
public interface SlotCallback<T, R> {
default RedisCommand<T> createCommand(List<String> param) {
default RedisCommand<T> createCommand(List<String> params) {
return null;
}
default Object[] createParams(List<String> params) {
return params.toArray();
}
void onSlotResult(T result);
R onFinish();

@ -651,10 +651,10 @@ public class CommandAsyncService implements CommandAsyncExecutor {
c = newCommand;
}
if (readOnly) {
RFuture<T> f = executorService.readAsync(entry.getKey(), codec, c, groupedKeys.toArray());
RFuture<T> f = executorService.readAsync(entry.getKey(), codec, c, callback.createParams(groupedKeys));
f.onComplete(listener);
} else {
RFuture<T> f = executorService.writeAsync(entry.getKey(), codec, c, groupedKeys.toArray());
RFuture<T> f = executorService.writeAsync(entry.getKey(), codec, c, callback.createParams(groupedKeys));
f.onComplete(listener);
}
}

@ -45,12 +45,12 @@ public class RedissonBucketsTest extends BaseTest {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < 10; i++) {
map.put("test" + i, i);
redisson.getBucket("test" + i).set(i);
}
for (int i = 10; i < size; i++) {
map.put("test" + i + "{" + (i%100)+ "}", i);
redisson.getBucket("test" + i + "{" + (i%100)+ "}").set(i);
}
redisson.getBuckets().set(map);
Set<String> queryKeys = new HashSet<>(map.keySet());
queryKeys.add("test_invalid");

Loading…
Cancel
Save