X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.indexing%2Fsrc%2Forg%2Fsimantics%2Fdb%2Findexing%2FDatabaseIndexing.java;h=abd6e1ba54ef1203f7508ee285b8e26a4ed442fd;hp=c8efdc2509edd9e5fedd59f32f9e5b8ad68bfdc6;hb=c26409b1caf2f1e560d37c5befd11b442399c3fe;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07 diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java index c8efdc250..abd6e1ba5 100644 --- a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java +++ b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java @@ -14,6 +14,7 @@ package org.simantics.db.indexing; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.util.ArrayList; import org.simantics.db.Resource; import org.simantics.db.Session; @@ -22,6 +23,7 @@ import org.simantics.db.common.request.IndexRoot; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.utils.Logger; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.indexing.internal.IndexChangedWriter; import org.simantics.db.layer0.adapter.GenericRelationIndex; import org.simantics.db.layer0.genericrelation.IndexedRelations; import org.simantics.db.layer0.internal.SimanticsInternal; @@ -75,7 +77,10 @@ public final class DatabaseIndexing { return; if (DEBUG) System.out.println("Marking all indexes dirty"); - getAllDirtyFile().createNewFile(); + File allDirtyFile = getAllDirtyFile(); + if (allDirtyFile.createNewFile()) { + FileUtils.syncFile(allDirtyFile); + } } public static void clearAllDirty() throws IOException { @@ -85,39 +90,61 @@ public final class DatabaseIndexing { File indexBase = getIndexBaseLocation(); if (!indexBase.exists() || !indexBase.isDirectory()) return; - delete(getAllDirtyFile()); forEachIndexPath(new Procedure() { @Override public void execute(File indexPath) throws IOException { - delete(getChangedFile(indexPath)); + getChangedFile(indexPath).delete(); } }); - } + getAllDirtyFile().delete(); + } + /** * Internal to indexing, invoked by {@link IndexedRelationsImpl} which * doesn't want to throw these exceptions forward. Just log it. * * @param indexPath */ - static void markIndexChanged(File indexPath) { - if (!indexPath.exists()) - throw new IllegalArgumentException("index path " + indexPath + " does not exist"); - if (!indexPath.isDirectory()) - throw new IllegalArgumentException("index path " + indexPath + " is not a directory"); + static void markIndexChanged(Session session, File indexPath) { + if (DEBUG) + System.out.println("Marking index dirty: " + indexPath); try { - if (DEBUG) - System.out.println("Marking index dirty: " + indexPath); - getChangedFile(indexPath).createNewFile(); + File changedFile = getChangedFile(indexPath); + // Mark change only once per DB session. + if (getIndexChangedWriter(session).markDirty(changedFile)) { + if (indexPath.mkdirs()) { + if (changedFile.createNewFile()) { + FileUtils.syncFile(changedFile); + } + } + } } catch (IOException e) { Logger.defaultLogError(e); } } + private static IndexChangedWriter getIndexChangedWriter(Session session) { + IndexChangedWriter writer = session.peekService(IndexChangedWriter.class); + if (writer == null) { + synchronized (IndexChangedWriter.class) { + if (writer == null) + session.registerService(IndexChangedWriter.class, writer = new IndexChangedWriter()); + } + } + return writer; + } + public static void deleteAllIndexes() throws IOException { File indexBase = DatabaseIndexing.getIndexBaseLocation(); - delete(indexBase); + + ArrayList filter = new ArrayList<>(2); + filter.add(getAllDirtyFile().getAbsolutePath()); + filter.add(indexBase.getAbsolutePath()); + + FileUtils.deleteAllWithFilter(indexBase, filter); + FileUtils.deleteAll(indexBase); } public static void deleteIndex(final Resource relation, final Resource modelPart) throws DatabaseException { @@ -148,7 +175,13 @@ public final class DatabaseIndexing { public static void deleteIndex(File indexPath) throws IOException { if (DEBUG) System.out.println("Deleting index " + indexPath); - delete(indexPath); + + ArrayList filter = new ArrayList<>(2); + filter.add(getChangedFile(indexPath).getAbsolutePath()); + filter.add(indexPath.getAbsolutePath()); + + FileUtils.deleteAllWithFilter(indexPath, filter); + FileUtils.deleteAll(indexPath); } public static void validateIndexes() throws IOException { @@ -161,7 +194,7 @@ public final class DatabaseIndexing { // Make sure that index-base is a valid directory if (DEBUG) System.out.println(indexBase + " is not a directory! Removing it."); - delete(indexBase); + FileUtils.deleteAll(indexBase); indexBase.mkdirs(); return; } @@ -169,7 +202,6 @@ public final class DatabaseIndexing { if (allDirtyFile.isFile()) { if (DEBUG) System.out.println("All indexes marked dirty, removing them."); - delete(allDirtyFile); deleteAllIndexes(); } else { forEachIndexPath(new Procedure() { @@ -186,12 +218,6 @@ public final class DatabaseIndexing { } } - - private static void delete(File fileOrDir) throws IOException { - if (fileOrDir.exists()) - FileUtils.deleteAll(fileOrDir); - } - interface Procedure { void execute(T t) throws E; }