| 810 | } |
| 811 | |
| 812 | int FlatStreamerEntity::alloc_block(const BlockLocation &next, |
| 813 | BlockLocation *block) { |
| 814 | if (segments_.size() <= 1 || |
| 815 | segments_.back()->padding_size() < linear_block_size()) { |
| 816 | int ret = this->alloc_segment(); |
| 817 | if (ailego_unlikely(ret != 0)) { |
| 818 | return ret; |
| 819 | } |
| 820 | } |
| 821 | |
| 822 | auto &segment = segments_.back(); |
| 823 | size_t block_index = segment->data_size() / linear_block_size(); |
| 824 | if (block_index == kMaxBlockId) { |
| 825 | LOG_ERROR("Failed to alloc block, exceed max count %zu per segment", |
| 826 | kMaxBlockId); |
| 827 | return IndexError_IndexFull; |
| 828 | } |
| 829 | |
| 830 | BlockHeader header; |
| 831 | header.next = next; |
| 832 | header.vector_count = 0; |
| 833 | header.column_major = false; |
| 834 | |
| 835 | size_t hd_off = segment->data_size() + linear_block_size() - sizeof(header); |
| 836 | if (segment->write(hd_off, &header, sizeof(header)) != sizeof(header)) { |
| 837 | LOG_ERROR("Failed to write block header"); |
| 838 | return IndexError_WriteData; |
| 839 | } |
| 840 | |
| 841 | size_t del_off = hd_off - sizeof(DeletionMap); |
| 842 | DeletionMap reset_del_map{}; |
| 843 | if (segment->write(del_off, &reset_del_map, sizeof(reset_del_map)) != |
| 844 | sizeof(reset_del_map)) { |
| 845 | LOG_ERROR("Failed to write block deletion map"); |
| 846 | return IndexError_WriteData; |
| 847 | } |
| 848 | |
| 849 | ++meta_.header.block_count; |
| 850 | block->segment_id = segments_.size() - 1; |
| 851 | block->block_index = (segment->data_size() / linear_block_size()) - 1; |
| 852 | |
| 853 | return 0; |
| 854 | } |
| 855 | |
| 856 | int FlatStreamerEntity::add_to_block(const BlockLocation &block, uint64_t key, |
| 857 | const void *data, size_t size) { |
no test coverage detected