<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="../../../../doc/otp_doc.css" type="text/css"> <title>Erlang -- mnesia_frag_hash</title> </head> <body bgcolor="white" text="#000000" link="#0000ff" vlink="#ff00ff" alink="#ff0000"><div id="container"> <script id="js" type="text/javascript" language="JavaScript" src="../../../../doc/js/flipmenu/flipmenu.js"></script><script id="js2" type="text/javascript" src="../../../../doc/js/erlresolvelinks.js"></script><script language="JavaScript" type="text/javascript"> <!-- function getWinHeight() { var myHeight = 0; if( typeof( window.innerHeight ) == 'number' ) { //Non-IE myHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' myHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible myHeight = document.body.clientHeight; } return myHeight; } function setscrollpos() { var objf=document.getElementById('loadscrollpos'); document.getElementById("leftnav").scrollTop = objf.offsetTop - getWinHeight()/2; } function addEvent(obj, evType, fn){ if (obj.addEventListener){ obj.addEventListener(evType, fn, true); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else { return false; } } addEvent(window, 'load', setscrollpos); //--></script><div id="leftnav"><div class="innertube"> <img alt="Erlang logo" src="../../../../doc/erlang-logo.png"><br><small><a href="users_guide.html">User's Guide</a><br><a href="index.html">Reference Manual</a><br><a href="release_notes.html">Release Notes</a><br><a href="../pdf/mnesia-4.4.13.pdf">PDF</a><br><a href="../../../../doc/index.html">Top</a></small><p><strong>Mnesia</strong><br><strong>Reference Manual</strong><br><small>Version 4.4.13</small></p> <br><a href="javascript:openAllFlips()">Expand All</a><br><a href="javascript:closeAllFlips()">Contract All</a><p><small><strong>Table of Contents</strong></small></p> <ul class="flipMenu"> <li id="no" title="mnesia " expanded="false">mnesia<ul> <li><a href="mnesia.html"> Top of manual page </a></li> <li title="abort-1"><a href="mnesia.html#abort-1">abort/1</a></li> <li title="activate_checkpoint-1"><a href="mnesia.html#activate_checkpoint-1">activate_checkpoint/1</a></li> <li title="activity-2"><a href="mnesia.html#activity-2">activity/2</a></li> <li title="activity-4"><a href="mnesia.html#activity-4">activity/4</a></li> <li title="add_table_copy-3"><a href="mnesia.html#add_table_copy-3">add_table_copy/3</a></li> <li title="add_table_index-2"><a href="mnesia.html#add_table_index-2">add_table_index/2</a></li> <li title="all_keys-1"><a href="mnesia.html#all_keys-1">all_keys/1</a></li> <li title="async_dirty-2"><a href="mnesia.html#async_dirty-2">async_dirty/2</a></li> <li title="backup-1"><a href="mnesia.html#backup-1">backup/1</a></li> <li title="backup_checkpoint-2"><a href="mnesia.html#backup_checkpoint-2">backup_checkpoint/2</a></li> <li title="change_config-2"><a href="mnesia.html#change_config-2">change_config/2</a></li> <li title="change_table_access_mode-2"><a href="mnesia.html#change_table_access_mode-2">change_table_access_mode/2</a></li> <li title="change_table_copy_type-3"><a href="mnesia.html#change_table_copy_type-3">change_table_copy_type/3</a></li> <li title="change_table_load_order-2"><a href="mnesia.html#change_table_load_order-2">change_table_load_order/2</a></li> <li title="clear_table-1"><a href="mnesia.html#clear_table-1">clear_table/1</a></li> <li title="create_schema-1"><a href="mnesia.html#create_schema-1">create_schema/1</a></li> <li title="create_table-2"><a href="mnesia.html#create_table-2">create_table/2</a></li> <li title="deactivate_checkpoint-1"><a href="mnesia.html#deactivate_checkpoint-1">deactivate_checkpoint/1</a></li> <li title="del_table_copy-2"><a href="mnesia.html#del_table_copy-2">del_table_copy/2</a></li> <li title="del_table_index-2"><a href="mnesia.html#del_table_index-2">del_table_index/2</a></li> <li title="delete-1"><a href="mnesia.html#delete-1">delete/1</a></li> <li title="delete-3"><a href="mnesia.html#delete-3">delete/3</a></li> <li title="delete_object-1"><a href="mnesia.html#delete_object-1">delete_object/1</a></li> <li title="delete_object-3"><a href="mnesia.html#delete_object-3">delete_object/3</a></li> <li title="delete_schema-1"><a href="mnesia.html#delete_schema-1">delete_schema/1</a></li> <li title="delete_table-1"><a href="mnesia.html#delete_table-1">delete_table/1</a></li> <li title="dirty_all_keys-1"><a href="mnesia.html#dirty_all_keys-1">dirty_all_keys/1</a></li> <li title="dirty_delete-1"><a href="mnesia.html#dirty_delete-1">dirty_delete/1</a></li> <li title="dirty_delete-2"><a href="mnesia.html#dirty_delete-2">dirty_delete/2</a></li> <li title="dirty_delete_object-1"><a href="mnesia.html#dirty_delete_object-1">dirty_delete_object/1</a></li> <li title="dirty_delete_object-2"><a href="mnesia.html#dirty_delete_object-2">dirty_delete_object/2</a></li> <li title="dirty_first-1"><a href="mnesia.html#dirty_first-1">dirty_first/1</a></li> <li title="dirty_index_match_object-2"><a href="mnesia.html#dirty_index_match_object-2">dirty_index_match_object/2</a></li> <li title="dirty_index_match_object-3"><a href="mnesia.html#dirty_index_match_object-3">dirty_index_match_object/3</a></li> <li title="dirty_index_read-3"><a href="mnesia.html#dirty_index_read-3">dirty_index_read/3</a></li> <li title="dirty_last-1"><a href="mnesia.html#dirty_last-1">dirty_last/1</a></li> <li title="dirty_match_object-1"><a href="mnesia.html#dirty_match_object-1">dirty_match_object/1</a></li> <li title="dirty_match_object-2"><a href="mnesia.html#dirty_match_object-2">dirty_match_object/2</a></li> <li title="dirty_next-2"><a href="mnesia.html#dirty_next-2">dirty_next/2</a></li> <li title="dirty_prev-2"><a href="mnesia.html#dirty_prev-2">dirty_prev/2</a></li> <li title="dirty_read-1"><a href="mnesia.html#dirty_read-1">dirty_read/1</a></li> <li title="dirty_read-2"><a href="mnesia.html#dirty_read-2">dirty_read/2</a></li> <li title="dirty_select-2"><a href="mnesia.html#dirty_select-2">dirty_select/2</a></li> <li title="dirty_slot-2"><a href="mnesia.html#dirty_slot-2">dirty_slot/2</a></li> <li title="dirty_update_counter-2"><a href="mnesia.html#dirty_update_counter-2">dirty_update_counter/2</a></li> <li title="dirty_update_counter-3"><a href="mnesia.html#dirty_update_counter-3">dirty_update_counter/3</a></li> <li title="dirty_write-1"><a href="mnesia.html#dirty_write-1">dirty_write/1</a></li> <li title="dirty_write-2"><a href="mnesia.html#dirty_write-2">dirty_write/2</a></li> <li title="dump_log-0"><a href="mnesia.html#dump_log-0">dump_log/0</a></li> <li title="dump_tables-1"><a href="mnesia.html#dump_tables-1">dump_tables/1</a></li> <li title="dump_to_textfile-1"><a href="mnesia.html#dump_to_textfile-1">dump_to_textfile/1</a></li> <li title="error_description-1"><a href="mnesia.html#error_description-1">error_description/1</a></li> <li title="ets-2"><a href="mnesia.html#ets-2">ets/2</a></li> <li title="first-1"><a href="mnesia.html#first-1">first/1</a></li> <li title="foldl-3"><a href="mnesia.html#foldl-3">foldl/3</a></li> <li title="foldr-3"><a href="mnesia.html#foldr-3">foldr/3</a></li> <li title="force_load_table-1"><a href="mnesia.html#force_load_table-1">force_load_table/1</a></li> <li title="index_match_object-2"><a href="mnesia.html#index_match_object-2">index_match_object/2</a></li> <li title="index_match_object-4"><a href="mnesia.html#index_match_object-4">index_match_object/4</a></li> <li title="index_read-3"><a href="mnesia.html#index_read-3">index_read/3</a></li> <li title="info-0"><a href="mnesia.html#info-0">info/0</a></li> <li title="install_fallback-1"><a href="mnesia.html#install_fallback-1">install_fallback/1</a></li> <li title="install_fallback-1"><a href="mnesia.html#install_fallback-1">install_fallback/1</a></li> <li title="install_fallback-2"><a href="mnesia.html#install_fallback-2">install_fallback/2</a></li> <li title="is_transaction-0"><a href="mnesia.html#is_transaction-0">is_transaction/0</a></li> <li title="last-1"><a href="mnesia.html#last-1">last/1</a></li> <li title="load_textfile-1"><a href="mnesia.html#load_textfile-1">load_textfile/1</a></li> <li title="lock-2"><a href="mnesia.html#lock-2">lock/2</a></li> <li title="match_object-1"><a href="mnesia.html#match_object-1">match_object/1</a></li> <li title="match_object-3"><a href="mnesia.html#match_object-3">match_object/3</a></li> <li title="move_table_copy-3"><a href="mnesia.html#move_table_copy-3">move_table_copy/3</a></li> <li title="next-2"><a href="mnesia.html#next-2">next/2</a></li> <li title="prev-2"><a href="mnesia.html#prev-2">prev/2</a></li> <li title="read-1"><a href="mnesia.html#read-1">read/1</a></li> <li title="read-2"><a href="mnesia.html#read-2">read/2</a></li> <li title="read-3"><a href="mnesia.html#read-3">read/3</a></li> <li title="read_lock_table-1"><a href="mnesia.html#read_lock_table-1">read_lock_table/1</a></li> <li title="report_event-1"><a href="mnesia.html#report_event-1">report_event/1</a></li> <li title="restore-2"><a href="mnesia.html#restore-2">restore/2</a></li> <li title="s_delete-1"><a href="mnesia.html#s_delete-1">s_delete/1</a></li> <li title="s_delete_object-1"><a href="mnesia.html#s_delete_object-1">s_delete_object/1</a></li> <li title="s_write-1"><a href="mnesia.html#s_write-1">s_write/1</a></li> <li title="schema-0"><a href="mnesia.html#schema-0">schema/0</a></li> <li title="schema-1"><a href="mnesia.html#schema-1">schema/1</a></li> <li title="select-2"><a href="mnesia.html#select-2">select/2</a></li> <li title="select-4"><a href="mnesia.html#select-4">select/4</a></li> <li title="select-1"><a href="mnesia.html#select-1">select/1</a></li> <li title="set_debug_level-1"><a href="mnesia.html#set_debug_level-1">set_debug_level/1</a></li> <li title="set_master_nodes-1"><a href="mnesia.html#set_master_nodes-1">set_master_nodes/1</a></li> <li title="set_master_nodes-2"><a href="mnesia.html#set_master_nodes-2">set_master_nodes/2</a></li> <li title="snmp_close_table-1"><a href="mnesia.html#snmp_close_table-1">snmp_close_table/1</a></li> <li title="snmp_get_mnesia_key-2"><a href="mnesia.html#snmp_get_mnesia_key-2">snmp_get_mnesia_key/2</a></li> <li title="snmp_get_next_index-2"><a href="mnesia.html#snmp_get_next_index-2">snmp_get_next_index/2</a></li> <li title="snmp_get_row-2"><a href="mnesia.html#snmp_get_row-2">snmp_get_row/2</a></li> <li title="snmp_open_table-2"><a href="mnesia.html#snmp_open_table-2">snmp_open_table/2</a></li> <li title="start-0"><a href="mnesia.html#start-0">start/0</a></li> <li title="stop-0"><a href="mnesia.html#stop-0">stop/0</a></li> <li title="subscribe-1"><a href="mnesia.html#subscribe-1">subscribe/1</a></li> <li title="sync_dirty-2"><a href="mnesia.html#sync_dirty-2">sync_dirty/2</a></li> <li title="sync_transaction-3"><a href="mnesia.html#sync_transaction-3">sync_transaction/3</a></li> <li title="system_info-1"><a href="mnesia.html#system_info-1">system_info/1</a></li> <li title="table-1"><a href="mnesia.html#table-1">table/1</a></li> <li title="table_info-2"><a href="mnesia.html#table_info-2">table_info/2</a></li> <li title="transaction-2"><a href="mnesia.html#transaction-2">transaction/2</a></li> <li title="transform_table-4"><a href="mnesia.html#transform_table-4">transform_table/4</a></li> <li title="transform_table-3"><a href="mnesia.html#transform_table-3">transform_table/3</a></li> <li title="traverse_backup-4"><a href="mnesia.html#traverse_backup-4">traverse_backup/4</a></li> <li title="uninstall_fallback-0"><a href="mnesia.html#uninstall_fallback-0">uninstall_fallback/0</a></li> <li title="uninstall_fallback-1"><a href="mnesia.html#uninstall_fallback-1">uninstall_fallback/1</a></li> <li title="unsubscribe-1"><a href="mnesia.html#unsubscribe-1">unsubscribe/1</a></li> <li title="wait_for_tables-2"><a href="mnesia.html#wait_for_tables-2">wait_for_tables/2</a></li> <li title="wread-1"><a href="mnesia.html#wread-1">wread/1</a></li> <li title="write-1"><a href="mnesia.html#write-1">write/1</a></li> <li title="write-3"><a href="mnesia.html#write-3">write/3</a></li> <li title="write_lock_table-1"><a href="mnesia.html#write_lock_table-1">write_lock_table/1</a></li> </ul> </li> <li id="loadscrollpos" title="mnesia_frag_hash " expanded="true">mnesia_frag_hash<ul> <li><a href="mnesia_frag_hash.html"> Top of manual page </a></li> <li title="init_state-2"><a href="mnesia_frag_hash.html#init_state-2">init_state/2</a></li> <li title="add_frag-1"><a href="mnesia_frag_hash.html#add_frag-1">add_frag/1</a></li> <li title="del_frag-1"><a href="mnesia_frag_hash.html#del_frag-1">del_frag/1</a></li> <li title="key_to_frag_number-2"><a href="mnesia_frag_hash.html#key_to_frag_number-2">key_to_frag_number/2</a></li> <li title="match_spec_to_frag_numbers-2"><a href="mnesia_frag_hash.html#match_spec_to_frag_numbers-2">match_spec_to_frag_numbers/2</a></li> </ul> </li> <li id="no" title="mnesia_registry " expanded="false">mnesia_registry<ul> <li><a href="mnesia_registry.html"> Top of manual page </a></li> <li title="create_table-1"><a href="mnesia_registry.html#create_table-1">create_table/1</a></li> <li title="create_table-2"><a href="mnesia_registry.html#create_table-2">create_table/2</a></li> </ul> </li> </ul> </div></div> <div id="content"> <div class="innertube"> <!-- refpage --><center><h1>mnesia_frag_hash</h1></center> <h3>MODULE</h3> <div class="REFBODY">mnesia_frag_hash</div> <h3>MODULE SUMMARY</h3> <div class="REFBODY">Defines mnesia_frag_hash callback behaviour</div> <h3>DESCRIPTION</h3> <div class="REFBODY"><p> <p>The module <span class="code">mnesia_frag_hash</span> defines a callback behaviour for user defined hash functions of fragmented tables.</p> <p>Which module that is selected to implement the <span class="code">mnesia_frag_hash</span> behaviour for a particular fragmented table is specified together with the other <span class="code">frag_properties</span>. The <span class="code">hash_module</span> defines the module name. The <span class="code">hash_state</span> defines the initial hash state.</p> <p>It implements dynamic hashing which is a kind of hashing that grows nicely when new fragments are added. It is well suited for scalable hash tables</p> </p></div> <h3>EXPORTS</h3> <p><a name="init_state-2"><span class="bold_code">init_state(Tab, State) -> NewState | abort(Reason)</span></a><br></p> <div class="REFBODY"> <p>Types:</p> <div class="REFTYPES"> <span class="bold_code">Tab = atom()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">State = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">NewState = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">Reason = term()</span><br> </div> </div> <div class="REFBODY"><p> <p>This function is invoked when a fragmented table is created with <span class="code">mnesia:create_table/2</span> or when a normal (un-fragmented) table is converted to be a fragmented table with <span class="code">mnesia:change_table_frag/2</span>.</p> <p>Note that the <span class="code">add_frag/2</span> function will be invoked one time each for the rest of the fragments (all but number 1) as a part of the table creation procedure.</p> <p><span class="code">State</span> is the initial value of the <span class="code">hash_state</span><span class="code">frag_property</span>. The <span class="code">NewState</span> will be stored as <span class="code">hash_state</span> among the other <span class="code">frag_properties</span>. </p> </p></div> <p><a name="add_frag-1"><span class="bold_code">add_frag(State) -> {NewState, IterFrags, AdditionalLockFrags} | abort(Reason)</span></a><br></p> <div class="REFBODY"> <p>Types:</p> <div class="REFTYPES"> <span class="bold_code">State = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">NewState = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">IterFrags = [integer()]</span><br> </div> <div class="REFTYPES"> <span class="bold_code">AdditionalLockFrags = [integer()]</span><br> </div> <div class="REFTYPES"> <span class="bold_code">Reason = term()</span><br> </div> </div> <div class="REFBODY"><p> <p>In order to scale well, it is a good idea ensure that the records are evenly distributed over all fragments including the new one.</p> <p>The <span class="code">NewState</span> will be stored as <span class="code">hash_state</span> among the other <span class="code">frag_properties</span>. </p> <p>As a part of the <span class="code">add_frag</span> procedure, Mnesia will iterate over all fragments corresponding to the <span class="code">IterFrags</span> numbers and invoke <span class="code">key_to_frag_number(NewState,RecordKey)</span> for each record. If the new fragment differs from the old fragment, the record will be moved to the new fragment.</p> <p>As the <span class="code">add_frag</span> procedure is a part of a schema transaction Mnesia will acquire a write locks on the affected tables. That is both the fragments corresponding to <span class="code">IterFrags</span> and those corresponding to <span class="code">AdditionalLockFrags</span>.</p> </p></div> <p><a name="del_frag-1"><span class="bold_code">del_frag(State) -> {NewState, IterFrags, AdditionalLockFrags} | abort(Reason)</span></a><br></p> <div class="REFBODY"> <p>Types:</p> <div class="REFTYPES"> <span class="bold_code">State = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">NewState = term()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">IterFrags = [integer()]</span><br> </div> <div class="REFTYPES"> <span class="bold_code">AdditionalLockFrags = [integer()]</span><br> </div> <div class="REFTYPES"> <span class="bold_code">Reason = term()</span><br> </div> </div> <div class="REFBODY"><p> <p>The <span class="code">NewState</span> will be stored as <span class="code">hash_state</span> among the other <span class="code">frag_properties</span>. </p> <p>As a part of the <span class="code">del_frag</span> procedure, Mnesia will iterate over all fragments corresponding to the <span class="code">IterFrags</span> numbers and invoke <span class="code">key_to_frag_number(NewState,RecordKey)</span> for each record. If the new fragment differs from the old fragment, the record will be moved to the new fragment.</p> <p>Note that all records in the last fragment must be moved to another fragment as the entire fragment will be deleted.</p> <p>As the <span class="code">del_frag</span> procedure is a part of a schema transaction Mnesia will acquire a write locks on the affected tables. That is both the fragments corresponding to <span class="code">IterFrags</span> and those corresponding to <span class="code">AdditionalLockFrags</span>.</p> </p></div> <p><a name="key_to_frag_number-2"><span class="bold_code">key_to_frag_number(State, Key) -> FragNum | abort(Reason)</span></a><br></p> <div class="REFBODY"> <p>Types:</p> <div class="REFTYPES"> <span class="bold_code">FragNum = integer()()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">Reason = term()</span><br> </div> </div> <div class="REFBODY"><p> <p>This function is invoked whenever Mnesia needs to determine which fragment a certain record belongs to. It is typically invoked at read, write and delete.</p> </p></div> <p><a name="match_spec_to_frag_numbers-2"><span class="bold_code">match_spec_to_frag_numbers(State, MatchSpec) -> FragNums | abort(Reason)</span></a><br></p> <div class="REFBODY"> <p>Types:</p> <div class="REFTYPES"> <span class="bold_code">MatcSpec = ets_select_match_spec()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">FragNums = [FragNum]</span><br> </div> <div class="REFTYPES"> <span class="bold_code">FragNum = integer()</span><br> </div> <div class="REFTYPES"> <span class="bold_code">Reason = term()</span><br> </div> </div> <div class="REFBODY"><p> <p>This function is invoked whenever Mnesia needs to determine which fragments that needs to be searched for a MatchSpec. It is typically invoked at select and match_object.</p> </p></div> <h3><a name="id2285957">See Also</a></h3> <div class="REFBODY"> <p>mnesia(3) </p> </div> </div> <div class="footer"> <hr> <p>Copyright © 1997-2010 Ericsson AB. All Rights Reserved.</p> </div> </div> </div></body> </html>