Fix Collection Support for Cache for non-Collection Server. (#1418)
Also fix test setup index flakiness on older servers. Closes #1417.
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package org.springframework.data.couchbase.cache;
|
package org.springframework.data.couchbase.cache;
|
||||||
|
|
||||||
|
import static com.couchbase.client.core.io.CollectionIdentifier.DEFAULT_COLLECTION;
|
||||||
|
import static com.couchbase.client.core.io.CollectionIdentifier.DEFAULT_SCOPE;
|
||||||
import static com.couchbase.client.java.kv.GetOptions.*;
|
import static com.couchbase.client.java.kv.GetOptions.*;
|
||||||
import static com.couchbase.client.java.kv.InsertOptions.*;
|
import static com.couchbase.client.java.kv.InsertOptions.*;
|
||||||
import static com.couchbase.client.java.kv.UpsertOptions.*;
|
import static com.couchbase.client.java.kv.UpsertOptions.*;
|
||||||
@@ -28,7 +30,6 @@ import org.springframework.data.couchbase.CouchbaseClientFactory;
|
|||||||
|
|
||||||
import com.couchbase.client.core.error.DocumentExistsException;
|
import com.couchbase.client.core.error.DocumentExistsException;
|
||||||
import com.couchbase.client.core.error.DocumentNotFoundException;
|
import com.couchbase.client.core.error.DocumentNotFoundException;
|
||||||
import com.couchbase.client.core.io.CollectionIdentifier;
|
|
||||||
import com.couchbase.client.java.Collection;
|
import com.couchbase.client.java.Collection;
|
||||||
import com.couchbase.client.java.Scope;
|
import com.couchbase.client.java.Scope;
|
||||||
import com.couchbase.client.java.codec.Transcoder;
|
import com.couchbase.client.java.codec.Transcoder;
|
||||||
@@ -104,20 +105,35 @@ public class DefaultCouchbaseCacheWriter implements CouchbaseCacheWriter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long clear(final String collectionName, final String pattern) {
|
public long clear(final String collectionName, final String pattern) {
|
||||||
QueryResult result = clientFactory.getScope().query(
|
QueryResult result;
|
||||||
"DELETE FROM `" + getCollection(collectionName).name() + "` where meta().id LIKE $pattern",
|
if (getScope() == null
|
||||||
queryOptions().scanConsistency(REQUEST_PLUS).metrics(true).parameters(JsonObject.create().put("pattern", pattern + "%")));
|
|| (DEFAULT_SCOPE.equals(getScope().name()) && DEFAULT_COLLECTION.equals(getCollection(collectionName).name()))) {
|
||||||
|
result = clientFactory.getCluster().query(
|
||||||
|
"DELETE FROM `" + clientFactory.getBucket().name() + "` where meta().id LIKE $pattern",
|
||||||
|
queryOptions().scanConsistency(REQUEST_PLUS).metrics(true)
|
||||||
|
.parameters(JsonObject.create().put("pattern", pattern + "%")));
|
||||||
|
} else {
|
||||||
|
result = clientFactory.getScope().query(
|
||||||
|
"DELETE FROM `" + getCollection(collectionName).name() + "` where meta().id LIKE $pattern",
|
||||||
|
queryOptions().scanConsistency(REQUEST_PLUS).metrics(true)
|
||||||
|
.parameters(JsonObject.create().put("pattern", pattern + "%")));
|
||||||
|
}
|
||||||
return result.metaData().metrics().map(QueryMetrics::mutationCount).orElse(0L);
|
return result.metaData().metrics().map(QueryMetrics::mutationCount).orElse(0L);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection getCollection(final String collectionName) {
|
private Collection getCollection(final String collectionName) {
|
||||||
final Scope scope = clientFactory.getScope();
|
final Scope scope = clientFactory.getScope();
|
||||||
if (collectionName == null) {
|
if (collectionName == null) {
|
||||||
if (!scope.name().equals(CollectionIdentifier.DEFAULT_SCOPE)) {
|
if (!scope.name().equals(DEFAULT_SCOPE)) {
|
||||||
throw new IllegalStateException("A collectionName must be provided if a non-default scope is used!");
|
throw new IllegalStateException("A collectionName must be provided if a non-default scope is used!");
|
||||||
}
|
}
|
||||||
return clientFactory.getBucket().defaultCollection();
|
return clientFactory.getBucket().defaultCollection();
|
||||||
}
|
}
|
||||||
return scope.collection(collectionName);
|
return scope.collection(collectionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Scope getScope() {
|
||||||
|
return clientFactory.getScope();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMP
|
|||||||
import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_TEMPLATE;
|
import static org.springframework.data.couchbase.config.BeanNames.REACTIVE_COUCHBASE_TEMPLATE;
|
||||||
import static org.springframework.data.couchbase.util.Util.waitUntilCondition;
|
import static org.springframework.data.couchbase.util.Util.waitUntilCondition;
|
||||||
|
|
||||||
|
import com.couchbase.client.core.retry.BestEffortRetryStrategy;
|
||||||
|
import com.couchbase.client.core.retry.RetryStrategy;
|
||||||
import okhttp3.Credentials;
|
import okhttp3.Credentials;
|
||||||
import okhttp3.FormBody;
|
import okhttp3.FormBody;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
@@ -161,10 +163,27 @@ public class JavaIntegrationTests extends ClusterAwareIntegrationTests {
|
|||||||
|
|
||||||
// the call to createPrimaryIndex takes about 60 seconds
|
// the call to createPrimaryIndex takes about 60 seconds
|
||||||
|
|
||||||
try {
|
// sometimes fails with :
|
||||||
block(createPrimaryIndex(cluster, config().bucketname(), scopeName, collectionName));
|
// com.couchbase.client.core.error.IndexFailureException: The server reported an issue with the underlying index
|
||||||
} catch (Exception e) {
|
// {"completed":true,"coreId":"0xbbef22aa00000003","errors":[{"code":12003,"message":"Keyspace not found in CB
|
||||||
e.printStackTrace();
|
// datastore: default:cfc84bb8-ab0e-433e-a1af-812d51fa8855.my_scope.my_collection2","retry":false}],
|
||||||
|
// "httpStatus":500,"idempotent":false,"lastDispatchedFrom":"127.0.0.1:49908","lastDispatchedTo":"127.0.0.1:8093",
|
||||||
|
// "requestId":58,"requestType":"QueryRequest","retried":0,"service":
|
||||||
|
// {"operationId":"04b28225-2b0f-4d2c-943b-330ac637ecd8","statement":"CREATE PRIMARY INDEX ON
|
||||||
|
// default:`cfc84bb8-ab0e-433e-a1af-812d51fa8855`.`my_scope`.`my_collection2`","type":"query"},
|
||||||
|
// "timeoutMs":300000,"timings":{"dispatchMicros":746,"totalDispatchMicros":746,"totalMicros":1636}}
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
try {
|
||||||
|
sleepMs(100);
|
||||||
|
block(createPrimaryIndex(cluster, config().bucketname(), scopeName, collectionName));
|
||||||
|
break;
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println(e);
|
||||||
|
if (i > 5) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
waitUntilCondition(
|
waitUntilCondition(
|
||||||
@@ -201,7 +220,7 @@ public class JavaIntegrationTests extends ClusterAwareIntegrationTests {
|
|||||||
private static void createAndDeleteBucket() {
|
private static void createAndDeleteBucket() {
|
||||||
final OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS)
|
final OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS)
|
||||||
.readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).build();
|
.readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).build();
|
||||||
String hostPort = connectionString().replace("11210", "8091").replace("11207", "18091");
|
String hostPort = connectionString().split("=")[0].replace("11210", "8091").replace("11207", "18091");
|
||||||
String protocol = hostPort.equals("18091") ? "https" : "http";
|
String protocol = hostPort.equals("18091") ? "https" : "http";
|
||||||
String bucketname = UUID.randomUUID().toString();
|
String bucketname = UUID.randomUUID().toString();
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user