master - thin: show message on error path
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ffeeb5c1e70e55...
Commit: ffeeb5c1e70e554defa45ee8aa28dcaeb47c705f
Parent: c356991fa83b15af261e8d7e33f5615397c07778
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Sep 14 12:58:21 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Sep 14 20:18:54 2015 +0200
thin: show message on error path
Add missing log_error and show proper reason for failure
when autoextend is set to 0.
Add missing log_error when checked LV is not locally active.
---
lib/metadata/lv_manip.c | 13 +++++++++++--
1 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index f43d281..46213fe 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4405,8 +4405,11 @@ static int _adjust_policy_params(struct cmd_context *cmd,
policy_amount =
find_config_tree_int(cmd, activation_thin_pool_autoextend_percent_CFG,
lv_config_profile(lv));
- if (!policy_amount && policy_threshold < DM_PERCENT_100)
- return 0;
+ if (!policy_amount && policy_threshold < DM_PERCENT_100) {
+ log_error("Can't extend thin pool %s, autoextend is set to 0%%.",
+ display_lvname(lv));
+ return 0;
+ }
} else {
policy_threshold =
find_config_tree_int(cmd, activation_snapshot_autoextend_threshold_CFG, NULL) * DM_PERCENT_1;
@@ -4417,6 +4420,12 @@ static int _adjust_policy_params(struct cmd_context *cmd,
if (policy_threshold >= DM_PERCENT_100)
return 1; /* nothing to do */
+ if (!lv_is_active_locally(lv)) {
+ log_error("Can't read state of locally inactive LV %s.",
+ display_lvname(lv));
+ return 0;
+ }
+
if (lv_is_thin_pool(lv)) {
if (!lv_thin_pool_percent(lv, 1, &percent))
return_0;
8 years, 7 months
master - libdm: no validate for pool without messages
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c356991fa83b15...
Commit: c356991fa83b15af261e8d7e33f5615397c07778
Parent: e42ee69988fc770314a355e6acd417e00e0c9623
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Sep 14 14:59:40 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Sep 14 20:18:54 2015 +0200
libdm: no validate for pool without messages
Avoid validation of free space in pool, when no messages are passed.
Patch a3c7e326c3e9950fe74e433c406d6e1b5a53bf25 add new check for
pool overload - but this check should not be made if there are
no messages and transaction_id is still within 'bounds' (bigger by 1).
---
WHATS_NEW_DM | 1 +
libdm/libdm-deptree.c | 2 +-
2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index db40deb..9e30786 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.108 -
=====================================
+ Do not check for full thin pool when activating without messages (1.02.107).
Version 1.02.107 - 5th September 2015
=====================================
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index d40362d..7b7ca5b 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -1633,7 +1633,7 @@ static int _node_send_messages(struct dm_tree_node *dnode,
return 0;
}
- if (!send)
+ if (!have_messages || !send)
return 1; /* transaction_id is matching */
dm_list_iterate_items(tmsg, &seg->thin_messages) {
8 years, 7 months
master - tests: no sync raid
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2a82292ec90bba...
Commit: 2a82292ec90bba2a3796e3c7f1872a2bf72270da
Parent: e42ee69988fc770314a355e6acd417e00e0c9623
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Sep 14 09:29:10 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Sep 14 09:31:27 2015 +0200
tests: no sync raid
---
test/shell/lvconvert-mirror-basic.sh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvconvert-mirror-basic.sh b/test/shell/lvconvert-mirror-basic.sh
index 4a3e62f..a3ec38a 100644
--- a/test/shell/lvconvert-mirror-basic.sh
+++ b/test/shell/lvconvert-mirror-basic.sh
@@ -79,7 +79,7 @@ test_lvconvert() {
alloc="--alloc anywhere"
fi
- lvcreate -aey -l2 --type mirror -m $start_count --mirrorlog $start_log_type \
+ lvcreate -aey -l2 --nosync --type mirror -m $start_count --mirrorlog $start_log_type \
-n $lv1 $vg $alloc
check mirror_legs $vg $lv1 $start_count_p1
# FIXME: check mirror log
8 years, 7 months
master - vgimporeclone: use correct cache dir path
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e42ee69988fc77...
Commit: e42ee69988fc770314a355e6acd417e00e0c9623
Parent: 226e7d7b3c30f083c422063ec107c50b3534ee0f
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Sep 14 09:24:15 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Sep 14 09:31:26 2015 +0200
vgimporeclone: use correct cache dir path
Commit 00b36ef06acb15c82d7c9b37872753f02c638316 had a typo
and missed '{' for shell variable, thus command used slightly
different 'tmp' dir name for cache dir (with extra '}').
Such change was unnoticed until a recent fix in persistent
filter, lvm2 missed to update cache file when --config
was specified.
The result was, /tmp dir was accumulating snap.XXXXX} dirs when
running vgimportclose script.
---
WHATS_NEW | 1 +
scripts/vgimportclone.sh | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 2c444c7..c661702 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.131 -
=====================================
+ Fix vgimportclone cache_dir path name (2.02.115).
Swapping of LV identifiers handles more complex LVs.
Use passed list of PVS when allocating space in lvconvert --thinpool.
Disallow usage of --stripe and --stripesize when creating cache pool.
diff --git a/scripts/vgimportclone.sh b/scripts/vgimportclone.sh
index 388d14c..af8cf5c 100755
--- a/scripts/vgimportclone.sh
+++ b/scripts/vgimportclone.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Copyright (C) 2009 Chris Procter All rights reserved.
-# Copyright (C) 2009 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2009-2015 Red Hat, Inc. All rights reserved.
#
# This file is part of LVM2.
#
@@ -239,7 +239,7 @@ LVMCONF=${TMP_LVM_SYSTEM_DIR}/lvm.conf
CMD_CONFIG_LINE="devices { \
scan = [ \"${TMP_LVM_SYSTEM_DIR}\" ] \
- cache_dir = \"$TMP_LVM_SYSTEM_DIR}/cache\"
+ cache_dir = \"${TMP_LVM_SYSTEM_DIR}/cache\"
global_filter = [ \"a|.*|\" ] \
${FILTER}
} \
8 years, 7 months
master - tests: wait for sync before deactivation
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=226e7d7b3c30f0...
Commit: 226e7d7b3c30f083c422063ec107c50b3534ee0f
Parent: cd2e4310b320782ec58b712d3c2f24a56c7d10c5
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 20:54:43 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:52:27 2015 +0200
tests: wait for sync before deactivation
On slower machine/disk, sync may block udev from reading and may prevent
deactivation.
---
test/shell/lvresize-raid.sh | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvresize-raid.sh b/test/shell/lvresize-raid.sh
index 1a1a75f..333318a 100644
--- a/test/shell/lvresize-raid.sh
+++ b/test/shell/lvresize-raid.sh
@@ -24,7 +24,10 @@ for deactivate in true false; do
# Extend and reduce a 2-way RAID1
lvcreate --type raid1 -m 1 -l 2 -n $lv1 $vg
- test $deactivate && lvchange -an $vg/$lv1
+ test $deactivate && {
+ aux wait_for_sync $vg $lv1
+ lvchange -an $vg/$lv1
+ }
lvresize -l +2 $vg/$lv1
@@ -36,7 +39,10 @@ for deactivate in true false; do
for i in 4 5 6 ; do
lvcreate --type raid$i -i 3 -l 3 -n $lv2 $vg
- test $deactivate && lvchange -an $vg/$lv2
+ test $deactivate && {
+ aux wait_for_sync $vg $lv2
+ lvchange -an $vg/$lv2
+ }
lvresize -l +3 $vg/$lv2
8 years, 7 months
master - tests: new thin tests
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=cd2e4310b32078...
Commit: cd2e4310b320782ec58b712d3c2f24a56c7d10c5
Parent: fd3d795b9301dd1defd33e4340fd453e5aee4e8d
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 21:00:10 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:52:27 2015 +0200
tests: new thin tests
---
test/shell/lvconvert-repair-thin-raid.sh | 58 ++++++++++++++++++++++++++++++
test/shell/lvextend-thin.sh | 2 +
2 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/test/shell/lvconvert-repair-thin-raid.sh b/test/shell/lvconvert-repair-thin-raid.sh
new file mode 100644
index 0000000..04bc5c7
--- /dev/null
+++ b/test/shell/lvconvert-repair-thin-raid.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+# Copyright (C) 2015 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Test repairing of broken thin pool on raid
+
+. lib/inittest
+
+test -e LOCAL_LVMPOLLD && skip
+aux have_thin 1 0 0 || skip
+aux have_raid 1 4 0 || skip
+
+#
+# Main
+#
+
+aux prepare_vg 4
+
+lvcreate --type raid1 -L1 -n pool $vg
+lvcreate --type raid1 -L2 -n meta $vg
+# raid _tdata & _tmeta
+lvconvert -y --thinpool $vg/pool --poolmetadata $vg/meta
+
+lvcreate -V1G $vg/pool
+
+# Pool has to be inactive (ATM) for repair
+fail lvconvert -y --repair $vg/pool "$dev3"
+
+lvchange -an $vg
+
+check lv_field $vg/pool_tmeta lv_role "private,thin,pool,metadata"
+
+lvconvert -y --repair $vg/pool "$dev3"
+
+lvs -a -o+devices,seg_pe_ranges,role,layout $vg
+check lv_field $vg/pool_meta0 lv_role "public"
+check lv_field $vg/pool_meta0 lv_layout "raid,raid1"
+check lv_field $vg/pool_tmeta lv_layout "linear"
+check lv_on $vg pool_tmeta "$dev1"
+
+# Hmm name is generated in order
+SPARE=$(lvs --noheadings -a --select "name=~_pmspare" -o name $vg)
+SPARE=${SPARE##*[}
+SPARE=${SPARE%%]*}
+
+check lv_on $vg $SPARE "$dev3"
+
+lvchange -ay $vg
+
+vgremove -ff $vg
diff --git a/test/shell/lvextend-thin.sh b/test/shell/lvextend-thin.sh
index 1e64e42..a97e93b 100644
--- a/test/shell/lvextend-thin.sh
+++ b/test/shell/lvextend-thin.sh
@@ -21,3 +21,5 @@ aux prepare_vg 3
lvcreate -i2 -l2 -T $vg/pool2
lvextend -l+2 $vg/pool2 "$dev2" "$dev3"
should lvextend -l+100%FREE $vg/pool2
+
+vgremove -ff $vg
8 years, 7 months
master - makefiles: distclean missing files
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=fd3d795b9301dd...
Commit: fd3d795b9301dd1defd33e4340fd453e5aee4e8d
Parent: 729b035edd923554275ac7b3bc446b57f0e9f0d5
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 21:30:45 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:52:27 2015 +0200
makefiles: distclean missing files
---
daemons/lvmetad/Makefile.in | 2 ++
scripts/Makefile.in | 1 +
2 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/daemons/lvmetad/Makefile.in b/daemons/lvmetad/Makefile.in
index 090bb76..ce7e5d6 100644
--- a/daemons/lvmetad/Makefile.in
+++ b/daemons/lvmetad/Makefile.in
@@ -45,6 +45,8 @@ lvmetactl: lvmetactl.o $(top_builddir)/libdaemon/client/libdaemonclient.a \
$(top_builddir)/libdaemon/server/libdaemonserver.a
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ lvmetactl.o $(LVMLIBS)
+CLEAN_TARGETS += lvmetactl.o
+
# TODO: No idea. No idea how to test either.
#ifneq ("$(CFLOW_CMD)", "")
#CFLOW_SOURCES = $(addprefix $(srcdir)/, $(SOURCES))
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
index 2ae5325..dabe2ee 100644
--- a/scripts/Makefile.in
+++ b/scripts/Makefile.in
@@ -151,6 +151,7 @@ DISTCLEAN_TARGETS += \
lvm2_clvmd_systemd_red_hat.service \
lvm2_cmirrord_systemd_red_hat.service \
lvm2_lvmetad_init_red_hat \
+ lvm2_lvmpolld_init_red_hat \
lvm2_lvmetad_systemd_red_hat.service \
lvm2_lvmetad_systemd_red_hat.socket \
lvm2_lvmpolld_systemd_red_hat.service \
8 years, 7 months
master - pool: validate pool_metadata has proper suffix
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=729b035edd9235...
Commit: 729b035edd923554275ac7b3bc446b57f0e9f0d5
Parent: fda853b573920ccefda23ad97f54d7b4dafaa9f1
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 20:58:58 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:52:27 2015 +0200
pool: validate pool_metadata has proper suffix
---
lib/metadata/merge.c | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index a3e6af1..351ab39 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -119,12 +119,24 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
inc_error_count;
}
- if (lv_is_pool_metadata(lv) &&
- (!(seg2 = first_seg(lv)) || !(seg2 = find_pool_seg(seg2)) ||
- seg2->metadata_lv != lv)) {
- log_error("LV %s: segment 1 pool metadata LV does not point back to same LV",
- lv->name);
- inc_error_count;
+ if (lv_is_pool_metadata(lv)) {
+ if (!(seg2 = first_seg(lv)) || !(seg2 = find_pool_seg(seg2)) ||
+ seg2->metadata_lv != lv) {
+ log_error("LV %s: segment 1 pool metadata LV does not point back to same LV",
+ lv->name);
+ inc_error_count;
+ }
+ if (lv_is_thin_pool_metadata(lv) &&
+ !strstr(lv->name, "_tmeta")) {
+ log_error("LV %s: thin pool metadata LV does not use _tmeta",
+ lv->name);
+ inc_error_count;
+ } else if (lv_is_cache_pool_metadata(lv) &&
+ !strstr(lv->name, "_cmeta")) {
+ log_error("LV %s: cache pool metadata LV does not use _cmeta",
+ lv->name);
+ inc_error_count;
+ }
}
}
8 years, 7 months
master - thin: improve swapping of identifiers
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=fda853b573920c...
Commit: fda853b573920ccefda23ad97f54d7b4dafaa9f1
Parent: 280a6275ce7262baae0062c58a63b910bc16327d
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 20:56:53 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:51:11 2015 +0200
thin: improve swapping of identifiers
Since we may want to swap names when LVs are complex types, we cannot
avoid doing full renames on both LV stacks.
Temporarily use 'pvmove_tmeta' as unused name to prevent validation troubles.
---
WHATS_NEW | 1 +
tools/lvconvert.c | 4 ++--
tools/lvconvert_poll.c | 13 +++++++++----
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 163077f..2c444c7 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.131 -
=====================================
+ Swapping of LV identifiers handles more complex LVs.
Use passed list of PVS when allocating space in lvconvert --thinpool.
Disallow usage of --stripe and --stripesize when creating cache pool.
Warn user when caching raid or thin pool data LV.
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 6b8f7aa..b5658f2 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2489,14 +2489,14 @@ deactivate_pmslv:
if (!detach_pool_metadata_lv(first_seg(pool_lv), &mlv))
return_0;
+ /* Swap _pmspare and _tmeta name */
if (!swap_lv_identifiers(cmd, mlv, pmslv))
return_0;
- /* Used _pmspare will become _tmeta */
if (!attach_pool_metadata_lv(first_seg(pool_lv), pmslv))
return_0;
- /* Used _tmeta will become visible _meta%d */
+ /* Used _tmeta (now _pmspare) becomes _meta%d */
if (!lv_rename_update(cmd, mlv, pms_path, 0))
return_0;
diff --git a/tools/lvconvert_poll.c b/tools/lvconvert_poll.c
index e3a3709..1b230bc 100644
--- a/tools/lvconvert_poll.c
+++ b/tools/lvconvert_poll.c
@@ -44,15 +44,20 @@ int swap_lv_identifiers(struct cmd_context *cmd,
struct logical_volume *a, struct logical_volume *b)
{
union lvid lvid;
- const char *name;
+ const char *aname = a->name, *bname = b->name;
lvid = a->lvid;
a->lvid = b->lvid;
b->lvid = lvid;
- name = a->name;
- a->name = b->name;
- if (!lv_rename_update(cmd, b, name, 0))
+ /* rename temporarily to 'unused' name */
+ if (!lv_rename_update(cmd, a, "pmove_tmeta", 0))
+ return_0;
+ /* name rename 'b' to unused name of 'a' */
+ if (!lv_rename_update(cmd, b, aname, 0))
+ return_0;
+ /* finish name swapping */
+ if (!lv_rename_update(cmd, a, bname, 0))
return_0;
return 1;
8 years, 7 months
master - thin: lvconvert use passed PVs for _pmspare
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=280a6275ce7262...
Commit: 280a6275ce7262baae0062c58a63b910bc16327d
Parent: 95b5d24f434b6f2174d500a0c7b2bba78b7cd2e9
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 11 20:56:02 2015 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 11 21:48:19 2015 +0200
thin: lvconvert use passed PVs for _pmspare
When PVs are given on 'lvconvert' respect them when converting
volume to thin-pool and allocating i.e. _pmspare.
---
WHATS_NEW | 3 ++-
tools/lvconvert.c | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 6e23fcb..163077f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,7 @@
Version 2.02.131 -
=====================================
- Disallow usage of --stripe and --stripsize when creating cache pool.
+ Use passed list of PVS when allocating space in lvconvert --thinpool.
+ Disallow usage of --stripe and --stripesize when creating cache pool.
Warn user when caching raid or thin pool data LV.
When layering LV, move LV flags with segments.
Ignore persistent cache if configuration changed. (2.02.127)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 237de2d..6b8f7aa 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2348,7 +2348,7 @@ static int _lvconvert_pool_repair(struct cmd_context *cmd,
pmslv = pool_lv->vg->pool_metadata_spare_lv;
/* Check we have pool metadata spare LV */
- if (!handle_pool_metadata_spare(pool_lv->vg, 0, NULL, 1))
+ if (!handle_pool_metadata_spare(pool_lv->vg, 0, lp->pvh, 1))
return_0;
if (pmslv != pool_lv->vg->pool_metadata_spare_lv) {
@@ -2473,7 +2473,7 @@ deactivate_pmslv:
}
/* Try to allocate new pool metadata spare LV */
- if (!handle_pool_metadata_spare(pool_lv->vg, 0, NULL, 1))
+ if (!handle_pool_metadata_spare(pool_lv->vg, 0, lp->pvh, 1))
stack;
if (dm_snprintf(meta_path, sizeof(meta_path), "%s_meta%%d", pool_lv->name) < 0) {
8 years, 7 months