Skip to content

Commit

Permalink
Ignore transaction log files during monitoring, monitor database fold…
Browse files Browse the repository at this point in the history
…er itself.

Update message to say if that was a folder or file that was deleted.
  • Loading branch information
MishaDemianenko committed Jan 9, 2017
1 parent ea54cd1 commit 50d5aee
Show file tree
Hide file tree
Showing 7 changed files with 342 additions and 57 deletions.
Expand Up @@ -51,7 +51,7 @@ public class AStarPerformanceIT
@Before
public void setup()
{
directory = testDirectory.directory( "graph-db" );
directory = testDirectory.graphDbDir();
}

@Test
Expand Down
Expand Up @@ -56,6 +56,8 @@
*/
public class TestDirectory implements TestRule
{
public static final String DATABASE_DIRECTORY = "graph-db";

private final FileSystemAbstraction fileSystem;
private File testClassBaseFolder;
private Class<?> owningTest;
Expand Down Expand Up @@ -158,12 +160,12 @@ public File file( String name )

public File graphDbDir()
{
return directory( "graph-db" );
return directory( DATABASE_DIRECTORY );
}

public File makeGraphDbDir() throws IOException
{
return cleanDirectory( "graph-db" );
return cleanDirectory( DATABASE_DIRECTORY );
}

public void cleanup() throws IOException
Expand Down
Expand Up @@ -209,6 +209,8 @@ protected FileWatcher createFileWatcher()
FileWatcher watcher = fileSystem.fileWatcher();
watcher.addFileWatchEventListener( new DefaultFileDeletionEventListener( logging ) );
watcher.watch( storeDir );
// register to watch store dir parent folder to see when store dir removed
watcher.watch( storeDir.getParentFile() );
return watcher;
}
catch ( Exception e )
Expand Down
Expand Up @@ -21,14 +21,19 @@

import org.neo4j.io.fs.watcher.event.FileWatchEventListenerAdapter;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.store.MetaDataStore;
import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile;
import org.neo4j.logging.Log;

import static java.lang.String.format;

/**
* Listener that will print notification about deleted filename into internal log.
*/
public class DefaultFileDeletionEventListener extends FileWatchEventListenerAdapter
{

private static final String EXTENSION_SEPARATOR = ".";
private final Log internalLog;

public DefaultFileDeletionEventListener( LogService logService )
Expand All @@ -39,7 +44,26 @@ public DefaultFileDeletionEventListener( LogService logService )
@Override
public void fileDeleted( String fileName )
{
internalLog.info( "Store file '" + fileName + "' was deleted while database was online." );
if ( isMonitoredFile( fileName ) )
{
internalLog.info( format( "Store %s '%s' was deleted while database was running.", getFileType( fileName ),
fileName ) );
}
}

private static boolean isMonitoredFile( String fileName )
{
return !fileName.startsWith( PhysicalLogFile.DEFAULT_NAME );
}

private static String getFileType( String fileName )
{
return isFile( fileName ) ? "file" : "directory";
}

private static boolean isFile( String fileName )
{
return fileName.startsWith( MetaDataStore.DEFAULT_NAME ) || fileName.contains( EXTENSION_SEPARATOR );
}

}
Expand Up @@ -22,6 +22,7 @@
import org.junit.Test;

import org.neo4j.kernel.impl.logging.SimpleLogService;
import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile;
import org.neo4j.logging.AssertableLogProvider;
import org.neo4j.logging.NullLogProvider;

Expand All @@ -32,14 +33,30 @@ public class DefaultFileDeletionEventListenerTest
public void notificationInLogAboutFileDeletion() throws Exception
{
AssertableLogProvider internalLogProvider = new AssertableLogProvider( false );
DefaultFileDeletionEventListener listener = buildListener( internalLogProvider );
listener.fileDeleted( "testFile.db" );
listener.fileDeleted( "anotherDirectory" );

internalLogProvider.assertContainsMessageContaining( "Store file 'testFile.db' was " +
"deleted while database was running." );
internalLogProvider.assertContainsMessageContaining( "Store directory 'anotherDirectory' was " +
"deleted while database was running." );
}

@Test
public void noNotificationForTransactionLogs()
{
AssertableLogProvider internalLogProvider = new AssertableLogProvider( false );
DefaultFileDeletionEventListener listener = buildListener( internalLogProvider );
listener.fileDeleted( PhysicalLogFile.DEFAULT_NAME + ".0" );
listener.fileDeleted( PhysicalLogFile.DEFAULT_NAME + ".1" );

internalLogProvider.assertNoLoggingOccurred();
}

private DefaultFileDeletionEventListener buildListener( AssertableLogProvider internalLogProvider )
{
SimpleLogService logService = new SimpleLogService( NullLogProvider.getInstance(), internalLogProvider );
DefaultFileDeletionEventListener listener = new DefaultFileDeletionEventListener( logService );
listener.fileDeleted( "testFile" );
listener.fileDeleted( "anotherFile" );

internalLogProvider.assertContainsMessageContaining( "Store file 'testFile' was " +
"deleted while database was online." );
internalLogProvider.assertContainsMessageContaining( "Store file 'anotherFile' was " +
"deleted while database was online." );
return new DefaultFileDeletionEventListener( logService );
}
}
4 changes: 1 addition & 3 deletions community/neo4j/src/test/java/db/DatabaseShutdownTest.java
Expand Up @@ -25,7 +25,6 @@
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.function.Supplier;

import org.neo4j.graphdb.GraphDatabaseService;
Expand All @@ -41,7 +40,6 @@
import org.neo4j.kernel.impl.factory.EditionModule;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacade;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.Dependencies;
import org.neo4j.kernel.impl.factory.PlatformModule;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
Expand Down Expand Up @@ -86,7 +84,7 @@ private static class TestGraphDatabaseFactoryWithFailingPageCacheFlush extends T
private NeoStoreDataSource neoStoreDataSource;

@Override
protected GraphDatabaseService newDatabase( File storeDir, Config config,
protected GraphDatabaseService newEmbeddedDatabase( File storeDir, Config config,
GraphDatabaseFacadeFactory.Dependencies dependencies )
{
return new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, CommunityEditionModule::new )
Expand Down

0 comments on commit 50d5aee

Please sign in to comment.