Commit bdde40fe authored by Mike Hibler's avatar Mike Hibler

Rudimentary TRIM support.

We pass through a flag in the tmcd loadinfo call to tell whether to attempt
to do a TRIM when loading the disk (or after loading the disk). If TRIM=1
then we do so.

Since it is not clear from what I have read whether repeated TRIMming is
a detriment to SSD life, we throttle it as follows:

1. We don't TRIM at all unless the sitevariable general/bootdisk_trim_interval
   is non zero. If it is set, we will wait at least that many seconds after
   the previous TRIM before we do it again.

2. We keep track of the last trim via the node_attribute "bootdisk_lasttrim"
   which is a unix timestamp of the last time that tmcd responded to a
   loadinfo request in which it returned TRIM=1.

2. We track, on a per-node basis, whether the boot disk should be TRIMmed
   or not. If the node or node-type attribute "bootdisk_trim" is non-zero,
   we will attempt a trim if the interval has passed since the last trim.

So, we never trim if the sitevariable is 0 (the default value). If it is
non-zero, we only trim the boot disk of those nodes that have the node or
node_type attribute set and only after a sufficient interval has passed.

This does not address non-boot disks, but currently frisbee won't mess
with any other disk anyway. Eventually, we will have to have per-disk or
per-disktype attributes if we want to do this better.
parent 63fd4afa
......@@ -462,6 +462,7 @@ fixone() {
export SLICEFIX_CONSOLE=`getvar CONSOLE "$iline" unknown`
export SLICEFIX_BIOSDISK=`getvar BIOSDISK "$iline"`
export SLICEFIX_DOM0MEM=`getvar DOM0MEM "$iline" unknown`
export SLICEFIX_TRIM=`getvar TRIM "$iline" 0`
$BINDIR/slicefix $_PART $_DISK
return $?
......@@ -61,7 +61,8 @@ fi
# XXX on Moonshots, only "sio1" is supported.
case $CONSOLE in
......@@ -80,6 +81,17 @@ else
# TRIM is optional
case $TRIM in
echo "WARNING: unexpected TRIM argument \"$TRIM\", ignored"
# Indicates the MFS has been properly localized and we can copy stuff
# into the image.
......@@ -219,6 +231,16 @@ dolinux() {
# See if we need to trim the FS
if [ $TRIM -eq 1 -a -x "/sbin/fstrim" ]; then
echo " TRIMing FS"
/sbin/fstrim /mnt || {
echo "WARNING: could not fstrim /"
umount $rootdev
return 0
# Create site variable for disk TRIM interval.
use strict;
use libdb;
sub DoUpdate($$$)
my ($dbhandle, $dbname, $version) = @_;
my $var = "general/disk_trim_interval";
if (!TBSiteVarExists($var)) {
my $desc = "If non-zero, minimum interval (seconds) between attempts to TRIM ".
"boot disk during disk reloading. Zero disables all TRIM activity. ".
"Node must also have non-zero bootdisk_trim attribute.";
my $defval = "0";
DBQueryFatal("INSERT INTO sitevariables VALUES ".
return 0;
This diff is collapsed.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment