In other words, this creates a categorized summary
of differences between what you have and what's available.
This is helpful for managing the IO load on a storage device used by several jobs that run in parallel with each other.
This assumes full-load conditions, i.e. with all jobs in the group
being active and hungry for bandwidth.
Instead we can use the max observed value as a
base, i.e. 2568, and it will give us something like this:
Next, we'll make the no-changes pixels stand out
a bit more, because they are, after all, interesting.
Next, we are going to amplify differences between non-zero
shades a bit by applying
gamma correction:
This is not bad, but in this particular case only 1% of
the file was modified and copied over. The bar however
implies that it was higher than that. So we will tone
things down a bit by bumping up our observed max
of 2568 a bit closer to the true max of 16384:
That's hardly an improvement. But we can gamma-correct
the contraction here to reduce its effect on larger
values. This will give us this:
Finally, we can also apply contraction only if the
value is under 50% of the max, i.e. if it is indeed
small-ish (and already lighter):
To see the exact effect of slice contraction we
can take color gamma to 0 and it will render
like so:
And that's it. We introduced a bit of color and
geometrical variety to the bar, but without making
it too jarring or noisy-looking.
If it's larger, it just randomizes the heck out of
the whole thing:
Combined with extreme gamma values it can also produce
bars like this:
These versions look as interesting as they are confusing.
The up and down movement doesn't really mean anything,
but it looks it does. So - the dead-end.
To explain it differently:
It will also be mentioned in the completion statement
for all non-empty files:
Finally, if a write verification fails, the log will
show the following:
Verification failures are non-retryable, the
program will not retrying the operation in an attempt
to correct the problem.
When this happens, earlier Bvckup 2 versions would say
that the run completed with 2 errors and 1 retry...
which was not terribly helpful, even if it was technically correct.
The second caveat is that wake-up timers are imprecise.
The engine runs autonomously in the background as
a system service, under a service user account.
The user interface runs as a regular
desktop program, under a desktop user account.
Once enabled, it will cause the program to pop up a
password prompt when the UI is opened. No password = no UI.
This option is primarily meant for preventing non-admin
local users from opening the UI and messing with the setup.
5. Don't forget your password.
This gives too much prominence to an otherwise minor option and
it also invites to mess with it. We can do better.
The option is shown as a text, but can be edited by clicking on it.
We take this option out and put it into a separate text. Also
stick it at the very end of the text. This allows stretching
out the edit box to the max and don't bother with dynamically
sizing it:
We can also add a bit of transition to compensate for edit box
not aligning with the option value when it is static.
This is not bad. Let's try with a borderless edit box:
Not bad either and the slide is just a couple of pixels
now. How about we don't slide it at all?
Looks and feels quite nice, however...
When this happens, the completion time gets pushed back and the
UI reacts to this by highlighting the estimate in red.
It also increases its rate of refresh to make changes more obvious.
The estimator also keeps monitoring effective ETA to make sure
it doesn't drift too far away from the fixed estimate. If it
does, then the estimator initiates go back into correcting
state and the process repeats itself.
So there you have it - our new and shiny stabilized estimator.
Coming up in Release 80.9.
*
A broader context here is that even the fastest storage devices
will complete the IO unevenly. As a result the raw measurements
that go into an estimator will always be noisy and feeding
them into an estimator, as-is, will produce noisy estimates.
This is more distracting than it is helpful.
The same will also happen to the last-modified timestamp. Even
though we "touch" the file, everyone else will be seeing its old
timestamp until we release the file reference.
| R80 (before) | 17 sec |
| R81 (after) | 5.7 sec |
An offline file like this will have either
Recall-On-Open or Recall-On-Data-Access
attribute set, allowing it to be identified as such.
The Pinned attribute will be set on files that
were marked for permanent local storage using
"Always keep on this device" -
These files will show up with the solid green icon
in the Explorer.
Conversely, the Unpinned attribute will be set
on files that were explicitly purged from the computer
using "Free up space" -
Finally, there's also an Offline attribute that
is set on offline files by older versions of OneDrive.
With release 80.5 it becomes possible to define rules
based on these four attributes.
That's an undersea network cable cross-section... or at least
an artist's impression of the same.
The list was over 50 entries long, stretching as far
as "bastion", "marmalade" and "formaldehyde".
It's reasonably short.
So, ladies and gentlemen, until we decide to rename ourselves
again we shall be known as the IO Bureau.
For example, if there were an include *.dll rule defined
further below, it will now no longer pick up basebrd.dll
from Basebrd subfolder.
Prior to this change excluding a folder wasn't
"final",
meaning that it merely set the default action for all sub-items
to exclude, and this action could still be overridden
by other rules.
And here's one with the new logic:
Second is the monochrome, which is a reduction of the
first version to just black and white:
The last one is simple, which is just the shape without
any embellishments as used for program icons and such.
While we are at it, it's probably worth sharing several other
options that didn't make the cut.
An alternative shading style:
Something with color:
Truth be told, the one of the left was my absolute
favorite, but it ended up looking like a royal mess
at smaller sizes. And smaller sizes are
important, because, you know... Windows.
Then, as nears the end of a file two things can happen. If the
file size is not a multiple of block size, the program will
receive back an incomplete block:
And if the file is perfectly aligned to the block size, the
program will see either a zero-sized block or an explicit
"end of file" notification or EOF for short.
Upon seeing either of these lovely events, the program will
know that it reached the end of the file and there's nothing
else left to copy.
Technically, it makes some sense - this allows salvaging
at least some data from a corrupted block. Practically however
this is completely useless unless you are in a data recovery
business.
So, going back to the desktop mode requires another step -
we need to reset the owner on all engine config files.
This issue is further compounded by the fact that the number of
files in the engine config can be really quite large.
So that is the slow part.
There's now Check for updates option
next to the version info, which is automatically
displayed as Newer version is available
notice if there was one seen at some point earlier
on:
The window also got a separate Validity field,
which is used for displaying remaining
trial time and also for confirming that
all production licenses are in fact perpetual.
* It is also perfectly possible to throttle disk load
dynamically
by looking at the actual disk performance and by yielding IO
capacity to other programs when required. This is planned and
it will be coming with later releases.
Feature releases are major versions that introduce
new features and significant improvements - R79, R80, etc.
The one year starts from the moment of licensing an
installation. All major releases within one year
window are included, each of which coming with a
lifetime of maintenance updates.
The paid-for option will extend the access to feature releases
for another year and will be priced as a smaller percentage of
the original license cost.
However since we are resuming after a write
failure, some of these writes may actually
have never hit the storage media even though
they were reported as "completed". This is due to all
the caching, lazy-writing and outright lying that
modern drives do to improve their performance.
For this reason when resuming after a write
failure the ultra will go through the write
log, read respective parts of the backup copy
and check their hashes against
those stored in the delta state. If there's
a match, we are in clear. Otherwise, it's a
block we need to re-copy.
When files change, more often than not they change only
here and there, in an isolated manner. This makes
delta copying a godsend for backing up all sorts of large,
slowly changing files from large RAW
photos, to database files, to VM images and
encrypted file containers.
| Block size | 32KB |
| Block hashes | MD5 + a variant of CRC32 |
| Full-file hash | SHA-1 |
| HDD | Seagate ST9500325AS | 70.5 MB/s |
| HDD | WDC WD5000LPVX | 118.8 MB/s |
| SHA-1 | Intel i3 @ 2.53GHz | 332.4 MB/s |
| SHA-1 | Xeon E5 v4 @ 2.10GHz | 380.1 MB/s |
| SSD | Samsung T3, USB 3.0 | 429.7 MB/s |
| SHA-1 | Intel i5 @ 2.70GHz | 520.9 MB/s |
| SSD | Samsung 860 Pro | 534.8 MB/s |
| NVMe | Samsung MZVPV512HDGL | 2157.9 MB/s |
| Block size | 64KB |
| Block hashes | Blake2b + xxHash + Spooky |
| Full-file hash | - |
| MD5 | 595.4 MB/s |
| SHA-1 | 561.9 MB/s |
| SHA-256 | 247.4 MB/s |
| SHA-512 | 391.4 MB/s |
| Blake2b | 762.3 MB/s |
| Release 78 | Release 79 | |
| Creating | 262.8 MB/s | 547.2 MB/s |
| Updating | 272.5 MB/s | 2026.6 MB/s |
The effect of this obviously varies,
but it can be as eye-popping
as a threefold speed-up,
for example, when cloning C:\Windows on an
NVMe
drive.
With IOCP we no longer need to drag the full list
of pending requests across the userspace boundary
just to learn which of them might've been completed.
This allows for uniform handling of all async
operations in the IO code. Reading, hashing
and writing now become equal parts of the IO pipeline,
leading to a simpler code.
Jun 2013:
Sep 2013:
Nov 2013:
Nov 2013:
Feb 2014:
Aug 2015:
Dec 2017:
The original plan was to switch to the last style,
but after testing it on live data it proved to animate
very poorly. When IO buffers are large (which is
common) that nice right-to-left sliding animation
turns into a jumpy-jerky movement which is plain
confusing.
...though that's certainly not the final word in
the progress bar saga. Far from it.
These two samples are both in the MB range,
very close to each other, but looking at
the KB band it's immediately obvious which
one is larger and approximately by how much.
This sort of analysis is often needed when trying
to spot jitter that is order of magnitude
smaller than absolute sample values.
Here's the same file being copied with a custom,
somewhat better optimized code:
* Both tests are run with the file cache purged.
... through ...
... some ...
... options ...
... it became obvious that having two lines per entry
was a way to go and that volumes and devices should be on
separate lists, both visible simultaneously.
After a bit more sketching the lists arranged themselves
into two columns and the scroll bar of the left list went
to the left of it:
* I must say that the idea of placing that damn scroll bar
on the left took waaay too long to converge to. For
whatever reason it's just a strangely un-obvious thing
to do...
out-of-view arrows...
and connector points...
and, voilà, we now have something that is both
usable and reasonably good-looking.
Still to be added is a separate pane for displaying
further details - device hardware info, SMART data,
etc. This pane will sit at the bottom of the window
and will switch between showing volume and device
details depending on what's selected above.
Stay tuned for the updates :)
† This is a GIF, trust me.
In Bvckup's case a progress bar also needs to
accommodate the delta copying. In particular,
the bar should be able to display processed file
blocks that were copied in full, copied
in part or not copied at all.
Will probably go either with the 2nd from
the top or the 5th from the bottom. Maybe
both.
This is OK in terms of usability, but when taken as a part
of the whole it makes window look cluttered:
And *unnecessary* cluttered at that, because in a vast
majority of cases Owner and Group will be either both checked
or unchecked. Ditto for Security and Audit options.
"Indeterminate" is a rather strange term as if
the program is not sure in which state the option is.
However we can think of it as an in-between or
partial state and do something like this:
This is not bad, however we lose the overall meaning
of the option when it is in a partial state:
So let's put the context back:
Better, but now we are back to things being too
verbose and looking cluttered. Let's simplify
it for two most common cases:
Better, but now it's off visually:
How about with chop the specifics and move them to
the side:
Almost there, just need to patch up visual hierarchy
a bit to help telling principal parts from the
secondary ones:
And that's it. The result is an UI that looks clean
and simple for two most common cases, fully supports
marginal ones and packs 4 options in a space of two.
So when bvckup2 looks at what to do with any given file
or folder, it will first pass it through this set of
filters, yielding a preliminary include or
exclude action.
First hit on any of these
determines the outcome. If there are no hits, then
the default action it is.
There are also new, finer controls over the filtering
flow. In short - it's now possible to mark any generic
filter as final, which will suppress generic
filter matching for all folder contents.
Bonus material
If you are to think about all this for as looong as I have, you might realize that the Include everything / Start with an empty list selector at the top, this one -
is actually no longer needed!
Blinkety-blink. Here's a slo-mo in all its glory:
So after killing several hours on trying to make it
behave, it became clear that it's faster and simpler
to just redo it from scratch.
Please note that this feature is currently
reserved for site license and larger resellers
only, and it is enabled on a case-by-case basis.
Primary list of drives and volumes on the left,
with details of a selected item on the right, organized
into a tree of "key:value" entries.
Next, note that items in bold act like section
headers, so they don't really need to be collapsible.
So we do away with the buttons and connecting lines
between top-level items:
This gets us a bit of extra horizontal space and trims
a useless, but still actionable UI element.
Next, we try and improve readability of the data on the
right by helping to guide the eye from a key to its
value.
At this point, we take a sip of our cold coffee, squint
an eye and assess if we like how it looks.
Now, that's not bad either and it has a nice
visual consistency with the selection bar in the
left pane.
That's not a disaster, but we can do better.
With this change in place we can just restart the row
highlight sequence at the top of each section and
all's good.
Another sip of coffee, re-squint the eye and
the whole thing now looks a bit cluttered and
busy.
Next, we remove vertical connecting lines leading
from section headers to the top-level items.
Next, we move the expand/collapse buttons to
the right.
Alright, so that's about it as far as functional
tweaks go. So now it's where it gets subjective. We are
going to spruce it up a bit.
Add a bit of hue to the row highlights, tint their
edges a bit and also flatten the look of
expand/collapse buttons:
Splice in a scroll bar and make sure our precious design
still looks reasonable:
Re-style the left pane to look more like an actual connected
hierarchy of disks and volumes. The rationale here is to make
it more obvious that items on the left are clickable.
Almost there. Take a final look and adjust vertical padding
and spacing to de-clump items a bit more:
And here it is. Compare to the
starting point and you'd
probably agree that there's at least some improvement.
Needless to say,
one man's extra vertical padding is another man's complete
waste of space, but any customization is always a combination
of rational and subjective choices. The former is what gives
an app the ease of use and the latter is what give it the
personality. Can't have one without the other.
After:
Likewise, resizing by the bottom edge should
expand/compress the bottom pane, but not the
top one.
All good so far, but, say, we change our mind and start
expanding the window back (without releasing the mouse
button).
Here are few options that were leading up to the above one:










The backup job - two VM machines, 32 and 256 GB in size. One is an active Linux image with LNMP stack and another is a desktop Windows with the usual end-user stuff - web browser, mail, etc.
After enabling changed range tracking for the volume and re-configuring the job to use it, the backup time for a day worth of changes went from 14 minutes to 31 seconds ... half of which was spent on making a VSS snapshot.
One might be tempted to say that this is not bad.