Aerospike client has scanAll method for reading all rows from it's store. I use it in the folowing code:
ScanPolicy policy = new ScanPolicy();
policy.concurrentNodes = true;
policy.priority = Priority.DEFAULT;
policy.includeBinData = true;
policy.scanPercent = 100;
client.scanAll(policy, "namespaceName", "setName", new ScanCallback() {
@Override
public void scanCallback(Key key, Record record) throws AerospikeException {
STORE.put(key.userKey.toLong(), record.getValue("binName").toString());
}
});
But it is finished with NullPointerException
, because userKey is null. All other fields are valid as expected. User key is the Long value, that was used for saving data:
client.put(writePolicy, new Key("namespaceName", "setName", userKey), new Bin("binName", value));
All is fine, if I do single request like this:
client.get(readPolicy, new Key("namespaceName", "setName", userKey));
What may be wrong? Why userKey is null?
I too have faced this problem even at the time of writing we were setting the WritePolicy.sendkeys=true.
After 2-3 days debugging found that there were some issue with aerospike client version. Initially i were using 3.0.25 but after upgrading it to 3.0.35 it started working fine.
Aerospike uses key and set name to generate unique digest, So it stores only digest.
While inserting one record if you set
writePolicy.sendKey = true
then key will be stored as metadata of record. If one record is inserted withwritePolicy.sendKey = true
then only you will get key in scanCallback().By default writePolicy.sendKey is false, so by default
scanCallback()
gets null as key. Thats why yourkey.userKey.toLong()
gives NullPointerException.