19 #include <sys/types.h>    28 #include "sion_error_handler.h"    37 #define POS_BEHIND_END -302     74 #define DFUNCTION "_sion_keyvalue_keymngr_init"    78   DPRINTFP((2, DFUNCTION, -1, 
"enter init size=%d\n",size));
    81   if (keymngr == NULL) {
    82     _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue keymngr of size %lu , aborting ...\n", (
unsigned long) 
sizeof(
_sion_keyvalue_keymngr));
    94   keymngr->
key_table     = _sion_keyvalue_table_init(size);
    96     _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table of for %lu entries , aborting ...\n", (
unsigned long) size);
   101   DPRINTFP((2, DFUNCTION, -1, 
"leave\n"));
   107 #define DFUNCTION "_sion_keyvalue_keymngr_destroy"   109    size_t rc=SION_SUCCESS;
   112    DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   113    block = (*keymngr)->block_inwriteorder_head;
   114    while (block != NULL) {
   120    if((*keymngr)->key_table) {
   121      rc=_sion_keyvalue_table_destroy(&((*keymngr)->key_table));
   126    DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   131 #define DFUNCTION "_sion_keyvalue_keymngr_add_block"   132 int _sion_keyvalue_keymngr_add_block(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key, 
size_t offset, 
size_t len) {
   133   size_t rc=SION_SUCCESS;
   138   DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   141   p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
   147       return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table entry, aborting ...\n"));
   163     rc=_sion_keyvalue_table_store(keymngr->
key_table,key,p);
   164     if (rc != SION_SUCCESS) 
return(rc);
   172   if (new_block == NULL) {
   173     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table block entry, aborting ...\n"));
   175   new_block->
entry  = entry;
   176   new_block->
offset = offset;
   177   new_block->
len    = len;
   178   new_block->
next   = NULL;     
   218   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   223 #define DFUNCTION "_sion_keyvalue_keymngr_update_read_pos"   225                        size_t bytes_read, sion_int64 current_pos) {
   226   size_t rc=SION_SUCCESS;
   233       DPRINTFP((2, DFUNCTION, -1, 
"its the last key %ld\n",(
long) key));
   240     DPRINTFP((2, DFUNCTION, -1, 
"lookup for key %ld\n",(
long) key));
   241     p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
   243       DPRINTFP((2, DFUNCTION, -1, 
"key %ld found\n",(
long) key));
   246       DPRINTFP((2, DFUNCTION, -1, 
"key %ld not found\n",(
long) key));
   252     if(bytes_read<=entry->bytes_left) {
   255       DPRINTFP((2, DFUNCTION, -1, 
"advance key counters by %ld bytes\n",(
long) bytes_read));
   261     DPRINTFP((2, DFUNCTION, -1, 
"block is completely read, move to next if possible\n"));
   270       DPRINTFP((2, DFUNCTION, -1, 
"another block found (%ld,%ld)\n", (
long) entry->
current_pos, (
long) entry->
bytes_left ));
   274       DPRINTFP((2, DFUNCTION, -1, 
"no other block found so far ...\n"));
   282       DPRINTFP((2, DFUNCTION, -1, 
"bytes_read > entry->bytes_left (%zu > %zu)\n", bytes_read, entry->
bytes_left));
   287   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   294 #define DFUNCTION "_sion_keyvalue_keymngr_set_next_scan_pos"   296   size_t rc=SION_SUCCESS;
   297   DPRINTFP((2, DFUNCTION, -1, 
"enter pos=%ld\n",rc, (
long) pos));
   299   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d next_scan_pos=%ld\n",rc, (
long) keymngr->
next_scan_pos));
   304 #define DFUNCTION "_sion_keyvalue_keymngr_get_next_scan_pos"   306   size_t rc=SION_SUCCESS;
   307   DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   315   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d pos=%ld\n",rc, (
long) *pos));
   320 #define DFUNCTION "_sion_keyvalue_keymngr_set_scan_done"   322   size_t rc=SION_SUCCESS;
   324   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d scan_done=%d\n",rc, (
int) keymngr->
scan_done));
   329 #define DFUNCTION "_sion_keyvalue_keymngr_is_scan_done"   332   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   338 #define DFUNCTION "_sion_keyvalue_keymngr_lookup"   339 int _sion_keyvalue_keymngr_lookup(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key, 
size_t *current_pos, 
size_t *bytes_left) {
   340   size_t rc=SION_SUCCESS;
   344   DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   347   p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
   353     DPRINTFP((2, DFUNCTION, -1, 
"found entry with %d blocks\n",entry->
blocks_avail));
   358       DPRINTFP((2, DFUNCTION, -1, 
"found block #%d --> (%ld,%ld)\n",(
int) entry->
blocklist_current->
blocknum,(
long) *current_pos,(
long) *bytes_left));
   365   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   371 #define DFUNCTION "_sion_keyvalue_keymngr_lookup_and_set_pos"   372 int _sion_keyvalue_keymngr_lookup_and_set_pos(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key, 
int blocknum, sion_int64 posinblock,
   373                           size_t *current_pos, 
size_t *bytes_left) {
   374   size_t rc=SION_SUCCESS;
   377   sion_int64 absolutepos;
   380   DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   386   p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
   389     DPRINTFP((2, DFUNCTION, -1, 
"leave key not found rc=%d\n",rc));
   394   DPRINTFP((2, DFUNCTION, -1, 
"found entry with %d blocks\n",entry->
blocks_avail));
   400       DPRINTFP((2, DFUNCTION, -1, 
"dummy call (SION_CURRENT_BLOCK,SION_CURRENT_POS), leave position unchanged rc=%d\n",rc));
   404     DPRINTFP((2, DFUNCTION, -1, 
"leave, seek position is already current pos in block %d\n",blocknum));
   407     DPRINTFP((2, DFUNCTION, -1, 
"leave, currently behind last block rc=%d\n",rc));
   414     DPRINTFP((2, DFUNCTION, -1, 
"seek in current_block request\n"));
   420       DPRINTFP((2, DFUNCTION, -1, 
"seek position is in block %d\n",blocknum));
   425       DPRINTFP((2, DFUNCTION, -1, 
"leave, currently behind last block rc=%d\n",rc));
   435     if ( (blocknum<0) || (blocknum >= entry->
blocks_avail)) {
   437       DPRINTFP((2, DFUNCTION, -1, 
"leave, blocknum outside known range rc=%d\n",rc));
   449     while ((block!=NULL) && (blocknum != block->
blocknum)) {
   453       DPRINTFP((2, DFUNCTION, -1, 
"internal error: somethink went wrong, seek, aborting, blocknum position block is NULL\n"));
   454       return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, seek, aborting ...\n"));
   458     DPRINTFP((2, DFUNCTION, -1, 
"position is in this block %d\n",block->
blocknum));
   460     if((posinblock>=0) && (posinblock < block->len)) {
   464       DPRINTFP((2, DFUNCTION, -1, 
"set current pointer for entry: current_pos=%d bytes_left=%d blocknum=%d\n",(
int) entry->
current_pos,(
int) entry->
bytes_left, (
int) block->
blocknum));
   466       DPRINTFP((2, DFUNCTION, -1, 
"wrong pos in block %d\n",(
int) posinblock));
   472     absolutepos=posinblock;
   473     if ( (absolutepos < 0) 
   477       DPRINTFP((2, DFUNCTION, -1, 
"leave, absolute position outside known range rc=%d\n",rc));
   493       DPRINTFP((2, DFUNCTION, -1, 
"internal error: somethink went wrong, seek, aborting, absolute position block is NULL\n"));
   494       return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, seek, aborting ...\n"));
   503     DPRINTFP((2, DFUNCTION, -1, 
"set current pointer for entry: current_pos=%d bytes_left=%d blocknum=%d\n",(
int) entry->
current_pos,(
int) entry->
bytes_left, (
int) block->
blocknum));
   509   DPRINTFP((2, DFUNCTION, -1, 
"found block --> (%ld,%ld)\n",(
long) *current_pos,(
long) *bytes_left));
   511   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   517 #define DFUNCTION "_sion_keyvalue_keymngr_iterator_reset"   522     DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   526     DPRINTFP((2, DFUNCTION, -1, 
"leave\n"));
   534 #define DFUNCTION "_sion_keyvalue_keymngr_iterator_next"   535   int _sion_keyvalue_keymngr_iterator_next(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t *key, 
size_t *current_pos, 
size_t *offset, 
size_t *len) {
   539     DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   554       return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, checking end of list , aborting ...\n"));
   581     DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   586 #define DFUNCTION "_sion_keyvalue_keymngr_key_list_iterator_reset"   591     DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   593     _sion_keyvalue_table_iterator_reset(keymngr->
key_table);
   595     DPRINTFP((2, DFUNCTION, -1, 
"leave\n"));
   600 #define DFUNCTION "_sion_keyvalue_keymngr_key_list_iterator_next"   601   int _sion_keyvalue_keymngr_key_list_iterator_next(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t *key) {
   605     DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   607     rc=_sion_keyvalue_table_iterator_next_in_store_order(keymngr->
key_table, key, &data);
   609     DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d key=%ld\n",rc, (
long) *key));
   616 #define DFUNCTION "_sion_keyvalue_keymngr_dup"   623     DPRINTFP((2, DFUNCTION, -1, 
"enter dup\n"));
   626     if (keymngr == NULL) {
   627       _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue keymngr of size %lu , aborting ...\n", (
unsigned long) 
sizeof(
_sion_keyvalue_keymngr));
   639     keymngr->size = keymngr_orig->size;
   640     keymngr->
key_table = _sion_keyvalue_table_init(keymngr_orig->size);
   642       _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table of for %lu entries , aborting ...\n", (
unsigned long) keymngr->size);
   649       DPRINTFP((2, DFUNCTION, -1, 
"start duplicating entry for key %llu\n",sel_key));
   651       p=_sion_keyvalue_table_lookup(keymngr_orig->
key_table,sel_key);
   657       DPRINTFP((2, DFUNCTION, -1, 
"add block to keymngr key=%ld offset=%ld len=%ld\n",
   659       _sion_keyvalue_keymngr_add_block(keymngr,block->
entry->
key,block->
offset,block->
len);
   663       DPRINTFP((2, DFUNCTION, -1, 
"end duplicating one entry\n"));
   667       DPRINTFP((2, DFUNCTION, -1, 
"start duplicating all entries\n"));
   671     DPRINTFP((2, DFUNCTION, -1, 
"add block to keymngr key=%ld offset=%ld len=%ld\n",
   673     _sion_keyvalue_keymngr_add_block(keymngr,block->
entry->
key,block->
offset,block->
len);
   676       DPRINTFP((2, DFUNCTION, -1, 
"end duplicating entries\n"));
   679     DPRINTFP((2, DFUNCTION, -1, 
"leave\n"));
   684 #define DFUNCTION "_sion_keyvalue_keymngr_key_get_stat"   686   size_t rc=SION_SUCCESS;
   690   DPRINTFP((2, DFUNCTION, -1, 
"enter key=%ld\n",(
long) key));
   693   p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
   698     DPRINTFP((2, DFUNCTION, -1, 
"found entry with %d blocks\n",entry->
blocks_avail));
   701       keystat->key        = (uint64_t) key;
   705       DPRINTFP((2, DFUNCTION, -1, 
"found entry for key %ld (%ld,%ld)\n",(
long) keystat->key, (
long) keystat->num_blocks, (
long) keystat->total_size ));
   711   DPRINTFP((2, DFUNCTION, -1, 
"leave rc=%d\n",rc));
   717 #define DFUNCTION "_sion_keyvalue_keymngr_key_get_sizeof"   719   size_t bytes=0, help_bytes;
   723   DPRINTFP((2, DFUNCTION, -1, 
"enter\n"));
   725   DPRINTFP((2, DFUNCTION, -1, 
" sizeof key_keymgr=          %5d\n", help_bytes));
   729   while (block != NULL) {
   733   DPRINTFP((2, DFUNCTION, -1, 
" sizeof key_blocks=          %5d\n", help_bytes));
   737     help_bytes=_sion_keyvalue_table_get_size(keymngr->
key_table);
   738     DPRINTFP((2, DFUNCTION, -1, 
" sizeof key_blocks=          %5d\n", help_bytes));
   742   DPRINTFP((2, DFUNCTION, -1, 
"leave bytes=%d\n",bytes));
 
_sion_key_block_entry * next
_sion_key_block_entry * next_inwriteorder
#define SION_DESCSTATE_DUP_SEL_RANK_KEY
_sion_key_block_entry * blocklist_current
_sion_keyvalue_table * key_table
#define SION_ABSOLUTE_POS
_sion_key_block_entry * block_inwriteorder_head
_sion_key_block_entry * blocklist_head
_sion_key_block_entry * block_inwriteorder_tail
_sion_key_entry * lastentry_used
#define SION_CURRENT_BLOCK
_sion_key_block_entry * blocklist_tail
_sion_key_block_entry * iterator_last_block