// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= Snapshot Directory

== Configuring Snapshot Directory

By default, a segment of the snapshot is stored in the work directory of a respective Ignite node. This segment uses the
same storage media where Ignite Persistence keeps data, index, WAL, and other files. Since the snapshot can consume as much space as
already taken by the persistence files and can affect your applications' performance by sharing the disk I/O with the
Ignite Persistence routines, it's suggested to store the snapshot and persistence files on different media.

You can avoid this interference between Ignite Native persistence and snapshotting
by either changing link:persistence/native-persistence#configuring-persistent-storage-directory[storage directories of the persistence files]
or overriding the default snapshots' location as shown below:
[tabs]
--
tab:XML[]
[source, xml]
----
include::code-snippets/xml/snapshots.xml[tags=ignite-config;!discovery, indent=0]
----
tab:Java[]
[source, java]
----
include::{javaCodeDir}/Snapshots.java[tags=config, indent=0]
----
--
