rocksdb代码解析-db.h
总
这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件。对于rocksdb的db.h文件来说,且不论前面一大串结构体,该文件的核心无疑是class DB,从一百多行到一千多行,都是这个类。
本文共计七千余字,分为四个部分,分别是整体方法,属性方法,参数解析和其他。
下面对类内部进行分析,为了节约空间,函数参数不再写了。
整体方法
该表格为整体性方法,主要操作包含Put,Get,Delete等键值存储的基础操作以及针对数据库本身的操作,还有就是rocksdb自身的扩展。
Open | 用指定的“name”【引用型字符串参数】打开数据库【默认列族】。在* dbptr中存储指向堆分配的数据库的指针,并在成功时返回OK。将nullptr存储在* dbptr中,并在出现错误时返回非OK状态。当不再需要* dbptr时,调用者应将其删除(delete DB)。返回值直接给db就行,一般来说数据库只用有一个,如果想分类使用列族的方式会快很多。 |
OpenForReadOnly | 以只读形式打开数据库,此时不考虑列族的问题,像删改一样的改数据的操作都会返回错误,且不会触发compaction操作。 |
OpenForReadOnly | 以只读模式打开某列族(或某些),用参数与上面的玩意区分,列族名存在vector数组中。只能打开指定的列族,如果不写指定列族的参数的话,会对默认列族进行操作。默认列族存在 kDefaultColumnFamilyName 里面,可以自行修改。假如想对n个列族进行操作的话,应该创建n-1个列族。 |
OpenAsSecondary |
从节点功能,该方法创建了一个从节点,可以动态地追踪现有的MANIFEST文件。用户可以在需要时调用TryCatchUpWithPrimary使备份追上主节点。主节点优先级大于从节点,启动从节点的话只要主节点的句柄没有被销毁,还是可以恢复到主节点状态的。 options参数指定用于打开从节点的选项。 name参数指定用于打开主节点的主数据库的名称。 secondary_path参数指向从节点存储其信息日志的目录。 dbptr是与打开的从节点相对应的out-arg【外部指针】该指针指向一个堆中数据库,用户应在使用后将其删除。 目前不支持WAL追踪【实时从节点】,但很快就会有。 |
OpenAsSecondary | 上面的方式会以默认列族打开,而这个会指定列族的方式打开从节点,多了一个参数就是column_families,这个参数指定要打开的列族。【所谓从节点可以以MVCC的多版本控制链来理解】 |
Open |
以列族打开数据库,用参数和上面的区分 实际上在进入代码研究之后可以发现列族不管你指不指定都必须有,不输入的话就是默认的列族。 db_options指定数据库特定的选项 column_families是数据库中所有列族的向量,包含列族名称和选项。 ->可以用ListColumnFamilies()来获得所有列族的列表。也可以用只读的方式打开部分列族。 默认的列族名为default,存储在rocksdb::kDefaultColumnFamilyName. 如果没问题的话,返回时句柄的大小将与column_families相同-->handles [i]将是用于对列族column_family [i]进行操作的句柄。 用这种函数打开的数据库要删除的话需要用DestroyColumnFamilyHandle()来删除所有句柄。 |
Resume | 数据库恢复操作,与最下面的数据库修复操作不同,这个是针对备份与主存的。 |
Close | 关闭数据库,包括释放资源,清理文件等操作。为了防止意外,此方法应该在析构函数之前调用,并且若数据库中还有没释放的闪照的话会返回失败。 |
ListColumnFamilies | 这个方法会将打开指定参数名的数据库,并通过column_families参数返回该数据库中所有列族的列表。 |
CreateColumnFamily | 创建column_family并通过参数handle返回列族的句柄,通过status返回是否成功。 |
CreateColumnFamilies | 批量创建具有相同列族选项设置的列族。该函数可能会出现部分成功部分失败的情况,成功的状态会保留。 |
CreateColumnFamilies | 这个也是批量创建列族的,与上面不同的是上面的是全部相同属性的列族,传入的参数是字符串作为列族名。而这个通过列族描述符传入,每个列族属性都可能不同。 |
DropColumnFamily | 通过句柄指针删除一个列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。 |
DropColumnFamily | 批量删除列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。如果发生错误,请求可能会部分成功。用户可以调用ListColumnFamilies来检查结果。 |
DestroyColumnFamilyHandle |
关闭由column_family句柄指定的列族,并销毁指定的列族句柄,以避免重复删除。默认情况下,此调用将删除列族句柄。注意:请使用此方法关闭列族而不是直接删除列族句柄。 |
Put |
kv存储最基础的操作之一,Slice格式的输入,通过参数判断是否指定列族,最后会以write_batch的形式写入。更新操作也是通过Put来实现的。 |
Delete | kv存储最基础的操作之一,通过key删除,如果key不存在也不会报错,因为其本质上来说也是插入操作,Put的key带有delete标记,在后续的compaction中会删除掉前面的内容。 |
SingleDelete | 通过key删除.要求key存在并且未被覆盖。如果key不存在也不会报错。如果key被overwrite(更新)了,那么调用这个会返回undefined,自从上次对该key调用SingleDelete()以来,只有该key只有一个Put()时,SingleDelete()才能正确运行。【库内只允许一条记录】-->删除方法只删除最新的,所以不能有多个记录。当前,此功能是针对非常特定的工作负载的实验性性能优化。调用者应确保SingleDelete仅用于未使用Delete()删除【因为delete本质也是put】或未使用Merge()写入的key。将SingleDelete操作与Deletes和Merges混合使用会导致不确定的行为。 |
DeleteRange |
按range:"begin_key", "end_key"删除数据,但在生产实践中一般不用这个。 原因:1.在内存表中累积许多范围的逻辑删除将降低读取性能。(可以通过偶尔手动flush来避免这种情况。)2.在存在范围逻辑删除的情况下限制打开文件的最大数量会降低读取性能。(为避免此问题,请尽可能将max_open_files设置为-1。也就是不限制。) |
Merge | Merge操作,此操作简单来说就是rocksdb对于对已存在数据库中的value进行追加的一个操作,比如使key1对应的value->hello变成helloworld。对这个操作进行的算法优化。此操作包括‘读-改-写’三个步骤。打开DB时,此操作的语义由用户提供的merge_operator决定,实际上是决定其在后来的compaction过程中的合并方式。 |
Write | 将指定的更新应用到数据库。如果‘updates’不包含更新,但options.sync = true【是否同步】,WAL仍将同步。 |
Get | kv存储最基础的操作之一,按key查找,不影响value。找不到返回Status::IsNotFound(),其他错误会返回其他Status。Get操作首先在内存中的表进行查询(首先是缓存,然后是memtable等内存表),在查询无果后会向下面的持久化存储LSM-tree进行逐层查询。 |
GetMergeOperands | 返回与键对应的所有合并操作数。operands【操作数】,这里是指对步骤进行拆解后需要的操作的数量 |
MultiGet | 顾名思义,一次性get多个,以参数来看是以向量作为数组传递Slice格式的参数。如果keys [i]在数据库中不存在,则第i个返回的状态将为Status :: IsNotFound()为true的状态,并且(* values)[i]将被设置为某个任意值(通常就是 “”)。否则,第i个返回的状态将具有Status :: ok()为true,并且(* values)[i]将存储与keys [i]关联的值。 |
MultiGet | 重载的MultiGet API通过在读取路径中进行批处理操作来提高性能,从而提高效率。但仅支持具有完整过滤器的基于block的表格式。 |
KeyMayExist | 用于判断一个key是否存在,如果key在数据库中不存在,则返回false,否则返回true。如果调用者想在内存中找到key时获取value,则必须设置“value_found”为true。【默认false】与调用DB::Get()相比,这个方法更加轻量【消耗资源少(why:IO少了)】。 |
NewIterator | 创建迭代器,返回基于堆的数据库迭代器。NewIterator()的结果最初是无效的(调用者必须在使用迭代器之前在迭代器上调用Seek方法之一)。如果不是长时间使用,调用者请删除迭代器。在删除此数据库之前,应删除返回的迭代器。若是只传入读选项的话,会对默认列族操作,传入列族指针或是列族数组的话可以跨列族操作。另外,迭代器是堆分配的,需要在删除数据库之前将其删除。 |
GetSnapshot | 返回当前数据库状态的句柄【快照】,使用此句柄创建的迭代器都将观察当前数据库状态的稳定快照。当不再需要快照时,调用者必须调用ReleaseSnapshot(result)来释放快照。如果数据库无法进行快照或不支持快照,则将返回nullptr。 |
ReleaseSnapshot | 释放快照,注意释放后请不要再次建立快照。 |
参数
结构体Propertiy里包含了所有有效的属性参数,这些参数通过GetProperties()获取,这些属性能在多维度反应数据库当时的运行状态。当然,底层的具体架构分布是不显示的,要是想了解的话【以db_bench为例】可以在系统的tmp文件夹里找到rocksdb开头的文件夹,在里面可以看到运行日志,具体的sst文件以及数据库参数选项的设置之类的东西,建议了解了解。其中数据库参数选项(options)的设置很大程度上决定了数据库的发挥,参数可以在相关文件中修改【不推荐】,也可以在运行时调用相关接口进行修改,或者在运行数据库时作为外部参数传入。
kNumFilesAtLevelPrefix |
返回包含文件在第几层的字符串,用ASCII表示。 |
kCompressionRatioAtLevelPrefix |
返回包含在第N层的压缩率的字符串,用ASCII表示。在这里压缩率被认为是-未压缩的数据大小/压缩的文件大小。没有文件的话返回"-1.0"。 |
kStats |
返回多行字符串,其中包含kCFStats描述的数据,后跟kDBStats描述的数据。 |
kSSTables |
返回总结当前SST文件的多行字符串 |
kCFStats |
相当于 "rocksdb.cfstats-no-file-histogram" 和"rocksdb.cf-file-histogram" 加起来. 具体见后面的描述【histogram直方图】 |
kCFStatsNoFileHistogram |
返回一个多行字符串,该字符串在db的生命周期(“ L <n>”)内具有每层的常规列族统计信息,在db的生命周期(“ Sum”)内进行聚合,并在自上次检索以来的时间间隔(“ Int”)进行聚合 。它还可以用于以映射的格式返回统计信息。在这种情况下,每个级别以及“sum”都将有一对字符串组成双精度数组。检索这种形式的统计信息时,“int”统计信息将不会受到影响。 |
kCFFileHistogram |
输出每层读取了多少文件,以及单个请求的延迟的直方图。 |
kDBStats |
返回包含常规数据库统计信息的多行字符串,该统计信息既是累积的(在数据库的生命周期内),又是间隔的(从上一次检索kDBStats开始)。 |
kLevelStats |
返回多行字符串,其中包含每层的文件数和每个级别的总大小(MB)。 |
kNumImmutableMemTable |
返回尚未flush的immutable memtables数量。 |
kNumImmutableMemTableFlushed |
返回已经准备好flush的immutable memtables数量。 |
kMemTableFlushPending |
如果memtable flush挂起,则返回1; 否则,返回0。 |
kNumRunningFlushes |
返回正在flush的table的数量 |
kCompactionPending |
如果至少有一个compaction正在挂起,则返回1,否则0 |
kNumRunningCompactions |
返回正在compaction的数量 |
kBackgroundErrors |
返回后台错误的统计 |
kCurSizeActiveMemTable |
返回活动的memtable的近似大小(字节) |
kCurSizeAllMemTables |
返回活动的memtable和未flush的immutable memtable的近似大小(字节)。 |
kSizeAllMemTables |
返回活动的memtable,未flush和已flush的immutable memtable的近似大小(字节)。 |
kNumEntriesActiveMemTable |
返回活动memtable中的条目总数。 |
kNumEntriesImmMemTables |
返回未flush的immutable memtable中的条目总数。 |
kNumDeletesActiveMemTable |
返回活动memtable中删除条目的总数。 |
kNumDeletesImmMemTables |
返回未flush的immutable memtable中删除条目的总数。 |
kEstimateNumKeys |
返回memtable和未flush的immutable memtable和持久化存储中的总键的估计数量。 |
kEstimateTableReadersMem |
返回用于读取SST表的估计内存,不包括块缓存中使用的内存(例如过滤器和索引块)。 |
kIsFileDeletionsEnabled |
如果启用了删除过时的文件,则返回0,否则,返回一个非零数字。 |
kNumSnapshots |
返回数据库内没释放的闪照的数量 |
kOldestSnapshotTime |
返回表示最旧的未发布快照的Unix时间戳的数字。 |
kNumLiveVersions |
返回现存的version数。 “version”是一个内部数据结构,细节在version_set.h里面更多的现存的版本通常意味着更多的SST文件没有被删除(来自迭代器或未完成的压缩)。 |
kCurrentSuperVersionNumber |
返回当前LSM版本号它是一个uint64_t整数,在LSM树发生任何更改后递增。重新启动数据库后,该号码不会保留,从0开始。 |
kEstimateLiveDataSize |
返回以字节为单位的实时数据量的估计值 |
kMinLogNumberToKeep |
返回应保留的日志文件的最小日志数 |
kMinObsoleteSstNumberToKeep |
返回保留过时的SST的最小文件号。如果可以删除所有过时的文件,则将返回`uint64_t`的最大值。 |
kTotalSstFilesSize |
返回所有SST文件的总大小(字节)。如果文件太多,可能会降低在线查询的速度。 |
kLiveSstFilesSize |
返回属于最新LSM树的所有SST文件的总大小(字节)。 |
kBaseLevel |
返回将L0数据压缩到的层数 |
kEstimatePendingCompactionBytes |
返回估计的重写压缩总数,以使所有级别降至目标大小以下。不适用于除基于层以外的其他压缩。 |
kAggregatedTableProperties |
返回目标列族的聚合表属性的字符串表示形式。 |
kAggregatedTablePropertiesAtLevel |
和前面的一样,但只针对第N层 |
kActualDelayedWriteRate |
返回当前的实际延迟写入率。0表示没有延迟。 |
kIsWriteStopped |
判断写入状态,如果写入已停止,则返回1。 |
kEstimateOldestKeyTime |
返回数据库中最旧的密钥时间戳的估计值。目前仅适用于FIFO压缩中,且要求compaction_options_fifo.allow_compaction = false。 |
kBlockCacheCapacity |
返回块缓存容量 |
kBlockCacheUsage |
返回驻留在块缓存中的条目的内存大小 |
kBlockCachePinnedUsage |
返回被挂起【固定】【pinned】的kv对的内存大小。 |
kOptionsStatistics |
返回对options.statistics的描述,为多行字符串 |
接下来是有关属性的函数:
GetProperty |
数据库实现可以通过此方法导出有关其状态的属性。如果“属性”是此数据库实现可以理解的有效属性(有关有效属性,请参见上面的属性结构) |
GetMapProperty |
同上,获得属性及其相应的映射关系 |
GetIntProperty |
和上面的GetProperty()类似,但仅适用于返回值为整数的属性子集。 |
GetAggregatedIntProperty |
与 GetIntProperty()相同,但是此函数返回所有列族的聚合int属性。 |
ResetStats |
重置数据库和所有列族的内部统计信息。请注意,这不会重置options.statistics,因为它不属于数据库 |
GetApproximateSizes |
这个返回的是实际上大致的大小,如果用户数据压缩十倍,则返回的大小将是相应用户数据大小的十分之一。 |
GetApproximateMemTableStats |
该方法与GetApproximateSizes相似,不同的是它返回内存表中的记录的大致数量。 |
CompactRange |
压缩键范围[* begin,* end]的基础存储。实际压缩间隔可能是[* begin,* end]的超集。特别是删除和覆盖的版本将被丢弃,并对数据进行重新排列以减少访问数据所需的操作成本。通常,只有对基础有一定了解的用户才能调用此操作。特别的,begin==nullptr 视为数据库中所有key之前的key,end==nullptr 视为数据库中所有key之后的key。因此,以下调用将压缩整个数据库:db->CompactRange(options, nullptr, nullptr); 请注意,在压缩整个数据库之后,所有数据均被下推到包含任何数据的最后一级。如果压缩后的总数据大小减小,则该级别可能不适用于存储所有文件。在这种情况下,客户端可以将options.change_level设置为true,以将文件移回能够容纳数据集的最小级别或给定级别(由非负options.target_level指定)。 |
SetOptions/SetDBOptions |
顾名思义,对数据库选项进行设置,不在乎先后顺序,只需将内容以vector数组的形式传入。 |
CompactFiles |
CompactFiles()输入由文件编号指定的文件列表,并将其压缩到指定层。该行为与CompactRange()的不同之处在于CompactFiles()使用CURRENT线程执行压缩作业。也就是‘立即进行’。 |
PauseBackgroundWork |
暂停功能,该功能将一直等到所有当前正在运行的后台进程完成,返回后,将不会运行任何后台进程(compaction,batch,flush之类的操作),直到调用ContinueBackgroundWork |
ContinueBackgroundWork |
继续整个数据库的运行,由于停止之前就是将正在运行的后台任务运行完才暂停的,所以不会有任务进行到一半接着来的情况。 |
EnableAutoCompaction |
如果先前禁用了给定的列族,此功能将启用它们的自动压缩。【咋禁用的:通过SetOptions()API将disable_auto_compactions设置为‘true’】 |
DisableManualCompaction EnableManualCompaction |
开启和关闭手动compaction,很明显,禁用以后就不能用户主动调用compaction操作了。实际上若是对于rocksdb了解不足的话并不建议开启。 |
NumberLevels |
获取此数据库使用的层数。【当前最高层数】 |
MaxMemCompactionLevel |
如果新的压缩内存表不产生重叠,则将其推送到的最高层。 |
Level0StopWriteTrigger |
level0中将停止写入的文件数。不给列族参数的话就对默认列族操作。 |
GetName |
获取数据库名字 -- 与提供给DB :: Open()的参数完全相同的名称 |
GetEnv |
从数据库获取环境对象,rocksdb和leveldb一样将系统环境以对象的形式处理。 |
GetOptions |
获取我们对数据库设置的选项。 |
Flush |
flush操作,也是rocksdb和leveldb的区别之一,将所有memtable内容flush到磁盘,自动flush开启时会自动flush单个列族的内容,要是想flush多个列族,需要用Flush(options, column_families). |
FlushWAL |
将WAL内存缓冲区刷新到文件.如果sync为true,则此后将调用SyncWAL。 |
SyncWAL |
同步WAL。 请注意,后面带有SyncWAL()的Write()与带有sync = true的Write()并不完全相同:在后一种情况下,直到完成同步,更改才可见。当前仅在“选项”中的allow_mmap_writes = false时有效。 |
LockWAL/ UnlockWAL |
对WAL加锁,解锁。上锁后flushWAL的内容。 |
SequenceNumber |
最近转换的序列号,每次实际的key传入都会使该值加一。 |
SetPreserveDeletesSequenceNumber |
指示数据库保留序列号> =传递的seqnum的删除。如果DBOptions.preserve_deletes设置为false,则无效。该函数假定用户使用单调递增的seqnums调用此函数(否则我们不能保证某些特定的删除操作已被处理);数据成功更新后返回true,如果用户尝试调用seqnum <=当前值,则返回false。 |
DisableFileDeletions |
防止文件删除。 压缩将继续发生,但是不会删除任何过时的文件。调用这玩意多次和调用这玩意一次的效果是一样的。 |
EnableFileDeletions |
允许压缩删除过时的文件。 如果force==true,则即使之前多次调用DisableFileDeletions(),对EnableFileDeletions()的调用也将确保在调用之后启用文件删除。 如果force == false,则EnableFileDeletions仅在被调用至少与DisableFileDeletions()相同的次数之后才启用文件删除,使两个线程可以同时调用两个方法而无需同步-即仅在两个线程都调用EnableFileDeletions()之后,才启用文件删除 |
GetLiveFiles |
GetLiveFiles后跟GetSortedWalFiles可以生成无损备份 --检索数据库中所有文件的列表。 这些文件是相对于dbname的,不是绝对路径。尽管是相对路径,但文件名以“ /”开头。 manifest文件的有效大小在manifest_file_size中返回。 manifest是一个不断增长的文件,但是只有manifest_file_size指定的部分对此快照有效。 将flush_memtable设置为true会在记录【recording】活动文件之前进行刷新。当我们不想等待刷新时,可以将flush_memtable设置为false,因为刷新可能需要等待压缩才能完成,需要花费不确定的时间。 如果您有多个列族,即使flush_memtable为true,您仍然需要在GetLiveFiles之后调用GetSortedWalFiles,以补偿在刷新其他列系列时到达已经刷新的列系列的新数据 |
GetSortedWalFiles |
首先检索最早文件的所有wal文件的排序列表 |
GetCurrentWalFile |
检索有关当前wal文件的信息 请注意,该调用之后日志可能已经滚动,在这种情况下current_log_file不会指向当前日志文件。 另外,为了优化起见,current_log_file-> StartSequence将始终设置为0 |
GetCreationTimeOfOldestFile |
检索数据库中最旧文件的创建时间。仅当max_open_files = -1时,此API才有效,否则返回的Status为Status :: NotSupported()使用提供给数据库的环境设置文件创建时间。 如果数据库是从非常老的发行版创建的,则SST文件可能不具有file_creation_time属性,甚至在移至更新发行版之后,也有可能某些文件从未压缩过并且可能不具有file_creation_time属性。 在这两种情况下,file_creation_time都被视为0,这意味着该API将返回creation_time = 0,因为时间戳不会低于0。 |
GetUpdatesSince |
注意:此API尚未与WritePrepared事务保持一致。 将iter设置为位于包含seq_number的写批处理中的迭代器。如果序列号不存在,则在请求的seq_no之后的第一个可用seq_no处返回迭代器。如果迭代器有效,则返回Status :: OK必须将WAL_ttl_seconds或WAL_size_limit_MB设置为较大的值才能使用此api,否则WAL文件将被积极清除,并且迭代器可能会在读取更新之前变得无效。 |
DeleteFile |
从db目录中删除文件名,并更新内部状态以反映该状态。 ---仅支持删除sst和日志文件。 --- “名称”必须是相对于db目录的路径。 例如。 000001.sst,/ archive / 000003.log |
GetLiveFilesMetaData |
返回所有表文件的列表及其level,开始key和结束key |
GetColumnFamilyMetaData |
获取数据库指定列系列的元数据,不指定列族的话会获取默认列族的元数据。 |
IngestExternalFile |
IngestExternalFile()会将外部SST文件加载到数据库中,支持两种主要模式: (1)新文件中的重复密钥将覆盖现有密钥(默认) (2)重复的键将被跳过(设置为ingest_behind = true) 在第一种模式下,我们将尝试找到文件可以容纳的最低level,并将文件提取到该level。key范围与内存表key范围重叠的文件将要求我们在提取文件之前先刷新该内存表。 在第二种模式下,我们将始终在最底层level进行摄取 另: (1) 可以使用SstFileWriter创建外部SST文件。(2) 即使文件压缩与级别压缩不匹配,我们也会尝试将文件提取到最低级别 (3) 如果将IngestExternalFileOptions-> ingest_behind设置为true,我们总是在最底层进行摄取,为此,应该保留该最低层(请参阅DBOPtions :: allow_ingest_behind标志)。 |
IngestExternalFiles |
IngestExternalFiles()将提取多个列族的文件,并将结果自动记录到MANIFEST中。如果此函数返回OK,则必须成功完成所有列族的提取。如果此函数返回其他的,或者进程崩溃,则恢复后,非文件将被提取到数据库中。 注意,在执行此功能期间,应用程序可能会观察到混合状态。如果用户使用迭代器对列族执行范围扫描,则一个列族上的迭代器可能返回提取的数据,而另一列族上的迭代器则返回旧数据。 用户可以使用快照来获得一致的数据视图。如果您的数据库使用此API提取了多个SST文件,即args.size()> 1,则RocksDB 5.15和更早版本将无法打开它。 要求:每个arg对应于一个不同的列族:即,对于0 <= i <j <len(args),args [i] .column_family!= args [j] .column_family。 |
CreateColumnFamilyWithImport |
CreateColumnFamilyWithImport()将使用column_family_name创建一个新的列族,并将元数据中指定的外部SST文件导入该列族。 (1) 可以使用SstFileWriter创建外部SST文件。 (2) 可以从现有数据库中的特定列族导出外部SST文件。 import_options中的Option指定是复制还是移动外部文件(默认为copy)。 如果选项指定复制,则在external_file_path中管理文件是调用者的责任。当option指定移动时,调用将确保成功返回时删除external_file_path中的指定文件,并且不会在任何错误返回时修改文件。返回错误时,返回的列族句柄将为nullptr。成功返回时将出现ColumnFamily,而错误返回时将不存在。在此调用过程中,任何崩溃都可能存在ColumnFamily。 |
AddFile |
直接导入文件的方式,这种方式已经被弃用,请使用上面的方式。 |
GetPropertiesOfAllTables |
获得所有表的特征描述 |
SuggestCompactRange |
参数为列族名和起始的key,可以获得建议的压缩范围 |
StartTrace/EndTrace |
开始/停止数据库的跟踪操作 |
StartBlockCacheTrace EndBlockCacheTrace |
开始/停止跟踪块缓存访问 |
GetStatsHistory |
给定一个时间范围[start_time,end_time),设置一个StatsHistoryIterator来访问统计历史记录。 |
TryCatchUpWithPrimary |
使备份尽可能的与主存同步 |
至此,class DB的内容结束,下面是有关数据库的两个函数
DestroyDB |
销毁指定数据库的内容。使用此方法时要非常小心。 |
RepairDB |
如果无法打开数据库,则可以尝试调用此方法以尽可能多地修复数据库的内容。某些数据可能会丢失,因此在包含重要信息的数据库上调用此函数时要小心。使用此API,我们将警告并跳过与column_families中未指定的列系列相关的数据。 |
db.h文件的内容到此结束,主要有数据库整体的各种操作,包括列族相关,节点相关,数据库基础相关,以及rocksdb特有的一些操作。另外还可以实时的查看当前数据库的运行状态,通过GetProperties获取相关返回值。最后还有一些数据库通用的操作的rocksdb版本,不得不说rocksdb的功能实现的有点全面的过分了。
rocksdb代码解析-db.h的更多相关文章
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- MYSQL常见出错mysql_errno()代码解析
如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...
- Postgres中postmaster代码解析(中)
今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...
- OpenStack之虚机热迁移代码解析
OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...
- RobHess的SIFT代码解析步骤四
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- RobHess的SIFT代码解析步骤三
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- BPF CO-RE 示例代码解析
BPF CO-RE 示例代码解析 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...
- matrix_multiply代码解析
matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...
- VBA常用代码解析
031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...
随机推荐
- minkube在deban10上的安装步骤
环境准备: 所用机器为4c 16g i3 4170 1t机械硬盘 系统 debian 10 安装docker 如果已经安装并配置好可直接跳过 安装ssl sudo apt-get install ...
- Nginx区分内部与外部
目录 一.简介 二.配置 一.简介 场景: 当网站需要维护时,访问任何连接都显示维护页面 原理: 将任何访问都重定向到维护页面. 二.配置 server { listen 80; index inde ...
- Linux服务加入systemctl|service管理
一.加入systemctl 1.添加 vim /usr/lib/systemd/system/user_timejob.service # copy to /usr/lib/systemd/syste ...
- 解决pwn题目加载指定libc版本的问题
因为本地和远程的libc版本不同,pwn题目调试起来会有影响,所以来记录一下用patchelf和glibc-all-in-one来解决这个问题过程. 下载工具 下载patchelfgit clone ...
- Python旋转魔方阵
[问题描述]输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素. N=3时: 1 2 3 8 ...
- CF41C Email address 题解
Content 有一个字符串 \(s\),它满足以下要求: 只包含 ..@ 和小写字母. 不以 . 为开头或者结尾. 不以 @ 为开头或者结尾,并只能包含一个 @. 请将其进行如下操作,使得这个字符串 ...
- AT2686 [ARC080A] 4-adjacent 题解
Content 给定一个长度为 \(n\) 的数列 \(a\),请将其重新排列,使得 \(\forall i\in[1,n-1]\),都有 \(4\mid (a_i\cdot a_{i+1})\),或 ...
- windows10源码编译llvm
准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...
- C++11之重写说明符override和final
关于 本文代码演示环境: win10 + vs2017 一个困扰 之前MFC用的多了,发现一个问题: 子类窗口的某个函数是否重载了基类的函数.解决办法是: 打开基类的代码,一个个排查. 这只是一个具体 ...
- 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...