Skip to content

Commit

Permalink
Online backup transaction logs location
Browse files Browse the repository at this point in the history
Put transaction logs into the same folder as backup directory always.
Previously online backup tried to put them into a folder that was related to
neo4j_home that can be either empty either incorrect for backup case.
  • Loading branch information
MishaDemianenko committed Nov 23, 2017
1 parent 5c6d92c commit 22f3c83
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 9 deletions.
Expand Up @@ -19,11 +19,13 @@
*/ */
package org.neo4j.backup; package org.neo4j.backup;


import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Optional; import java.util.Optional;


import org.neo4j.commandline.admin.CommandFailed; import org.neo4j.commandline.admin.CommandFailed;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.helpers.collection.MapUtil; import org.neo4j.helpers.collection.MapUtil;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;


Expand All @@ -38,9 +40,10 @@ class OnlineBackupCommandConfigLoader
this.configDir = configDir; this.configDir = configDir;
} }


Config loadConfig( Optional<Path> additionalConfig ) throws CommandFailed Config loadConfig( Optional<Path> additionalConfig, File folder ) throws CommandFailed
{ {
Config config = Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ).withHome( homeDir ) Config config = Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ).withHome( homeDir )
.withSetting( GraphDatabaseSettings.logical_logs_location, folder.getAbsolutePath() )
.withConnectorsDisabled().build(); .withConnectorsDisabled().build();
return withAdditionalConfig( additionalConfig, config ); return withAdditionalConfig( additionalConfig, config );
} }
Expand Down
Expand Up @@ -54,6 +54,6 @@ public ConsistencyFlags getConsistencyFlags()


public File getResolvedLocationFromName() public File getResolvedLocationFromName()
{ {
return requiredArguments.getFolder().resolve( requiredArguments.getName() ).toFile(); return requiredArguments.getResolvedLocationFromName();
} }
} }
Expand Up @@ -32,7 +32,7 @@ public class OnlineBackupContextLoader
private final BackupCommandArgumentHandler backupCommandArgumentHandler; private final BackupCommandArgumentHandler backupCommandArgumentHandler;
private final OnlineBackupCommandConfigLoader onlineBackupCommandConfigLoader; private final OnlineBackupCommandConfigLoader onlineBackupCommandConfigLoader;


public OnlineBackupContextLoader( BackupCommandArgumentHandler backupCommandArgumentHandler, OnlineBackupContextLoader( BackupCommandArgumentHandler backupCommandArgumentHandler,
OnlineBackupCommandConfigLoader onlineBackupCommandConfigLoader ) OnlineBackupCommandConfigLoader onlineBackupCommandConfigLoader )
{ {
this.backupCommandArgumentHandler = backupCommandArgumentHandler; this.backupCommandArgumentHandler = backupCommandArgumentHandler;
Expand All @@ -49,7 +49,8 @@ public OnlineBackupContext fromCommandLineArguments( String[] commandlineArgs )
try try
{ {
OnlineBackupRequiredArguments requiredArguments = backupCommandArgumentHandler.establishRequiredArguments( commandlineArgs ); OnlineBackupRequiredArguments requiredArguments = backupCommandArgumentHandler.establishRequiredArguments( commandlineArgs );
Config config = onlineBackupCommandConfigLoader.loadConfig( requiredArguments.getAdditionalConfig() ); Config config = onlineBackupCommandConfigLoader.loadConfig( requiredArguments.getAdditionalConfig(),
requiredArguments.getResolvedLocationFromName() );
ConsistencyFlags consistencyFlags = backupCommandArgumentHandler.readFlagsFromArgumentsOrDefaultToConfig( config ); ConsistencyFlags consistencyFlags = backupCommandArgumentHandler.readFlagsFromArgumentsOrDefaultToConfig( config );


return new OnlineBackupContext( requiredArguments, config, consistencyFlags ); return new OnlineBackupContext( requiredArguments, config, consistencyFlags );
Expand Down
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.backup; package org.neo4j.backup;


import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Optional; import java.util.Optional;


Expand Down Expand Up @@ -87,4 +88,9 @@ public Path getReportDir()
{ {
return reportDir; return reportDir;
} }

public File getResolvedLocationFromName()
{
return folder.resolve( name ).toFile();
}
} }
Expand Up @@ -85,7 +85,7 @@ public void errorHandledForNonExistingAdditionalConfigFile() throws CommandFaile


// expect // expect
assertFalse( additionalConf.exists() ); assertFalse( additionalConf.exists() );
subject.loadConfig( Optional.of( additionalConf.toPath() ) ); subject.loadConfig( Optional.of( additionalConf.toPath() ), new File( "destination" ) );
} }


@Test @Test
Expand All @@ -101,7 +101,7 @@ public void prioritiseConfigDirOverHomeDir() throws IOException, CommandFailed
appendToFile( homeDirConfigFile, "causal_clustering.raft_in_queue_max_batch=21" ); appendToFile( homeDirConfigFile, "causal_clustering.raft_in_queue_max_batch=21" );


// when // when
Config config = subject.loadConfig( Optional.empty() ); Config config = subject.loadConfig( Optional.empty(), new File( "destination" ) );


// then // then
assertEquals( Integer.valueOf( 4 ), config.get( CausalClusteringSettings.expected_core_cluster_size ) ); assertEquals( Integer.valueOf( 4 ), config.get( CausalClusteringSettings.expected_core_cluster_size ) );
Expand All @@ -121,7 +121,8 @@ public void prioritiseAdditionalOverConfigDir() throws IOException, CommandFaile
appendToFile( additionalConfigFile, "causal_clustering.expected_core_cluster_size=5" ); appendToFile( additionalConfigFile, "causal_clustering.expected_core_cluster_size=5" );


// when // when
Config config = subject.loadConfig( Optional.of( additionalConfigFile.toPath() ) ); Config config = subject.loadConfig( Optional.of( additionalConfigFile.toPath() ),
new File( "destination" ) );


// then // then
assertEquals( Integer.valueOf( 5 ), config.get( CausalClusteringSettings.expected_core_cluster_size ) ); assertEquals( Integer.valueOf( 5 ), config.get( CausalClusteringSettings.expected_core_cluster_size ) );
Expand Down
Expand Up @@ -44,18 +44,24 @@
import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.io.fs.DefaultFileSystemAbstraction;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.configuration.Settings;
import org.neo4j.kernel.impl.enterprise.configuration.OnlineBackupSettings; import org.neo4j.kernel.impl.enterprise.configuration.OnlineBackupSettings;
import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.highlimit.HighLimit;
import org.neo4j.kernel.impl.store.format.standard.Standard; import org.neo4j.kernel.impl.store.format.standard.Standard;
import org.neo4j.kernel.impl.transaction.log.files.LogFiles;
import org.neo4j.kernel.impl.transaction.log.files.LogFilesBuilder;
import org.neo4j.ports.allocation.PortAuthority; import org.neo4j.ports.allocation.PortAuthority;
import org.neo4j.test.DbRepresentation; import org.neo4j.test.DbRepresentation;
import org.neo4j.test.rule.EmbeddedDatabaseRule; import org.neo4j.test.rule.EmbeddedDatabaseRule;
import org.neo4j.test.rule.SuppressOutput; import org.neo4j.test.rule.SuppressOutput;
import org.neo4j.test.rule.TestDirectory; import org.neo4j.test.rule.TestDirectory;


import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeFalse;
import static org.neo4j.util.TestHelpers.runBackupToolFromOtherJvmToGetExitCode; import static org.neo4j.util.TestHelpers.runBackupToolFromOtherJvmToGetExitCode;


Expand Down Expand Up @@ -86,7 +92,7 @@ public static List<String> recordFormats()
private static final String PROP_NAME = "name"; private static final String PROP_NAME = "name";
private static final String PROP_RANDOM = "random"; private static final String PROP_RANDOM = "random";


private static DbRepresentation createSomeData( GraphDatabaseService db ) private static void createSomeData( GraphDatabaseService db )
{ {
try ( Transaction tx = db.beginTx() ) try ( Transaction tx = db.beginTx() )
{ {
Expand All @@ -95,7 +101,6 @@ private static DbRepresentation createSomeData( GraphDatabaseService db )
db.createNode().createRelationshipTo( node, RelationshipType.withName( "KNOWS" ) ); db.createNode().createRelationshipTo( node, RelationshipType.withName( "KNOWS" ) );
tx.success(); tx.success();
} }
return DbRepresentation.of( db );
} }


@Before @Before
Expand Down Expand Up @@ -162,6 +167,25 @@ public void dataIsInAUsableStateAfterBackup() throws Exception
db.shutdown(); db.shutdown();
} }


@Test
public void backupDatabaseTransactionLogsStoredWithDatabase() throws Exception
{
int backupPort = PortAuthority.allocatePort();
startDb( backupPort );
String ip = ":" + backupPort;
String name = "backupWithTxLogs" + recordFormat;
assertEquals( 0, runBackupTool( "--from", ip, "--cc-report-dir=" + backupDir, "--backup-dir=" + backupDir,
"--name=" + name ) );
db.shutdown();

try ( DefaultFileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction() )
{
LogFiles logFiles = LogFilesBuilder.logFilesBasedOnlyBuilder( new File( backupDir, name ), fileSystem ).build();
assertTrue( logFiles.versionExists( 0 ) );
assertThat( logFiles.getLogFileForVersion( 0 ).length(), greaterThan( 50L ) );
}
}

private void repeatedlyPopulateDatabase( GraphDatabaseService db, AtomicBoolean continueFlagReference ) private void repeatedlyPopulateDatabase( GraphDatabaseService db, AtomicBoolean continueFlagReference )
{ {
while ( continueFlagReference.get() ) while ( continueFlagReference.get() )
Expand Down

0 comments on commit 22f3c83

Please sign in to comment.