diff --git a/dora/core/client/fs/src/main/java/alluxio/client/file/cache/LocalCacheManager.java b/dora/core/client/fs/src/main/java/alluxio/client/file/cache/LocalCacheManager.java index 4874820581cc..8aa3a1ffcf2c 100644 --- a/dora/core/client/fs/src/main/java/alluxio/client/file/cache/LocalCacheManager.java +++ b/dora/core/client/fs/src/main/java/alluxio/client/file/cache/LocalCacheManager.java @@ -721,6 +721,51 @@ public boolean delete(PageId pageId, boolean isTemporary) { } } + /** + * delete the specified page. Be cautious that this method will return true if the page + * does not exist since the page already gone. + * + * @param pageId page identifier + * @param isTemporary whether is it temporary or not + * @return whether the page is deleted successfully or not + */ + public boolean deletePageIfExists(PageId pageId, boolean isTemporary) { + if (mState.get() != READ_WRITE) { + Metrics.DELETE_NOT_READY_ERRORS.inc(); + Metrics.DELETE_ERRORS.inc(); + return false; + } + ReadWriteLock pageLock = getPageLock(pageId); + try (LockResource r = new LockResource(pageLock.writeLock())) { + PageInfo pageInfo; + try (LockResource r1 = new LockResource(mPageMetaStore.getLock().writeLock())) { + try { + pageInfo = mPageMetaStore.removePage(pageId, isTemporary); + } catch (PageNotFoundException e) { + Metrics.DELETE_NON_EXISTING_PAGE_ERRORS.inc(); + Metrics.DELETE_ERRORS.inc(); + return true; + } + } + boolean ok = true; + try { + pageInfo.getLocalCacheDir().getPageStore().delete(pageInfo.getPageId(), isTemporary); + } catch (IOException e) { + LOG.error("Failed to delete page {} (isTemporary: {}) from pageStore.", + pageInfo.getPageId(), isTemporary, e); + ok = false; + Metrics.DELETE_STORE_DELETE_ERRORS.inc(); + Metrics.DELETE_ERRORS.inc(); + } catch (PageNotFoundException e) { + Metrics.DELETE_NON_EXISTING_PAGE_ERRORS.inc(); + Metrics.DELETE_ERRORS.inc(); + ok = true; + } + LOG.debug("delete({}) exits, success: {}", pageId, ok); + return ok; + } + } + @Override public boolean delete(PageId pageId) { return delete(pageId, false); @@ -921,7 +966,7 @@ public void invalidate(Predicate predicate) { PageInfo pageInfo = pageInfoOpt.get(); boolean isPageDeleted = false; if (predicate.test(pageInfo)) { - isPageDeleted = delete(pageInfo.getPageId()); + isPageDeleted = deletePageIfExists(pageInfo.getPageId(), false); } if (isPageDeleted) { MetricsSystem.meter(MetricKey.CLIENT_CACHE_PAGES_INVALIDATED.getName()).mark();