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