查看源代码 mnesia_frag_hash (mnesia v4.23.3)

定义 mnesia_frag_hash 回调行为

此模块为分片表的用户自定义哈希函数定义了回调行为。

为特定的分片表选择实现 mnesia_frag_hash 行为的模块,以及其他 frag_properties 一起指定。 hash_module 定义模块名称。hash_state 定义初始哈希状态。

此模块实现动态哈希,这是一种在添加新分片时可以很好地增长的哈希类型。它非常适合可扩展的哈希表。

另请参阅

mnesia

概述

函数

为了更好地扩展,最好确保记录均匀分布在所有分片上,包括新分片。

NewState 与其他 frag_properties 一起存储为 hash_state

当使用函数 mnesia:create_table/2 创建分片表时,或者当使用 mnesia:change_table_frag/2 将普通(未分片)表转换为分片表时启动。

每当 Mnesia 需要确定某个记录属于哪个分片时启动。它通常在 readwritedelete 时启动。

每当 Mnesia 需要确定哪些分片需要搜索 MatchSpec 时,就会调用此函数。它通常由 selectmatch_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 的分片。

链接到此函数

init_state(Tab, State)

查看源代码
-spec init_state(Tab, State) -> NewState when Tab :: atom(), State :: term(), NewState :: term().

当使用函数 mnesia:create_table/2 创建分片表时,或者当使用 mnesia:change_table_frag/2 将普通(未分片)表转换为分片表时启动。

请注意,作为表创建过程的一部分,函数 add_frag/2 会为每个其他分片(除了编号为 1 的分片)启动一次。

Statehash_state frag_property 的初始值。NewState 与其他 frag_properties 一起存储为 hash_state

链接到此函数

key_to_frag_number(State, Key)

查看源代码
-spec key_to_frag_number(State, Key) -> Fragnum
                            when State :: term(), Key :: term(), Fragnum :: integer().

每当 Mnesia 需要确定某个记录属于哪个分片时启动。它通常在 readwritedelete 时启动。

链接到此函数

match_spec_to_frag_numbers(State, MatchSpec)

查看源代码
-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums
                                    when
                                        State :: term(),
                                        MatchSpec :: ets:match_spec(),
                                        Fragnums :: [integer()].

每当 Mnesia 需要确定哪些分片需要搜索 MatchSpec 时,就会调用此函数。它通常由 selectmatch_object 调用。