Dmitry Katsubo posted on Wed, 14 Oct 2015 22:27:29 +0200 as excerpted:

> On 14/10/2015 16:40, Anand Jain wrote:
>>> # mount -o degraded /var Oct 11 18:20:15 kernel: BTRFS: too many
>>> missing devices, writeable mount is not allowed
>>>
>>> # mount -o degraded,ro /var # btrfs device add /dev/sdd1 /var ERROR:
>>> error adding the device '/dev/sdd1' - Read-only file system
>>>
>>> Now I am stuck: I cannot add device to the volume to satisfy raid
>>> pre-requisite.
>> 
>>  This is a known issue. Would you be able to test below set of patches
>>  and update us..
>> 
>>    [PATCH 0/5] Btrfs: Per-chunk degradable check
> 
> Many thanks for the reply. Unfortunately I have no environment to
> recompile the kernel, and setting it up will perhaps take a day. Can the
> latest kernel be pushed to Debian sid?

In the way of general information...

While btrfs is no longer entirely unstable (since 3.12 when the 
experimental tag was removed) and kernel patch backports are generally 
done where stability is a factor, it's not yet fully stable and mature, 
either.  As such, an expectation of true stability such that wishing to 
remain on kernels more than one LTS series behind the latest LTS kernel 
series (4.1, with 3.18 the one LTS series back version) can be considered 
incompatible with wishing to run the still under heavy development and 
not yet fully stable and mature btrfs, at least as soon as problems are 
reported.  A request to upgrade to current and/or to try various not yet 
mainline integrated patches is thus to be expected on report of problems.

As for userspace, the division between btrfs kernel and userspace works 
like this:  Under normal operating conditions, userspace simply makes 
requests of the kernel, which does the actual work.  Thus, under normal 
conditions, updated kernel code is most important.  However, once a 
problem occurs and repair/recovery is attempted, it's generally userspace 
code itself directly operating on the unmounted filesystem, so having the 
latest userspace code fixes becomes most important once something has 
gone wrong and you're trying to fix it.

So upgrading to a 3.18 series kernel, at minimum, is very strongly 
recommended for those running btrfs, with an expectation that an upgrade 
to 4.1 should be being planned and tested, for deployment as soon as it's 
passing on-site pre-deployment testing.  And an upgrade to current or 
close to current btrfs-progs 4.2.2 userspace is recommended as soon as 
you need its features, which include the latest patches for repair and 
recovery, so as soon as you have a filesystem that's not working as 
expected, if not before.  (Note that earlier btrfs-progs 4.2 releases, 
before 4.2.2, had a buggy mkfs.btrfs, so they should be skipped if you 
will be doing mkfs.btrfs with them, and any btrfs created with those 
versions should have what's on them backed up if it's not already, and 
the filesystems recreated with 4.2.2, as they'll be unstable and are 
subject to failure.)

> 1. Is there any way to recover btrfs at the moment? Or the easiest I can
> do is to mount ro, copy all data to another drive, re-create btrfs
> volume and copy back?

Sysadmin's rule of backups:  If data isn't backed up, by definition you 
value the data less than the cost of time/hassle/resources to do the 
backup, so loss of a filesystem is never a big problem, because if the 
data was of any value, it was backed up and can be restored from that 
backup, and if it wasn't backed up, then by definition you have already 
saved the more important to you commodity, the hassle/time/resources you 
would have spent doing the backup.  Therefore, loss of a filesystem is 
loss of throw-away data in any case, either because it was backed up (and 
a would-be backup that hasn't been tested restorable isn't yet a 
completed backup, so doesn't count), or because the data really was throw-
away data, not worth the hassle of backing up in the first place, even at 
risk of loss should the un-backed-up data be lost.

No exceptions.  Any after-the-fact protests to the contrary simply put 
the lie to claims that the value was considered valuable, since actions 
spoke louder than words and actions defined the data as throw-away.

Therefore, no worries.  Worst-case, you either recover the data from 
backup, or if it wasn't backed up, by definition, it wasn't valuable data 
in the first place.  Either way, no valuable data was, or can be, lost.

(It's worth noting that this rule nicely takes care of the loss of both 
the working copy and N'th backup case, as well, since again, either it 
was worth the cost of N+1 levels of backup, or that N+1 backup wasn't 
made, which automatically defines the data as not worth the cost of the 
the N+1 backup, at least relative to the risk factor that it might 
actually be needed.  That remains the case, regardless of whether N=0 or 
N=10^1000, since even at N=10^1000, backup to level N+1 is either worth 
the cost vs. risk -- the data really is THAT valuable -- or it's not.)

Thus, the easiest way is very possibly to blow away the filesystem, 
recreate and restore from backup, assuming the data was valuable enough 
to make that backup in the first place.  If it wasn't, then we already 
know the value of the data is relatively limited, and the question 
becomes one of whether the chance of recovery of the already known to be 
very limited value data is worth the hassle cost of trying to do that 
recovery.

FWIW, here, I do have backups, but I don't always keep them as current as 
I might.  By doing so, I know my actions are defining the value of the 
data in the delta between the backups and current status as very limited, 
but that's the choice I'm making.

Fortunately for me, btrfs restore (the actual btrfs restore command), 
working on the unmounted filesystem, can often restore the data from the 
filesystem even if it won't mount, so the risk of actual loss of that 
data is much lower than the risk of not actually being able to mount the 
filesystem, of course letting me get away with delaying backup updates 
even longer, as the risk of total loss of the data in the delta between 
the backup and current is much lower than it would be otherwise, thereby 
making the cost of backup updates relatively higher in comparison, 
meaning I can and do space them further apart.

FWIW I've had to use btrfs restore twice, since I started using btrfs.  
Newer btrfs restore (from newer btrfs-progs) works better than older 
versions, too, letting you optionally restore ownership/permissions and 
symlinks, where previously both were lost, symlinks simply not restored, 
and ownership/permissions the default for the btrfs restore process 
(root, obviously, umask defaults).  See what I mean about current 
userspace being recommended. =:^)

Since in your case you can mount, even if it must be read-only, the same 
logic applies, except that grabbing the data off the filesystem is easier 
since you can simply copy it off and don't need btrfs restore to do it.

Of course the existence of those patches gives you another alternative as 
well, letting you judge the hassle cost of setting up the build 
environment and updating, against that of doing the copy off the read-
only mounted filesystem, against that of simply declaring the filesystem 
a loss and blowing it away, to either restore from backup, or if it 
wasn't backed up, simply losing what is already defined as data of very 
limited value anyway.

> 2. How to avoid such a trap in the future?

Keep current. =:^)  At least to latest LTS kernel and last release of 
last-but-one userspace series (which would be 4.1.2 IIRC as I don't 
remember a 4.1.3 being released).

Or at the bigger picture, ask yourself whether running btrfs is really 
appropriate for you until it further stabilizes, since it's not fully 
stable and mature yet, and running it is thereby incompatible with the 
conservative stability objectives of those who wish to run older tried 
and tested really stable versions.  Perhaps ext4 (or even ext3), or 
reiserfs (my previous filesystem of choice, with which I've had extremely 
good experience) or xfs are more appropriate choices for you, if you 
really need that stability and maturity.

> 3. How can I know what version of kernel the patch "Per-chunk degradable
> check" is targeting?

It may be worth (re)reading the btrfs wiki page on sources.  Generally 
speaking, there's an integration branch, where patches deemed mostly 
ready (after on-list review) are included, before they're accepted into 
the mainline Linus kernel.  Otherwise, patches are generally based on 
mainline, currently 4.3-rcX, unless otherwise noted.  If you follow the 
list, you'll see the pull requests as they are posted, and for the Linus 
kernel, pulls are usually accepted within a day or so, if you're 
following Linus kernel git, as I am.

For userspace, git master branch is always the current release.  There's 
a devel branch that's effectively the same as current integration, except 
that it's no longer updated on the kernel.org mirrors.  The github mirror 
or .cz mirrors (again, as listed on the wiki) have the current devel 
branch, however, and that's what gentoo's "live" ebuild now points at, 
and what I'm running here (after I filed a gentoo bug because the live 
ebuild was pointed at the stale devel branch of the kernel.org kdave 
mirror and thus was no longer updating, that got the live ebuild pointed 
at the current devel branch on the .cz mirrors).

So you can either run current release and cherry-pick patches you want/
need as they are posted to the list, or if you want something live but a 
bit more managed than that, run the integration branches and/or for 
userspace, the devel branch.

> 4. What is the best way to express/vote for new features or suggestions
> (wikipage "Project_ideas" / bugzilla)?

Well, the wiki page is user-editable, if you register.  (Tho last I knew, 
there was some problem with at least some wiki user registrations, 
requiring admin intervention in some cases as posted to the list.)  
Personally, I'm more a list person, however, and have never registered on 
the wiki.

In general, however, there's only a few btrfs devs, and between bug 
tracking and fixing and development of the features they're already 
working on or have already roadmapped as their next project, with each 
feature typically taking a kernel cycle and often several kernel cycles 
to develop and stabilize, they don't so often pick "new" features to work 
on.

There are independent devs that sometimes pick a particular feature 
they're interested in, and submit patches for it, but those features may 
or may not be immediately integrated, depending on maturity of the patch 
set, how it meshes with the existing roadmap, whether the dev intends to 
continue to support that feature or leave it to existing devs to support 
after development, and in general, how well that dev works with existing 
longer-term btrfs devs.  In general, a dev interested in such a project 
should either be prepared to carry and maintain the patches as an 
independent patch set for some time if they're not immediately 
integrated, or should plan on a one-time "proof of concept" patch set 
that will then go stale if it's not integrated, tho it may still be 
better than starting from scratch, should somebody later want to pick up 
the set and update it for integration.

So definitely, I'd say add it to the wiki page, so it doesn't get lost 
and can be picked up when it fits into the roadmap, but be prepared for 
it to sit there, unimplemented, for some years, as there's simply way 
more ideas than resources to implement them, and the most in-demand 
features will obviously be already listed by now.

For more minor suggestions, tweaks to current functionality or output, 
etc, run current so you're suggestions are on top of a current base, and 
either post the suggestions here, or where they fit, add them as comments 
to proposed patches as they are posted.  Of course, if you're a dev and 
can code them up as patches yourself, so much the better! =:^)
(I'm not, FWIW. =:^( )

Many of your suggestions above fit this category, minor improvements to 
current output.  However, in some cases the wording in current is already 
better than what you were running, so your suggestions read as stale, and 
in others, they don't quite read (to me at least, tho I already said I'm 
not a dev) as practical.

In particular, tracking last seen device doesn't appear practical to me, 
since in many instances, device assignment is dynamic, and what was
/dev/sdc3 a couple boots ago may well be /dev/sde3 this time around, in 
which case listing /dev/sdc3 could well only confuse the user even more.

Tho that isn't to say that the suggestions don't have some merit, 
pointing out where some change of wording, if not to your suggested 
wording, might be useful.

In particular, btrfs filesystem show, should work with both mounted and 
unmounted filesystems, and would have perhaps given you some hints about 
what devices should have been in the filesystem.  The assumption seems to 
be implicit that a user will know to run that, now, but perhaps an 
explicit suggestion to run btrfs filesystem show, would be worthwhile.  
The case can of course be argued that such an explicit suggestion isn't 
appropriate for dmesg, as well, but at least to my thinking, it's at 
least practical and could be debated on the merits, where I don't 
consider the tracking of last seen device as practical at all.

Anyway, btrfs filesystem show, should work for unmounted as well as 
mounted filesystems, and is already designed to do what you were 
expecting btrfs device scan to do, in terms of output.  Meanwhile, btrfs 
device scan is designed purely to update the btrfs-kernel-module's idea 
of what btrfs filesystems are available, and as such, it doesn't output 
anything, tho if there was some change that the kernel module didn't know 
about, a btrfs filesystem show, followed by a btrfs device scan and 
another btrfs filesystem show, would produce different results for the 
two show outputs.  (Meanwhile, show's --mounted and --all-devices options 
can change what's listed as well, and if you're interested in just one 
filesystem, you can feed that to show as well, to get output for just it, 
instead of for all btrfs the system knows about.  See the manpage...)

Similarly, your btrfs scrub "was aborted after X seconds" issue is known, 
and I believe fixed in something that's not effectively ancient history, 
in terms of btrfs development.  So remarking on it simply highlights the 
fact that you're running ancient versions and complaining about long 
since fixed issues, instead of running current versions where at least 
your complaints might still have some validity.  And if you were running 
current and still had the problem, well at least I'd know that while I 
remember it being discussed, the fix could not have made it into current 
yet, since the bad output (which I don't recall seeing in older versions 
either, possibly because I run multiple small btrfs on partitioned ssds, 
so the other scrubs completed fast enough I didn't have a chance to see 
the aborted after one completed/aborted but before the others did) would 
then still be reported in current, tho I /think/ it has been fixed since 
it was discussed, but I didn't actually track that individual fix to see 
if it's in current or not, since I never saw the problem in my case 
anyway.

-- 
Duncan - List replies preferred.   No HTML msgs.
"Every nonfree program has a lord, a master --
and if you use the program, he is your master."  Richard Stallman

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to