Package org.apache.cassandra.db
Class Directories
java.lang.Object
org.apache.cassandra.db.Directories
Encapsulate handling of paths to the data files.
/<path_to_data_dir>/ks/<cf dir>/ks-cf1-jb-1-Data.db
/<cf dir>/la-2-Data.db
/<cf dir>/.<index name>/ks-cf1.idx-jb-1-Data.db
/<cf dir>/.<index name>/la-1-Data.db
...
Until v2.0, <cf dir> is just column family name.
Since v2.1, <cf dir> has column family ID(tableId) added to its end.
SSTables from secondary indexes were put in the same directory as their parent.
Since v2.2, they have their own directory under the parent directory whose name is index name.
Upon startup, those secondary index files are moved to new directory when upgrading.
For backward compatibility, Directories can use directory without tableId if exists.
In addition, more that one 'root' data directory can be specified so that
<path_to_data_dir> potentially represents multiple locations.
Note that in the case of multiple locations, the manifest for the leveled
compaction is only in one of the location.
Snapshots (resp. backups) are always created along the sstables there are
snapshotted (resp. backuped) but inside a subdirectory named 'snapshots'
(resp. backups) (and snapshots are further inside a subdirectory of the name
of the snapshot). For secondary indexes, snapshots (backups) are not created in
their own directory, but are in their parent's snapshot (backup) directory.
This class abstracts all those details from the rest of the code.-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final classData directories used to store keyspace data.static classstatic enumstatic enumThe type of files that can be listed by SSTableLister, we never return txn logs, use LifecycleTransaction.getFiles() if you need txn logs.static enumHow to handle a failure to read a txn log file.static class -
Field Summary
Fields -
Constructor Summary
ConstructorsConstructorDescriptionDirectories(TableMetadata metadata) Directories(TableMetadata metadata, Collection<Directories.DataDirectory> paths) Directories(TableMetadata metadata, Directories.DataDirectory[] paths) Create Directories of given ColumnFamily. -
Method Summary
Modifier and TypeMethodDescriptionallFileStores(Function<File, FileStore> filestoreMapper) static voidclearSnapshot(String snapshotName, List<File> tableDirectories, com.google.common.util.concurrent.RateLimiter snapshotRateLimiter) static longgetAvailableSpaceForCompactions(FileStore fileStore) static Filestatic FilegetBackupsDirectory(File location) Returns directory to write a backup to.getBackupsDirectoryIfExists(File location) Returns directory to write a backup to.getDataDirectoryForFile(Descriptor descriptor) Basically the same as callinggetWriteableLocationAsFile(long)with an unknown size (-1L), which may return any allowed directory - even a data directory that has no usable space.static FileStoregetFileStore(File directory) Gets the filestore for the actual directory where the sstables are stored.getKSChildDirectories(String ksName) getLocationForDisk(Directories.DataDirectory dataDirectory) Returns SSTable location which is inside given data directory.longstatic FilegetSnapshotDirectory(Descriptor desc, String snapshotName) static FilegetSnapshotDirectory(File location, String snapshotName) Returns directory to write snapshot.getSnapshotDirectoryIfExists(File location, String snapshotName) Returns directory to write a snapshot to.getSnapshotManifestFile(String snapshotName) static FilegetSnapshotManifestFile(File snapshotDir) getSnapshotSchemaFile(String snapshotName) static FilegetSnapshotSchemaFile(File snapshotDir) getTemporaryWriteableDirectoryAsFile(long writeSize) Returns a temporary subdirectory on allowed data directory that _currently_ haswriteSizebytes as usable space.longgetTrueAllocatedSizeIn(File snapshotDir) getUIDGenerator(SSTableId.Builder<T> builder) Initializes the sstable unique identifier generator using a provided builder for this instance of directories.getWriteableLocation(long writeSize) Returns an allowed data directory that _currently_ haswriteSizebytes as usable space.getWriteableLocationAsFile(long writeSize) Returns an allowed directory that _currently_ haswriteSizebytes as usable space.getWriteableLocationToLoadFile(File sourceFile) Returns a data directory to load the filesourceFile.static booleanhasDiskSpaceForCompactionsAndStreams(Map<FileStore, Long> totalToWrite) Checks if there is enough space on all file stores to write the given amount of data.booleanhasDiskSpaceForCompactionsAndStreams(Map<File, Long> expectedNewWriteSizes, Map<File, Long> totalCompactionWriteRemaining) Sums up the space required for ongoing streams + compactions + expected new write size per FileStore and checks if there is enough space available.static booleanhasDiskSpaceForCompactionsAndStreams(Map<File, Long> expectedNewWriteSizes, Map<File, Long> totalCompactionWriteRemaining, Function<File, FileStore> filestoreMapper) static booleanstatic booleanstatic booleanisStoredInLocalSystemKeyspacesDataLocation(String keyspace, String table) Checks if the specified table should be stored with local system data.protected static SnapshotManifeststatic voidremoveSnapshotDirectory(com.google.common.util.concurrent.RateLimiter snapshotRateLimiter, File snapshotDir) voidbooleansnapshotExists(String snapshotName) sstableLister(Directories.OnTxnErr onTxnErr) sstableLister(File directory, Directories.OnTxnErr onTxnErr) longstatic booleanverifyFullPermissions(File dir, String dataDir) Checks whether Cassandra has RWX permissions to the specified directory.
-
Field Details
-
BACKUPS_SUBDIR
- See Also:
-
SNAPSHOT_SUBDIR
- See Also:
-
TMP_SUBDIR
- See Also:
-
SECONDARY_INDEX_NAME_SEPARATOR
- See Also:
-
TABLE_DIRECTORY_NAME_SEPARATOR
- See Also:
-
dataDirectories
The directories used to store keyspaces data.
-
-
Constructor Details
-
Directories
-
Directories
-
Directories
Create Directories of given ColumnFamily. SSTable directories are created under data_directories defined in cassandra.yaml if not exist at this time.- Parameters:
metadata- metadata of ColumnFamily
-
-
Method Details
-
verifyFullPermissions
Checks whether Cassandra has RWX permissions to the specified directory. Logs an error with the details if it does not.- Parameters:
dir- File object of the directory.dataDir- String representation of the directory's location- Returns:
- status representing Cassandra's RWX permissions to the supplied folder location.
-
getLocationForDisk
Returns SSTable location which is inside given data directory.- Parameters:
dataDirectory-- Returns:
- SSTable location
-
getDataDirectoryForFile
-
find
-
getDirectoryForNewSSTables
Basically the same as callinggetWriteableLocationAsFile(long)with an unknown size (-1L), which may return any allowed directory - even a data directory that has no usable space. Do not use this method in production code.- Throws:
FSWriteError- if all directories are disallowed.
-
getWriteableLocationAsFile
Returns an allowed directory that _currently_ haswriteSizebytes as usable space.- Throws:
FSWriteError- if all directories are disallowed.
-
getWriteableLocationToLoadFile
Returns a data directory to load the filesourceFile. If the sourceFile is on same disk partition as any data directory then use that one as data directory otherwise usegetWriteableLocationAsFile(long)to find suitable data directory. Also makes sure returned directory is not disallowed.- Throws:
FSWriteError- if all directories are disallowed.
-
getTemporaryWriteableDirectoryAsFile
Returns a temporary subdirectory on allowed data directory that _currently_ haswriteSizebytes as usable space. This method does not create the temporary directory.- Throws:
IOError- if all directories are disallowed.
-
removeTemporaryDirectories
public void removeTemporaryDirectories() -
getWriteableLocation
Returns an allowed data directory that _currently_ haswriteSizebytes as usable space.- Throws:
FSWriteError- if all directories are disallowed.
-
hasDiskSpaceForCompactionsAndStreams
public boolean hasDiskSpaceForCompactionsAndStreams(Map<File, Long> expectedNewWriteSizes, Map<File, Long> totalCompactionWriteRemaining) Sums up the space required for ongoing streams + compactions + expected new write size per FileStore and checks if there is enough space available.- Parameters:
expectedNewWriteSizes- where we expect to write the new compactionstotalCompactionWriteRemaining- approximate amount of data current compactions are writing - keyed by the file store they are writing to (or, reading from actually, but since CASSANDRA-6696 we expect compactions to read and written from the same dir)- Returns:
- true if we expect to be able to write expectedNewWriteSizes to the available file stores
-
hasDiskSpaceForCompactionsAndStreams
-
hasDiskSpaceForCompactionsAndStreams
Checks if there is enough space on all file stores to write the given amount of data. The data to write should be the total amount, ongoing writes + new writes. -
getAvailableSpaceForCompactions
-
perFileStore
-
allFileStores
-
getFileStore
Gets the filestore for the actual directory where the sstables are stored. Handles the fact that an operator can symlink a table directory to a different filestore. -
getWriteableLocations
-
getSnapshotDirectory
-
getSnapshotDirectory
Returns directory to write snapshot. If directory does not exist, then one is created. If givenlocationindicates secondary index, this will return<cf dir>/snapshots/<snapshot name>/.<index name>. Otherwise, this will return<cf dir>/snapshots/<snapshot name>.- Parameters:
location- base directorysnapshotName- snapshot name- Returns:
- directory to write snapshot
-
getSnapshotDirectoryIfExists
Returns directory to write a snapshot to. If directory does not exist, then it is NOT created. If givenlocationindicates secondary index, this will return<cf dir>/snapshots/<snapshot name>/.<index name>. Otherwise, this will return<cf dir>/snapshots/<snapshot name>.- Parameters:
location- base directorysnapshotName- snapshot name- Returns:
- directory to write a snapshot
-
getSnapshotManifestFile
-
getSnapshotManifestFile
-
getSnapshotSchemaFile
-
getSnapshotSchemaFile
-
getBackupsDirectory
-
getBackupsDirectory
Returns directory to write a backup to. If directory does not exist, then one is created. If givenlocationindicates secondary index, this will return<cf dir>/backups/.<index name>. Otherwise, this will return<cf dir>/backups/.- Parameters:
location- base directory- Returns:
- directory to write a backup
-
getBackupsDirectoryIfExists
Returns directory to write a backup to. If directory does not exist, then it is NOT created. If givenlocationindicates secondary index, this will return<cf dir>/backups/.<index name>. Otherwise, this will return<cf dir>/backups/.- Parameters:
location- base directory- Returns:
- directory to write a backup
-
isStoredInLocalSystemKeyspacesDataLocation
Checks if the specified table should be stored with local system data.To minimize the risk of failures, SSTables for local system keyspaces must be stored in a single data directory. The only exception to this are some of the system table as the server can continue operating even if those tables loose some data.
- Parameters:
keyspace- the keyspace nametable- the table name- Returns:
trueif the specified table should be stored with local system data,falseotherwise.
-
sstableLister
-
sstableLister
-
listSnapshots
-
maybeLoadManifest
-
listSnapshotDirsByTag
-
snapshotExists
-
clearSnapshot
-
removeSnapshotDirectory
public static void removeSnapshotDirectory(com.google.common.util.concurrent.RateLimiter snapshotRateLimiter, File snapshotDir) -
trueSnapshotsSize
public long trueSnapshotsSize()- Returns:
- total snapshot size in byte for all snapshots.
-
getRawDiretoriesSize
public long getRawDiretoriesSize()- Returns:
- Raw size on disk for all directories
-
getTrueAllocatedSizeIn
-
getKSChildDirectories
-
isSecondaryIndexFolder
-
isSecondaryIndexFolder
-
getCFDirectories
-
getUIDGenerator
Initializes the sstable unique identifier generator using a provided builder for this instance of directories. If the id builder needs that, sstables in these directories are listed to provide the existing identifiers to the builder. The listing is done lazily so if the builder does not require that, listing is skipped. -
get
-