Lines Matching defs:spa

29 #include <sys/spa.h>
89 * - The per-spa field spa_metaslabs_by_flushed sorts all the metaslabs in
102 * - The per-spa field spa_sm_logs_by_txg can be thought as the in-memory
117 * - The per-spa field spa_log_summary is a list of entries that summarizes
307 spa_estimate_incoming_log_blocks(spa_t *spa)
309 ASSERT3U(spa_sync_pass(spa), ==, 1);
311 for (spa_log_sm_t *sls = avl_last(&spa->spa_sm_logs_by_txg);
313 sls = AVL_PREV(&spa->spa_sm_logs_by_txg, sls)) {
314 if (sls->sls_txg == spa_syncing_txg(spa)) {
328 spa_log_sm_blocklimit(spa_t *spa)
330 return (spa->spa_unflushed_stats.sus_blocklimit);
334 spa_log_sm_set_blocklimit(spa_t *spa)
336 if (!spa_feature_is_active(spa, SPA_FEATURE_LOG_SPACEMAP)) {
337 ASSERT0(spa_log_sm_blocklimit(spa));
342 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
343 e; e = list_next(&spa->spa_log_summary, e))
347 spa->spa_unflushed_stats.sus_blocklimit = MIN(MAX(limit,
352 spa_log_sm_nblocks(spa_t *spa)
354 return (spa->spa_unflushed_stats.sus_nblocks);
362 spa_log_summary_verify_counts(spa_t *spa)
364 ASSERT(spa_feature_is_active(spa, SPA_FEATURE_LOG_SPACEMAP));
369 uint64_t ms_in_avl = avl_numnodes(&spa->spa_metaslabs_by_flushed);
372 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
373 e; e = list_next(&spa->spa_log_summary, e)) {
379 for (spa_log_sm_t *sls = avl_first(&spa->spa_sm_logs_by_txg);
380 sls; sls = AVL_NEXT(&spa->spa_sm_logs_by_txg, sls)) {
388 VERIFY3U(blk_in_logs, ==, spa_log_sm_nblocks(spa));
392 summary_entry_is_full(spa_t *spa, log_summary_entry_t *e, uint64_t txg)
400 DIV_ROUND_UP(spa_log_sm_blocklimit(spa),
418 spa_log_summary_decrement_mscount(spa_t *spa, uint64_t txg, boolean_t dirty)
424 if (!spa_writeable(spa))
428 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
429 e != NULL; e = list_next(&spa->spa_log_summary, e)) {
441 VERIFY3S(spa_load_state(spa), ==, SPA_LOAD_ERROR);
507 spa_log_summary_decrement_blkcount(spa_t *spa, uint64_t blocks_gone)
509 log_summary_entry_t *e = list_head(&spa->spa_log_summary);
513 for (; e != NULL; e = list_head(&spa->spa_log_summary)) {
521 list_remove(&spa->spa_log_summary, e);
531 VERIFY3P(e, ==, list_tail(&spa->spa_log_summary));
532 ASSERT3P(e, ==, list_head(&spa->spa_log_summary));
547 spa_log_sm_decrement_mscount(spa_t *spa, uint64_t txg)
550 spa_log_sm_t *sls = avl_find(&spa->spa_sm_logs_by_txg,
558 VERIFY3S(spa_load_state(spa), ==, SPA_LOAD_ERROR);
567 spa_log_sm_increment_current_mscount(spa_t *spa)
569 spa_log_sm_t *last_sls = avl_last(&spa->spa_sm_logs_by_txg);
570 ASSERT3U(last_sls->sls_txg, ==, spa_syncing_txg(spa));
575 summary_add_data(spa_t *spa, uint64_t txg, uint64_t metaslabs_flushed,
578 log_summary_entry_t *e = list_tail(&spa->spa_log_summary);
580 if (e == NULL || summary_entry_is_full(spa, e, txg)) {
584 list_insert_tail(&spa->spa_log_summary, e);
598 spa_log_summary_add_incoming_blocks(spa_t *spa, uint64_t nblocks)
600 summary_add_data(spa, spa_syncing_txg(spa), 0, 0, nblocks);
604 spa_log_summary_add_flushed_metaslab(spa_t *spa, boolean_t dirty)
606 summary_add_data(spa, spa_syncing_txg(spa), 1, dirty ? 1 : 0, 0);
610 spa_log_summary_dirty_flushed_metaslab(spa_t *spa, uint64_t txg)
613 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
614 e != NULL; e = list_next(&spa->spa_log_summary, e)) {
637 spa_estimate_metaslabs_to_flush(spa_t *spa)
639 ASSERT(spa_feature_is_active(spa, SPA_FEATURE_LOG_SPACEMAP));
640 ASSERT3U(spa_sync_pass(spa), ==, 1);
641 ASSERT(spa_log_sm_blocklimit(spa) != 0);
647 uint64_t incoming = spa_estimate_incoming_log_blocks(spa);
665 spa_log_sm_blocklimit(spa) - spa_log_sm_nblocks(spa) - incoming;
668 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
669 e; e = list_next(&spa->spa_log_summary, e))
685 for (log_summary_entry_t *e = list_head(&spa->spa_log_summary);
686 e; e = list_next(&spa->spa_log_summary, e)) {
730 spa_log_sm_memused(spa_t *spa)
732 return (spa->spa_unflushed_stats.sus_memused);
736 spa_log_exceeds_memlimit(spa_t *spa)
738 if (spa_log_sm_memused(spa) > zfs_unflushed_max_mem_amt)
743 if (spa_log_sm_memused(spa) > system_mem_allowed)
750 spa_flush_all_logs_requested(spa_t *spa)
752 return (spa->spa_log_flushall_txg != 0);
756 spa_flush_metaslabs(spa_t *spa, dmu_tx_t *tx)
760 if (spa_sync_pass(spa) != 1)
763 if (!spa_feature_is_active(spa, SPA_FEATURE_LOG_SPACEMAP))
770 if (avl_numnodes(&spa->spa_metaslabs_by_flushed) == 0)
786 if (BP_GET_LOGICAL_BIRTH(&spa->spa_uberblock.ub_rootbp) < txg &&
787 !dmu_objset_is_dirty(spa_meta_objset(spa), txg) &&
788 !spa_flush_all_logs_requested(spa))
803 spa_generate_syncing_log_sm(spa, tx);
812 if (spa_flush_all_logs_requested(spa)) {
813 ASSERT3S(spa_state(spa), ==, POOL_STATE_EXPORTED);
816 want_to_flush = spa_estimate_metaslabs_to_flush(spa);
831 for (metaslab_t *curr = avl_first(&spa->spa_metaslabs_by_flushed);
833 next = AVL_NEXT(&spa->spa_metaslabs_by_flushed, curr);
846 if (want_to_flush == 0 && !spa_log_exceeds_memlimit(spa))
862 ASSERT3U(avl_numnodes(&spa->spa_metaslabs_by_flushed), >=, visited);
864 spa_log_sm_set_blocklimit(spa);
872 spa_sync_close_syncing_log_sm(spa_t *spa)
874 if (spa_syncing_log_sm(spa) == NULL)
876 ASSERT(spa_feature_is_active(spa, SPA_FEATURE_LOG_SPACEMAP));
878 spa_log_sm_t *sls = avl_last(&spa->spa_sm_logs_by_txg);
879 ASSERT3U(sls->sls_txg, ==, spa_syncing_txg(spa));
881 sls->sls_nblocks = space_map_nblocks(spa_syncing_log_sm(spa));
882 spa->spa_unflushed_stats.sus_nblocks += sls->sls_nblocks;
892 spa_log_summary_add_incoming_blocks(spa, sls->sls_nblocks);
893 spa_log_summary_verify_counts(spa);
895 space_map_close(spa->spa_syncing_log_sm);
896 spa->spa_syncing_log_sm = NULL;
904 if (spa_flush_all_logs_requested(spa)) {
905 ASSERT3S(spa_state(spa), ==, POOL_STATE_EXPORTED);
906 spa->spa_log_flushall_txg = 0;
911 spa_cleanup_old_sm_logs(spa_t *spa, dmu_tx_t *tx)
913 objset_t *mos = spa_meta_objset(spa);
919 ASSERT(avl_is_empty(&spa->spa_sm_logs_by_txg));
924 metaslab_t *oldest = avl_first(&spa->spa_metaslabs_by_flushed);
928 for (spa_log_sm_t *sls = avl_first(&spa->spa_sm_logs_by_txg);
930 sls = avl_first(&spa->spa_sm_logs_by_txg)) {
932 avl_remove(&spa->spa_sm_logs_by_txg, sls);
935 spa_log_summary_decrement_blkcount(spa, sls->sls_nblocks);
936 spa->spa_unflushed_stats.sus_nblocks -= sls->sls_nblocks;
951 spa_generate_syncing_log_sm(spa_t *spa, dmu_tx_t *tx)
954 objset_t *mos = spa_meta_objset(spa);
956 if (spa_syncing_log_sm(spa) != NULL)
959 if (!spa_feature_is_enabled(spa, SPA_FEATURE_LOG_SPACEMAP))
966 ASSERT(avl_is_empty(&spa->spa_sm_logs_by_txg));
974 spa_feature_incr(spa, SPA_FEATURE_LOG_SPACEMAP, tx);
983 avl_add(&spa->spa_sm_logs_by_txg, spa_log_sm_alloc(sm_obj, txg));
992 VERIFY0(space_map_open(&spa->spa_syncing_log_sm, mos, sm_obj,
995 spa_log_sm_set_blocklimit(spa);
1003 spa_ld_log_sm_metadata(spa_t *spa)
1008 ASSERT(avl_is_empty(&spa->spa_sm_logs_by_txg));
1010 error = zap_lookup(spa_meta_objset(spa), DMU_POOL_DIRECTORY_OBJECT,
1016 spa_load_failed(spa, "spa_ld_log_sm_metadata(): failed at "
1024 for (zap_cursor_init(&zc, spa_meta_objset(spa), spacemap_zap);
1030 avl_add(&spa->spa_sm_logs_by_txg, sls);
1035 spa_load_failed(spa, "spa_ld_log_sm_metadata(): failed at "
1041 for (metaslab_t *m = avl_first(&spa->spa_metaslabs_by_flushed);
1042 m; m = AVL_NEXT(&spa->spa_metaslabs_by_flushed, m)) {
1044 spa_log_sm_t *sls = avl_find(&spa->spa_sm_logs_by_txg,
1059 spa_load_failed(spa, "spa_ld_log_sm_metadata(): bug "
1084 spa_t *spa = slls->slls_spa;
1086 vdev_t *vd = vdev_lookup_top(spa, vdev_id);
1124 spa_log_summary_dirty_flushed_metaslab(spa,
1131 spa_ld_log_sm_data(spa_t *spa)
1140 if (!spa_writeable(spa))
1143 ASSERT0(spa->spa_unflushed_stats.sus_nblocks);
1144 ASSERT0(spa->spa_unflushed_stats.sus_memused);
1149 for (sls = avl_first(&spa->spa_sm_logs_by_txg); sls;
1150 sls = AVL_NEXT(&spa->spa_sm_logs_by_txg, sls)) {
1151 dmu_prefetch_dnode(spa_meta_objset(spa), sls->sls_sm_obj,
1158 psls = sls = avl_first(&spa->spa_sm_logs_by_txg);
1164 spa_meta_objset(spa), psls->sls_sm_obj, 0,
1167 spa_load_failed(spa, "spa_ld_log_sm_data(): "
1173 dmu_prefetch(spa_meta_objset(spa), psls->sls_sm_obj,
1178 psls = AVL_NEXT(&spa->spa_sm_logs_by_txg, psls);
1186 spa->spa_unflushed_stats.sus_nblocks += sls->sls_nblocks;
1187 summary_add_data(spa, sls->sls_txg,
1190 spa_import_progress_set_notes_nolog(spa,
1192 avl_numnodes(&spa->spa_sm_logs_by_txg));
1195 .slls_spa = spa,
1201 spa_load_failed(spa, "spa_ld_log_sm_data(): failed "
1212 sls = AVL_NEXT(&spa->spa_sm_logs_by_txg, sls);
1215 spa_log_sm_set_blocklimit(spa);
1219 spa_load_note(spa,
1221 "in %lld ms", avl_numnodes(&spa->spa_sm_logs_by_txg),
1222 (u_longlong_t)spa_log_sm_nblocks(spa),
1228 for (spa_log_sm_t *sls = avl_first(&spa->spa_sm_logs_by_txg);
1229 sls; sls = AVL_NEXT(&spa->spa_sm_logs_by_txg, sls)) {
1250 for (metaslab_t *m = avl_first(&spa->spa_metaslabs_by_flushed);
1251 m != NULL; m = AVL_NEXT(&spa->spa_metaslabs_by_flushed, m)) {
1266 spa->spa_unflushed_stats.sus_memused +=
1282 spa_t *spa = vd->vdev_spa;
1283 objset_t *mos = spa_meta_objset(spa);
1295 spa_load_failed(spa, "spa_ld_unflushed_txgs(): failed at "
1312 spa_load_failed(spa, "spa_ld_unflushed_txgs(): "
1323 mutex_enter(&spa->spa_flushed_ms_lock);
1324 avl_add(&spa->spa_metaslabs_by_flushed, ms);
1325 mutex_exit(&spa->spa_flushed_ms_lock);
1338 spa_ld_log_spacemaps(spa_t *spa)
1342 spa_log_sm_set_blocklimit(spa);
1344 for (uint64_t c = 0; c < spa->spa_root_vdev->vdev_children; c++) {
1345 vdev_t *vd = spa->spa_root_vdev->vdev_child[c];
1351 error = spa_ld_log_sm_metadata(spa);
1360 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);
1361 error = spa_ld_log_sm_data(spa);
1362 spa_config_exit(spa, SCL_CONFIG, FTAG);