public static void flushCache(@Nullable VirtualFile finishedFile) { if (finishedFile == null || !myFinishedFiles.offer(finishedFile)) { VirtualFile[] files = null; synchronized (myFinishedFiles) { int size = myFinishedFiles.size(); if ((finishedFile == null && size > 0) || size == CAPACITY) { files = myFinishedFiles.toArray(new VirtualFile[size]); myFinishedFiles.clear(); } } if (files != null) { for (VirtualFile file : files) { synchronized (getStripedLock(file)) { Timestamps timestamp = myTimestampsCache.remove(file); if (timestamp == null) continue; try { if (timestamp.isDirty() && file.isValid()) { final DataOutputStream sink = Timestamps.PERSISTENCE.writeAttribute(file); timestamp.writeToStream(sink); sink.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } } if (finishedFile != null) myFinishedFiles.offer(finishedFile); } }
public static long getIndexStamp(VirtualFile file, ID<?, ?> indexName) { synchronized (getStripedLock(file)) { Timestamps stamp = createOrGetTimeStamp(file); if (stamp != null) return stamp.get(indexName); return 0; } }
public static void update( final VirtualFile file, final ID<?, ?> indexName, final long indexCreationStamp) { synchronized (getStripedLock(file)) { try { Timestamps stamp = createOrGetTimeStamp(file); if (stamp != null) stamp.set(indexName, indexCreationStamp); } catch (InvalidVirtualFileAccessException ignored /*ok to ignore it here*/) { } } }
@Override protected void onDropFromCache(final VirtualFile key, final Timestamps value) { try { if (value.isDirty()) { final DataOutputStream sink = Timestamps.PERSISTENCE.writeAttribute(key); value.writeToStream(sink); sink.close(); } } catch (InvalidVirtualFileAccessException ignored /*ok to ignore it here*/) { } catch (IOException e) { throw new RuntimeException(e); } }
@Test public void testCheckGoodStartTimestamp() { assertEquals(GOOD_TIMESTAMP, Timestamps.checkTimestamp(GOOD_TIMESTAMP)); }
@Test(expected = IllegalArgumentException.class) public void testCheckTimestampNegativeTimestamp() { Timestamps.checkTimestamp(BAD_TIMESTAMP); }