Skip to content

Feat remove record cache #110

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arex-storage-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.41</version>
<version>1.0.42</version>
</parent>

<properties>
Expand Down
2 changes: 1 addition & 1 deletion arex-storage-model/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.41</version>
<version>1.0.42</version>
</parent>

<profiles>
Expand Down
2 changes: 1 addition & 1 deletion arex-storage-web-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.41</version>
<version>1.0.42</version>
</parent>

<profiles>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ <T extends Mocker> boolean putRecordResult(MockCategoryType categoryType, String

int recordResultCount(MockCategoryType category, String recordId);

boolean removeRecordResult(MockCategoryType category, String recordId);

boolean removeReplayResult(MockCategoryType category, String replayResultId);
<T extends Mocker> boolean removeRecordResult(MockCategoryType category, String recordId,
Iterable<T> values);
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,34 +152,55 @@ private boolean shouldRecordCallReplayMax(MockCategoryType category) {
}

@Override
public boolean removeRecordResult(MockCategoryType category, String recordId) {
final int removed;
public <T extends Mocker> boolean removeRecordResult(MockCategoryType category, String recordId, Iterable<T> values) {
int removed = EMPTY_SIZE;
final byte[] recordIdBytes = CacheKeyUtils.toUtf8Bytes(recordId);
byte[] recordCountKey = CacheKeyUtils.buildRecordKey(category, recordId);
removed = removeResult(recordCountKey);
LOGGER.info("remove record result size:{} for category:{},record id:{}", removed, category,
recordId);
return removed > EMPTY_SIZE;
}

@Override
public boolean removeReplayResult(MockCategoryType category, String replayResultId) {
if (StringUtils.isEmpty(replayResultId)) {
return false;
Iterator<T> valueIterator = values.iterator();
while (valueIterator.hasNext()) {
T value = valueIterator.next();
byte[] recordOperationKey = CacheKeyUtils.buildRecordOperationKey(category, recordId,
getOperationNameWithCategory(value, category));
redisCacheProvider.remove(recordOperationKey);
removed += removeResult(category, recordIdBytes, value);
}
final byte[] replayCountKey = CacheKeyUtils.buildReplayKey(category, replayResultId);
int removed = removeResult(replayCountKey);

int count = resultCount(recordCountKey);
if (count > EMPTY_SIZE) {
redisCacheProvider.remove(recordCountKey);
for (int sequence = 1; sequence <= count; sequence++) {
final byte[] resultSequenceKey = createSequenceKey(recordCountKey, sequence);
if (redisCacheProvider.remove(resultSequenceKey)) {
removed++;
}
}
}

LOGGER.info("remove record result size:{} for category:{},record id:{}", removed, category,
recordId);
return removed > EMPTY_SIZE;
}

private int removeResult(final byte[] resultCountKey) {
private <T extends Mocker> int removeResult(MockCategoryType category,
byte[] recordIdBytes, T value) {
int removed = EMPTY_SIZE;
int replayCount = resultCount(resultCountKey);
if (replayCount > EMPTY_SIZE) {
redisCacheProvider.remove(resultCountKey);
}
for (int sequence = 1; sequence <= replayCount; sequence++) {
final byte[] resultSequenceKey = createSequenceKey(resultCountKey, sequence);
if (redisCacheProvider.remove(resultSequenceKey)) {

List<byte[]> mockKeyList = matchKeyFactory.build(value);
for (int i = 0; i < mockKeyList.size(); i++) {
byte[] mockKeyBytes = mockKeyList.get(i);
byte[] key = CacheKeyUtils.buildRecordKey(category, recordIdBytes, mockKeyBytes);
int resultCount = resultCount(key);
if (resultCount <= EMPTY_SIZE) {
continue;
}
for (int sequence = 1; sequence <= resultCount; sequence ++ ) {
byte[] sequenceKey = createSequenceKey(key, sequence);
if (redisCacheProvider.remove(sequenceKey)) {
removed++;
}
}
if (redisCacheProvider.remove(key)) {
removed++;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ public boolean preloadAll(String sourceProvider, String recordId) {
for (MockCategoryType categoryType : providerFactory.getCategoryTypes()) {
boolean curResult = preload(repositoryProvider, categoryType, recordId);
result = curResult || result;
LOGGER.info("preload cache result:{},category:{},record id:{}", curResult, categoryType, recordId);
LOGGER.info("preload cache result:{},category:{},record id:{}", curResult, categoryType,
recordId);
}
return result;
}
Expand Down Expand Up @@ -73,27 +74,42 @@ private boolean preload(List<RepositoryProvider<? extends Mocker>> repositoryRea
return false;
}

public boolean removeAllRecordCache(String recordId) {
public boolean removeAllRecordCache(String recordId, String sourceProvider) {
RepositoryProvider<? extends Mocker> repositoryProvider = providerFactory.findProvider(
sourceProvider);
if (repositoryProvider == null) {
return false;
}
boolean result = false;
for (MockCategoryType categoryType : providerFactory.getCategoryTypes()) {
result = removeRecord(categoryType, recordId);
result = removeRecord(repositoryProvider, categoryType, recordId);
}
return result;
}

public boolean removeRecord(MockCategoryType category, String recordId) {
return mockResultProvider.removeRecordResult(category, recordId);
}

public boolean removeAllResultCache(String resultId) {
boolean result = false;
for (MockCategoryType categoryType : providerFactory.getCategoryTypes()) {
result = removeResult(categoryType, resultId);
public boolean removeRecord(RepositoryProvider<? extends Mocker> repositoryReader,
MockCategoryType category, String recordId) {
if (repositoryReader == null) {
return false;
}
return result;
if (mockResultProvider.recordResultCount(category, recordId) <= 0) {
LOGGER.warn("skip remove cache for category:{},record id:{}", category, recordId);
return true;
}
Iterable<? extends Mocker> iterable;
iterable = repositoryReader.queryRecordList(category, recordId);
if (iterable == null) {
return false;
}
return mockResultProvider.removeRecordResult(category, recordId, iterable);
}

public boolean removeResult(MockCategoryType category, String resultId) {
return mockResultProvider.removeReplayResult(category, resultId);
public boolean removeRecord(String sourceProvider, MockCategoryType category, String recordId) {
RepositoryProvider<? extends Mocker> repositoryProvider = providerFactory.findProvider(
sourceProvider);
if (repositoryProvider == null) {
return false;
}
return removeRecord(repositoryProvider, category, recordId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ public Response update(@RequestHeader String srcProviderName, @RequestBody AREXM
try {
boolean updateResult = editableService.update(srcProviderName, body);
if (updateResult) {
storageCache.removeRecord(category, body.getRecordId());
storageCache.removeRecord(srcProviderName, category, body.getRecordId());
}
LOGGER.info("update record result:{},category:{},uniqueId:{}", updateResult, category,
body.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ public Response cacheRemove(@RequestBody QueryMockCacheRequestType requestType)
}
MDCTracer.addRecordId(recordId);
try {
return toResponse(prepareMockResultService.removeAllRecordCache(recordId));
return toResponse(prepareMockResultService.removeAllRecordCache(recordId, requestType.getSourceProvider()));
} catch (Throwable throwable) {
LOGGER.error("QueryMockCache error:{},request:{}", throwable.getMessage(), requestType);
return ResponseUtils.exceptionResponse(throwable.getMessage());
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -403,5 +403,5 @@
<url>https://github.com/arextest/arex-storage</url>


<version>1.0.41</version>
<version>1.0.42</version>
</project>