19 #include <sys/types.h> 36 #define POS_BEHIND_END -302 73 #define DFUNCTION "_sion_keyvalue_keymngr_init" 77 DPRINTFP((2, DFUNCTION, -1,
"enter init size=%d\n",size));
80 if (keymngr == NULL) {
93 keymngr->
key_table = _sion_keyvalue_table_init(size);
95 _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table of for %lu entries , aborting ...\n", (
unsigned long) size);
100 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
106 #define DFUNCTION "_sion_keyvalue_keymngr_destroy" 108 size_t rc=SION_SUCCESS;
111 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
113 while (block != NULL) {
120 rc=_sion_keyvalue_table_destroy(keymngr->
key_table);
125 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
130 #define DFUNCTION "_sion_keyvalue_keymngr_add_block" 131 int _sion_keyvalue_keymngr_add_block(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key,
size_t offset,
size_t len) {
132 size_t rc=SION_SUCCESS;
137 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
140 p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
146 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table entry, aborting ...\n"));
162 rc=_sion_keyvalue_table_store(keymngr->
key_table,key,p);
163 if (rc != SION_SUCCESS)
return(rc);
171 if (new_block == NULL) {
172 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table block entry, aborting ...\n"));
174 new_block->
entry = entry;
175 new_block->
offset = offset;
176 new_block->
len = len;
177 new_block->
next = NULL;
217 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
222 #define DFUNCTION "_sion_keyvalue_keymngr_update_read_pos" 224 size_t bytes_read, sion_int64 current_pos) {
225 size_t rc=SION_SUCCESS;
232 DPRINTFP((2, DFUNCTION, -1,
"its the last key %ld\n",(
long) key));
239 DPRINTFP((2, DFUNCTION, -1,
"lookup for key %ld\n",(
long) key));
240 p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
242 DPRINTFP((2, DFUNCTION, -1,
"key %ld found\n",(
long) key));
245 DPRINTFP((2, DFUNCTION, -1,
"key %ld not found\n",(
long) key));
251 if(bytes_read<=entry->bytes_left) {
254 DPRINTFP((2, DFUNCTION, -1,
"advance key counters by %ld bytes\n",(
long) bytes_read));
260 DPRINTFP((2, DFUNCTION, -1,
"block is completely read, move to next if possible\n"));
269 DPRINTFP((2, DFUNCTION, -1,
"another block found (%ld,%ld)\n", (
long) entry->
current_pos, (
long) entry->
bytes_left ));
273 DPRINTFP((2, DFUNCTION, -1,
"no other block found so far ...\n"));
281 DPRINTFP((2, DFUNCTION, -1,
"bytes_read > entry->bytes_left (%zu > %zu)\n", bytes_read, entry->
bytes_left));
286 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
293 #define DFUNCTION "_sion_keyvalue_keymngr_set_next_scan_pos" 295 size_t rc=SION_SUCCESS;
296 DPRINTFP((2, DFUNCTION, -1,
"enter pos=%ld\n",rc, (
long) pos));
298 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d next_scan_pos=%ld\n",rc, (
long) keymngr->
next_scan_pos));
303 #define DFUNCTION "_sion_keyvalue_keymngr_get_next_scan_pos" 305 size_t rc=SION_SUCCESS;
306 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
314 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d pos=%ld\n",rc, (
long) *pos));
319 #define DFUNCTION "_sion_keyvalue_keymngr_set_scan_done" 321 size_t rc=SION_SUCCESS;
323 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d scan_done=%d\n",rc, (
int) keymngr->
scan_done));
328 #define DFUNCTION "_sion_keyvalue_keymngr_is_scan_done" 331 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
337 #define DFUNCTION "_sion_keyvalue_keymngr_lookup" 338 int _sion_keyvalue_keymngr_lookup(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key,
size_t *current_pos,
size_t *bytes_left) {
339 size_t rc=SION_SUCCESS;
343 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
346 p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
352 DPRINTFP((2, DFUNCTION, -1,
"found entry with %d blocks\n",entry->
blocks_avail));
357 DPRINTFP((2, DFUNCTION, -1,
"found block #%d --> (%ld,%ld)\n",(
int) entry->
blocklist_current->
blocknum,(
long) *current_pos,(
long) *bytes_left));
364 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
370 #define DFUNCTION "_sion_keyvalue_keymngr_lookup_and_set_pos" 371 int _sion_keyvalue_keymngr_lookup_and_set_pos(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t key,
int blocknum, sion_int64 posinblock,
372 size_t *current_pos,
size_t *bytes_left) {
373 size_t rc=SION_SUCCESS;
376 sion_int64 absolutepos;
379 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
385 p=_sion_keyvalue_table_lookup(keymngr->
key_table,key);
388 DPRINTFP((2, DFUNCTION, -1,
"leave key not found rc=%d\n",rc));
393 DPRINTFP((2, DFUNCTION, -1,
"found entry with %d blocks\n",entry->
blocks_avail));
399 DPRINTFP((2, DFUNCTION, -1,
"dummy call (SION_CURRENT_BLOCK,SION_CURRENT_POS), leave position unchanged rc=%d\n",rc));
403 DPRINTFP((2, DFUNCTION, -1,
"leave, seek position is already current pos in block %d\n",blocknum));
406 DPRINTFP((2, DFUNCTION, -1,
"leave, currently behind last block rc=%d\n",rc));
413 DPRINTFP((2, DFUNCTION, -1,
"seek in current_block request\n"));
419 DPRINTFP((2, DFUNCTION, -1,
"seek position is in block %d\n",blocknum));
424 DPRINTFP((2, DFUNCTION, -1,
"leave, currently behind last block rc=%d\n",rc));
434 if ( (blocknum<0) || (blocknum >= entry->
blocks_avail)) {
436 DPRINTFP((2, DFUNCTION, -1,
"leave, blocknum outside known range rc=%d\n",rc));
448 while ((block!=NULL) && (blocknum != block->
blocknum)) {
452 DPRINTFP((2, DFUNCTION, -1,
"internal error: somethink went wrong, seek, aborting, blocknum position block is NULL\n"));
453 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, seek, aborting ...\n"));
457 DPRINTFP((2, DFUNCTION, -1,
"position is in this block %d\n",block->
blocknum));
459 if((posinblock>=0) && (posinblock < block->len)) {
463 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));
465 DPRINTFP((2, DFUNCTION, -1,
"wrong pos in block %d\n",(
int) posinblock));
471 absolutepos=posinblock;
472 if ( (absolutepos < 0)
476 DPRINTFP((2, DFUNCTION, -1,
"leave, absolute position outside known range rc=%d\n",rc));
492 DPRINTFP((2, DFUNCTION, -1,
"internal error: somethink went wrong, seek, aborting, absolute position block is NULL\n"));
493 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, seek, aborting ...\n"));
502 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));
508 DPRINTFP((2, DFUNCTION, -1,
"found block --> (%ld,%ld)\n",(
long) *current_pos,(
long) *bytes_left));
510 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
516 #define DFUNCTION "_sion_keyvalue_keymngr_iterator_reset" 521 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
525 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
533 #define DFUNCTION "_sion_keyvalue_keymngr_iterator_next" 534 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) {
538 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
553 return(
_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: somethink went wrong, checking end of list , aborting ...\n"));
580 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d\n",rc));
585 #define DFUNCTION "_sion_keyvalue_keymngr_key_list_iterator_reset" 590 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
592 _sion_keyvalue_table_iterator_reset(keymngr->
key_table);
594 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
599 #define DFUNCTION "_sion_keyvalue_keymngr_key_list_iterator_next" 600 int _sion_keyvalue_keymngr_key_list_iterator_next(
_sion_keyvalue_keymngr* keymngr, sion_table_key_t *key) {
604 DPRINTFP((2, DFUNCTION, -1,
"enter\n"));
606 rc=_sion_keyvalue_table_iterator_next_in_store_order(keymngr->
key_table, key, &data);
608 DPRINTFP((2, DFUNCTION, -1,
"leave rc=%d key=%ld\n",rc, (
long) *key));
615 #define DFUNCTION "_sion_keyvalue_keymngr_dup" 622 DPRINTFP((2, DFUNCTION, -1,
"enter dup\n"));
625 if (keymngr == NULL) {
638 keymngr->size = keymngr_orig->size;
639 keymngr->
key_table = _sion_keyvalue_table_init(keymngr_orig->size);
641 _sion_errorprint(0,_SION_ERROR_RETURN,
"cannot allocate internal keyvalue table of for %lu entries , aborting ...\n", (
unsigned long) keymngr->size);
648 DPRINTFP((2, DFUNCTION, -1,
"start duplicating entry for key %llu\n",sel_key));
650 p=_sion_keyvalue_table_lookup(keymngr_orig->
key_table,sel_key);
656 DPRINTFP((2, DFUNCTION, -1,
"add block to keymngr key=%ld offset=%ld len=%ld\n",
658 _sion_keyvalue_keymngr_add_block(keymngr,block->
entry->
key,block->
offset,block->
len);
662 DPRINTFP((2, DFUNCTION, -1,
"end duplicating one entry\n"));
666 DPRINTFP((2, DFUNCTION, -1,
"start duplicating all entries\n"));
670 DPRINTFP((2, DFUNCTION, -1,
"add block to keymngr key=%ld offset=%ld len=%ld\n",
672 _sion_keyvalue_keymngr_add_block(keymngr,block->
entry->
key,block->
offset,block->
len);
675 DPRINTFP((2, DFUNCTION, -1,
"end duplicating entries\n"));
678 DPRINTFP((2, DFUNCTION, -1,
"leave\n"));
683 #define DFUNCTION "_sion_keyvalue_keymngr_key_get_stat" 685 size_t rc=SION_SUCCESS;
689 DPRINTFP((2, DFUNCTION, -1,
"enter key=%ld\n",(
long) key));
692 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
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
#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