| 576 | } |
| 577 | |
| 578 | void fdb_kvs_header_copy(fdb_kvs_handle *handle, |
| 579 | struct filemgr *new_file, |
| 580 | struct docio_handle *new_dhandle, |
| 581 | uint64_t *new_file_kv_info_offset, |
| 582 | bool create_new) |
| 583 | { |
| 584 | struct avl_node *a, *aa; |
| 585 | struct kvs_node *node_old, *node_new; |
| 586 | |
| 587 | if (create_new) { |
| 588 | struct kvs_header *kv_header; |
| 589 | // copy KV header data in 'handle' to new file |
| 590 | _fdb_kvs_header_create(&kv_header); |
| 591 | // read from 'handle->dhandle', and import into 'new_file' |
| 592 | fdb_kvs_header_read(kv_header, handle->dhandle, |
| 593 | handle->kv_info_offset, handle->file->version, false); |
| 594 | |
| 595 | // write KV header in 'new_file' using 'new_dhandle' |
| 596 | uint64_t new_kv_info_offset; |
| 597 | fdb_kvs_handle new_handle; |
| 598 | new_handle.file = new_file; |
| 599 | new_handle.dhandle = new_dhandle; |
| 600 | new_handle.kv_info_offset = BLK_NOT_FOUND; |
| 601 | new_kv_info_offset = fdb_kvs_header_append(&new_handle); |
| 602 | if (new_file_kv_info_offset) { |
| 603 | *new_file_kv_info_offset = new_kv_info_offset; |
| 604 | } |
| 605 | |
| 606 | if (!filemgr_set_kv_header(new_file, kv_header, fdb_kvs_header_free, |
| 607 | false)) { // LCOV_EXCL_START |
| 608 | _fdb_kvs_header_free(kv_header); |
| 609 | } // LCOV_EXCL_STOP |
| 610 | fdb_kvs_header_reset_all_stats(new_file); |
| 611 | } |
| 612 | |
| 613 | spin_lock(&handle->file->kv_header->lock); |
| 614 | spin_lock(&new_file->kv_header->lock); |
| 615 | // copy all in-memory custom cmp function pointers & seqnums |
| 616 | new_file->kv_header->default_kvs_cmp = |
| 617 | handle->file->kv_header->default_kvs_cmp; |
| 618 | new_file->kv_header->custom_cmp_enabled = |
| 619 | handle->file->kv_header->custom_cmp_enabled; |
| 620 | a = avl_first(handle->file->kv_header->idx_id); |
| 621 | while (a) { |
| 622 | node_old = _get_entry(a, struct kvs_node, avl_id); |
| 623 | aa = avl_search(new_file->kv_header->idx_id, |
| 624 | &node_old->avl_id, _kvs_cmp_id); |
| 625 | assert(aa); // MUST exist |
| 626 | node_new = _get_entry(aa, struct kvs_node, avl_id); |
| 627 | node_new->custom_cmp = node_old->custom_cmp; |
| 628 | node_new->seqnum = node_old->seqnum; |
| 629 | node_new->op_stat = node_old->op_stat; |
| 630 | a = avl_next(a); |
| 631 | } |
| 632 | spin_unlock(&new_file->kv_header->lock); |
| 633 | spin_unlock(&handle->file->kv_header->lock); |
| 634 | } |
| 635 |
no test coverage detected