Changeset e0695ce in mainline
- Timestamp:
- 2025-06-23T16:50:43Z (4 months ago)
- Children:
- 6a8c1569
- Parents:
- f18e36e
- git-author:
- Miroslav Cimerman <mc@…> (2025-06-23 16:47:52)
- git-committer:
- Miroslav Cimerman <mc@…> (2025-06-23 16:50:43)
- Location:
- uspace/srv/bd/hr
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
rf18e36e re0695ce 155 155 goto error; 156 156 157 rc = vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 158 if (rc != EOK) 159 goto error; 157 vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 160 158 161 159 rc = hr_register_volume(vol); -
uspace/srv/bd/hr/metadata/native.c
rf18e36e re0695ce 171 171 iter->fini = false; 172 172 173 if (iter_meta->counter == max_counter_val) 174 vol->extents[iter_meta->index].state = HR_EXT_ONLINE; 175 else 176 vol->extents[iter_meta->index].state = HR_EXT_INVALID; 173 hr_ext_state_t final_ext_state = HR_EXT_INVALID; 174 if (iter_meta->counter == max_counter_val) { 175 if (iter_meta->rebuild_pos > 0) { 176 final_ext_state = HR_EXT_REBUILD; 177 vol->rebuild_blk = iter_meta->rebuild_pos; 178 printf("REBUILD SHOULD RESUME at %lu\n", 179 vol->rebuild_blk); 180 } else { 181 final_ext_state = HR_EXT_ONLINE; 182 } 183 } 184 185 vol->extents[iter_meta->index].state = final_ext_state; 177 186 } 178 187 … … 206 215 scratch_md.data_offset = host2uint64_t_le(metadata->data_offset); 207 216 scratch_md.counter = host2uint64_t_le(metadata->counter); 217 scratch_md.rebuild_pos = host2uint64_t_le(metadata->rebuild_pos); 208 218 scratch_md.version = host2uint32_t_le(metadata->version); 209 219 scratch_md.extent_no = host2uint32_t_le(metadata->extent_no); … … 240 250 metadata->data_offset = uint64_t_le2host(scratch_md.data_offset); 241 251 metadata->counter = uint64_t_le2host(scratch_md.counter); 252 metadata->rebuild_pos = uint64_t_le2host(scratch_md.rebuild_pos); 242 253 metadata->version = uint32_t_le2host(scratch_md.version); 243 254 metadata->extent_no = uint32_t_le2host(scratch_md.extent_no); … … 249 260 memcpy(metadata->devname, scratch_md.devname, HR_DEVNAME_LEN); 250 261 262 if (metadata->version != 1) 263 return EINVAL; 264 251 265 return EOK; 252 266 } … … 394 408 395 409 fibril_rwlock_read_lock(&vol->states_lock); 396 397 /* TODO: special case for REBUILD */ 398 if ( ext->state != HR_EXT_ONLINE) {410 hr_ext_state_t s = ext->state; 411 412 if (s != HR_EXT_ONLINE && s != HR_EXT_REBUILD) { 399 413 fibril_rwlock_read_unlock(&vol->states_lock); 400 414 continue; … … 404 418 405 419 md->index = i; 420 if (s == HR_EXT_REBUILD) 421 md->rebuild_pos = vol->rebuild_blk; 422 else 423 md->rebuild_pos = 0; 406 424 meta_native_encode(md, md_block); 407 425 rc = meta_native_write_block(ext->svc_id, md_block); -
uspace/srv/bd/hr/metadata/native.h
rf18e36e re0695ce 61 61 uint64_t counter; 62 62 63 uint64_t rebuild_pos; 64 63 65 uint32_t version; /* XXX: yet unused */ 64 66 uint32_t extent_no; -
uspace/srv/bd/hr/raid1.c
rf18e36e re0695ce 153 153 154 154 vol->meta_ops->inc_counter(vol); 155 (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK);155 vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 156 156 157 157 hr_raid1_vol_state_eval_forced(vol); … … 194 194 size_t invalid_no = hr_count_extents(vol, HR_EXT_INVALID); 195 195 196 size_t rebuild_no = hr_count_extents(vol, HR_EXT_REBUILD); 197 196 198 fibril_mutex_lock(&vol->hotspare_lock); 197 199 size_t hs_no = vol->hotspare_no; … … 216 218 217 219 if (old_state != HR_VOL_REBUILD) { 218 if (hs_no > 0 || invalid_no > 0 ) {220 if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) { 219 221 fid_t fib = fibril_create(hr_raid1_rebuild, 220 222 vol); … … 443 445 } 444 446 445 /*446 * Put the last HOTSPARE extent in place447 * of first that != ONLINE, and start the rebuild.448 */449 447 static errno_t hr_raid1_rebuild(void *arg) 450 448 { … … 463 461 rebuild_ext = &vol->extents[rebuild_idx]; 464 462 465 size_t left = vol->data_blkno ;463 size_t left = vol->data_blkno - vol->rebuild_blk; 466 464 size_t max_blks = DATA_XFER_LIMIT / vol->bsize; 467 465 buf = hr_malloc_waitok(max_blks * vol->bsize); 468 466 469 467 size_t cnt; 470 uint64_t ba = 0;468 uint64_t ba = vol->rebuild_blk; 471 469 hr_add_data_offset(vol, &ba); 472 470 … … 487 485 hr_range_lock_t *rl = NULL; 488 486 487 HR_NOTE("\"%s\": REBUILD started on extent no. %zu at block %lu.\n", 488 vol->devname, rebuild_idx, ba); 489 490 uint64_t written = 0; 489 491 unsigned int percent, old_percent = 100; 490 492 while (left != 0) { … … 517 519 } 518 520 521 if (written * vol->bsize > HR_REBUILD_SAVE_BYTES) { 522 vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 523 written = 0; 524 } 525 519 526 hr_range_lock_release(rl); 520 527 528 written += cnt; 521 529 ba += cnt; 522 530 left -= cnt; … … 531 539 hr_update_ext_state(vol, rebuild_idx, HR_EXT_ONLINE); 532 540 541 atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed); 542 533 543 hr_mark_vol_state_dirty(vol); 534 544 535 545 fibril_rwlock_write_unlock(&vol->states_lock); 536 537 /* (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK); */538 539 546 end: 540 547 fibril_rwlock_read_unlock(&vol->extents_lock); … … 542 549 hr_raid1_vol_state_eval(vol); 543 550 544 if (buf != NULL) 545 free(buf); 551 free(buf); 546 552 547 553 return rc; -
uspace/srv/bd/hr/raid5.c
rf18e36e re0695ce 150 150 151 151 vol->meta_ops->inc_counter(vol); 152 (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK);152 vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 153 153 154 154 hr_raid5_vol_state_eval_forced(vol); … … 610 610 611 611 size_t invalid_no = hr_count_extents(vol, HR_EXT_INVALID); 612 613 size_t rebuild_no = hr_count_extents(vol, HR_EXT_REBUILD); 612 614 613 615 fibril_mutex_lock(&vol->hotspare_lock); … … 625 627 626 628 if (state != HR_VOL_REBUILD) { 627 if (hs_no > 0 || invalid_no > 0 ) {629 if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) { 628 630 fid_t fib = fibril_create(hr_raid5_rebuild, 629 631 vol); … … 720 722 721 723 uint64_t max_blks = DATA_XFER_LIMIT / vol->bsize; 722 uint64_t left = vol->data_blkno / (vol->extent_no - 1); 724 uint64_t left = 725 vol->data_blkno / (vol->extent_no - 1) - vol->rebuild_blk; 723 726 buf = hr_malloc_waitok(max_blks * vol->bsize); 724 727 xorbuf = hr_malloc_waitok(max_blks * vol->bsize); … … 726 729 uint64_t strip_size = vol->strip_size / vol->bsize; /* in blocks */ 727 730 728 uint64_t ba = 0, cnt; 731 size_t cnt; 732 uint64_t ba = vol->rebuild_blk; 729 733 hr_add_data_offset(vol, &ba); 730 734 … … 747 751 false); 748 752 753 HR_NOTE("\"%s\": REBUILD started on extent no. %zu at block %lu.\n", 754 vol->devname, rebuild_idx, ba); 755 756 uint64_t written = 0; 749 757 unsigned int percent, old_percent = 100; 750 758 while (left != 0) { … … 810 818 } 811 819 820 if (written * vol->bsize > HR_REBUILD_SAVE_BYTES) { 821 vol->meta_ops->save(vol, WITH_STATE_CALLBACK); 822 written = 0; 823 } 824 812 825 hr_range_lock_release(rl); 813 826 hr_reset_stripe(stripe); 814 827 828 written += cnt; 815 829 ba += cnt; 816 830 left -= cnt; 831 old_percent = percent; 817 832 818 833 /* … … 829 844 hr_update_ext_state(vol, rebuild_idx, HR_EXT_ONLINE); 830 845 846 atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed); 847 831 848 hr_mark_vol_state_dirty(vol); 832 849 833 850 fibril_rwlock_write_unlock(&vol->states_lock); 834 835 /* (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK); */836 837 851 end: 838 852 fibril_rwlock_read_unlock(&vol->extents_lock); -
uspace/srv/bd/hr/util.c
rf18e36e re0695ce 281 281 282 282 /* save metadata, but we don't care about states anymore */ 283 (void)vol->meta_ops->save(vol, NO_STATE_CALLBACK);283 vol->meta_ops->save(vol, NO_STATE_CALLBACK); 284 284 285 285 HR_NOTE("deactivating volume \"%s\"\n", vol->devname); … … 1117 1117 { 1118 1118 errno_t rc = EOK; 1119 size_t bad = vol->extent_no; 1119 1120 1120 1121 if (vol->level == HR_LVL_0) … … 1125 1126 fibril_mutex_lock(&vol->hotspare_lock); 1126 1127 1127 size_t bad = vol->extent_no; 1128 if (vol->state != HR_VOL_DEGRADED) { 1129 rc = EINVAL; 1130 goto error; 1131 } 1132 1133 size_t rebuild = vol->extent_no; 1128 1134 for (size_t i = 0; i < vol->extent_no; i++) { 1129 if (vol->extents[i].state != HR_EXT_ONLINE) {1130 bad = i;1135 if (vol->extents[i].state == HR_EXT_REBUILD) { 1136 rebuild = i; 1131 1137 break; 1132 1138 } 1133 1139 } 1134 1140 1135 if ( bad == vol->extent_no)1136 rc = EINVAL;1137 else if (vol->state != HR_VOL_DEGRADED)1138 rc = EINVAL;1141 if (rebuild < vol->extent_no) { 1142 bad = rebuild; 1143 goto init_rebuild; 1144 } 1139 1145 1140 1146 size_t invalid = vol->extent_no; … … 1146 1152 } 1147 1153 1148 if (invalid < vol->extent_no) 1154 if (invalid < vol->extent_no) { 1149 1155 bad = invalid; 1150 1151 if (bad != invalid && vol->hotspare_no == 0) 1156 goto init_rebuild; 1157 } 1158 1159 for (size_t i = 0; i < vol->extent_no; i++) { 1160 if (vol->extents[i].state != HR_EXT_ONLINE) { 1161 bad = i; 1162 break; 1163 } 1164 } 1165 1166 if (bad == vol->extent_no || vol->hotspare_no == 0) { 1152 1167 rc = EINVAL; 1153 1154 if (rc != EOK) 1155 goto error; 1156 1157 if (bad != invalid) { 1158 size_t hotspare_idx = vol->hotspare_no - 1; 1159 1160 hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state; 1161 if (hs_state != HR_EXT_HOTSPARE) { 1162 HR_ERROR("hr_raid1_rebuild(): invalid hotspare" 1163 "state \"%s\", aborting rebuild\n", 1164 hr_get_ext_state_str(hs_state)); 1165 rc = EINVAL; 1166 goto error; 1167 } 1168 1169 rc = hr_swap_hs(vol, bad, hotspare_idx); 1170 if (rc != EOK) { 1171 HR_ERROR("hr_raid1_rebuild(): swapping " 1172 "hotspare failed, aborting rebuild\n"); 1173 goto error; 1174 } 1168 goto error; 1169 } 1170 1171 size_t hotspare_idx = vol->hotspare_no - 1; 1172 1173 hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state; 1174 if (hs_state != HR_EXT_HOTSPARE) { 1175 HR_ERROR("hr_raid1_rebuild(): invalid hotspare" 1176 "state \"%s\", aborting rebuild\n", 1177 hr_get_ext_state_str(hs_state)); 1178 rc = EINVAL; 1179 goto error; 1180 } 1181 1182 rc = hr_swap_hs(vol, bad, hotspare_idx); 1183 if (rc != EOK) { 1184 HR_ERROR("hr_raid1_rebuild(): swapping " 1185 "hotspare failed, aborting rebuild\n"); 1186 goto error; 1175 1187 } 1176 1188 … … 1180 1192 "(%" PRIun ")\n", bad, rebuild_ext->svc_id); 1181 1193 1182 atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed); 1183 1194 init_rebuild: 1184 1195 hr_update_ext_state(vol, bad, HR_EXT_REBUILD); 1185 1196 hr_update_vol_state(vol, HR_VOL_REBUILD); -
uspace/srv/bd/hr/var.h
rf18e36e re0695ce 49 49 #define NAME "hr" 50 50 #define HR_STRIP_SIZE DATA_XFER_LIMIT 51 52 /* 53 * During a rebuild operation, we save the rebuild 54 * position this each many bytes. Currently each 55 * 10 MiB. 56 */ 57 #define HR_REBUILD_SAVE_BYTES (10U * 1024 * 1024) 51 58 52 59 struct hr_volume;
Note:
See TracChangeset
for help on using the changeset viewer.