查看源代码 mnesia_frag_hash (mnesia v4.23.3)
定义 mnesia_frag_hash 回调行为
此模块为分片表的用户自定义哈希函数定义了回调行为。
为特定的分片表选择实现 mnesia_frag_hash
行为的模块,以及其他 frag_properties
一起指定。 hash_module
定义模块名称。hash_state
定义初始哈希状态。
此模块实现动态哈希,这是一种在添加新分片时可以很好地增长的哈希类型。它非常适合可扩展的哈希表。
另请参阅
概述
函数
为了更好地扩展,最好确保记录均匀分布在所有分片上,包括新分片。
NewState
与其他 frag_properties
一起存储为 hash_state
。
当使用函数 mnesia:create_table/2
创建分片表时,或者当使用 mnesia:change_table_frag/2
将普通(未分片)表转换为分片表时启动。
每当 Mnesia 需要确定某个记录属于哪个分片时启动。它通常在 read
、write
和 delete
时启动。
每当 Mnesia 需要确定哪些分片需要搜索 MatchSpec
时,就会调用此函数。它通常由 select
和 match_object
调用。
函数
-spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when NewState :: term(), IterFrags :: [integer()], AdditionalLockFrags :: [integer()].
为了更好地扩展,最好确保记录均匀分布在所有分片上,包括新分片。
NewState
与其他 frag_properties
一起存储为 hash_state
。
作为 add_frag
过程的一部分,Mnesia 迭代对应于 IterFrags
数字的所有分片,并为每个记录启动 key_to_frag_number(NewState,RecordKey)
。如果新分片与旧分片不同,则将记录移动到新分片。
由于 add_frag
过程是模式事务的一部分,因此 Mnesia 会获取受影响表的写锁。也就是说,对应于 IterFrags
和对应于 AdditionalLockFrags
的分片。
-spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when NewState :: term(), IterFrags :: [integer()], AdditionalLockFrags :: [integer()].
NewState
与其他 frag_properties
一起存储为 hash_state
。
作为 del_frag
过程的一部分,Mnesia 迭代对应于 IterFrags
数字的所有分片,并为每个记录启动 key_to_frag_number(NewState,RecordKey)
。如果新分片与旧分片不同,则将记录移动到新分片。
请注意,必须将最后一个分片中的所有记录移动到另一个分片,因为整个分片将被删除。
由于 del_frag
过程是模式事务的一部分,因此 Mnesia 会获取受影响表的写锁。也就是说,对应于 IterFrags
和对应于 AdditionalLockFrags
的分片。
当使用函数 mnesia:create_table/2
创建分片表时,或者当使用 mnesia:change_table_frag/2
将普通(未分片)表转换为分片表时启动。
请注意,作为表创建过程的一部分,函数 add_frag/2
会为每个其他分片(除了编号为 1 的分片)启动一次。
State
是 hash_state
frag_property
的初始值。NewState
与其他 frag_properties
一起存储为 hash_state
。
-spec key_to_frag_number(State, Key) -> Fragnum when State :: term(), Key :: term(), Fragnum :: integer().
每当 Mnesia 需要确定某个记录属于哪个分片时启动。它通常在 read
、write
和 delete
时启动。
-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when State :: term(), MatchSpec :: ets:match_spec(), Fragnums :: [integer()].
每当 Mnesia 需要确定哪些分片需要搜索 MatchSpec
时,就会调用此函数。它通常由 select
和 match_object
调用。