// - Seems like an as_storage_record method, but leaving it here for now. // - sets rd->bins! // - for data-in-memory, assumes rd->n_bins is already set! bool as_bin_get_and_size_all(as_storage_rd *rd, as_bin *stack_bins) { if (rd->ns->storage_data_in_memory) { rd->bins = rd->ns->single_bin ? as_index_get_single_bin(rd->r) : safe_bins(rd->r); if (! rd->bins) { // i.e. multi-bin when record just created. return true; } if (rd->ns->storage_type != AS_STORAGE_ENGINE_SSD) { // Not interested in calculating flat-sizing info. return true; } // Calculate starting values for rd->n_bins_to_write and // rd->particles_flat_size. uint16_t i; for (i = 0; i < rd->n_bins; i++) { as_bin *b = &rd->bins[i]; if (! as_bin_inuse(b)) { // i.e. single-bin when record just created. break; } size_t flat_size; if (0 != as_particle_get_flat_size(b, &flat_size)) { return false; } rd->particles_flat_size += flat_size; } rd->n_bins_to_write = (uint32_t)i; return true; } // Data NOT in-memory. rd->bins = stack_bins; as_bin_set_all_empty(rd); if (rd->record_on_device && ! rd->ignore_record_on_device) { // Sets rd->n_bins_to_write and rd->particles_flat_size: if (0 != as_storage_particle_read_and_size_all_ssd(rd)) { return false; } } return true; }
as_bin * as_bin_get_all(as_record *r, as_storage_rd *rd, as_bin *stack_bins) { if (rd->ns->storage_data_in_memory) { return rd->ns->single_bin ? as_index_get_single_bin(r) : safe_bins(r); } rd->bins = stack_bins; as_bin_set_all_empty(rd); if (rd->record_on_device && ! rd->ignore_record_on_device) { as_storage_particle_read_all(rd); } return (stack_bins); }
void as_bin_allocate_bin_space(as_record *r, as_storage_rd *rd, int32_t delta) { if (rd->n_bins == 0) { rd->n_bins = (uint16_t)delta; as_bin_space* bin_space = (as_bin_space*) cf_malloc(sizeof(as_bin_space) + (rd->n_bins * sizeof(as_bin))); rd->bins = bin_space->bins; as_bin_set_all_empty(rd); bin_space->n_bins = rd->n_bins; as_index_set_bin_space(r, bin_space); } else { uint16_t new_n_bins = (uint16_t)((int32_t)rd->n_bins + delta); if (delta < 0) { as_record_clean_bins_from(rd, new_n_bins); } uint16_t old_n_bins = rd->n_bins; rd->n_bins = new_n_bins; if (new_n_bins != 0) { as_bin_space* bin_space = (as_bin_space*) cf_realloc((void*)as_index_get_bin_space(r), sizeof(as_bin_space) + (rd->n_bins * sizeof(as_bin))); rd->bins = bin_space->bins; if (delta > 0) { as_bin_set_empty_from(rd, old_n_bins); } bin_space->n_bins = rd->n_bins; as_index_set_bin_space(r, bin_space); } else { cf_free((void*)as_index_get_bin_space(r)); as_index_set_bin_space(r, NULL); rd->bins = NULL; } } }
// - Seems like an as_storage_record method, but leaving it here for now. // - sets rd->bins! int as_storage_rd_load_bins(as_storage_rd *rd, as_bin *stack_bins) { if (rd->ns->storage_data_in_memory) { rd->bins = rd->ns->single_bin ? as_index_get_single_bin(rd->r) : safe_bins(rd->r); return 0; } // Data NOT in-memory. rd->bins = stack_bins; as_bin_set_all_empty(rd); if (rd->record_on_device && ! rd->ignore_record_on_device) { int result = as_storage_particle_read_all_ssd(rd); if (result < 0) { return result; } } return 0; }