Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions app/upgrades/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
upgrade_v1_10_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_0"
upgrade_v1_10_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_1"
upgrade_v1_11_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_0"
upgrade_v1_11_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_1"
upgrade_v1_6_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_6_1"
upgrade_v1_8_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_0"
upgrade_v1_8_4 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_4"
Expand All @@ -35,6 +36,7 @@ import (
// | v1.10.0 | custom | drop crisis | Migrate consensus params from x/params to x/consensus; remove x/crisis
// | v1.10.1 | custom | drop crisis (if not already) | Ensure consensus params are present in x/consensus
// | v1.11.0 | custom | add audit store | Initializes audit params with dynamic epoch_zero_height
// | v1.11.1 | custom | none | Enforces audit min_disk_free_percent floor (>=15)
// =================================================================================================================================

type UpgradeConfig struct {
Expand Down Expand Up @@ -63,6 +65,7 @@ var upgradeNames = []string{
upgrade_v1_10_0.UpgradeName,
upgrade_v1_10_1.UpgradeName,
upgrade_v1_11_0.UpgradeName,
upgrade_v1_11_1.UpgradeName,
}

var NoUpgradeConfig = UpgradeConfig{
Expand Down Expand Up @@ -132,6 +135,10 @@ func SetupUpgrades(upgradeName string, params appParams.AppUpgradeParams) (Upgra
StoreUpgrade: &upgrade_v1_11_0.StoreUpgrades,
Handler: upgrade_v1_11_0.CreateUpgradeHandler(params),
}, true
case upgrade_v1_11_1.UpgradeName:
return UpgradeConfig{
Handler: upgrade_v1_11_1.CreateUpgradeHandler(params),
}, true

// add future upgrades here
default:
Expand Down
4 changes: 3 additions & 1 deletion app/upgrades/upgrades_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
upgrade_v1_10_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_0"
upgrade_v1_10_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_10_1"
upgrade_v1_11_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_0"
upgrade_v1_11_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_11_1"
upgrade_v1_6_1 "github.com/LumeraProtocol/lumera/app/upgrades/v1_6_1"
upgrade_v1_8_0 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_0"
upgrade_v1_8_4 "github.com/LumeraProtocol/lumera/app/upgrades/v1_8_4"
Expand All @@ -35,6 +36,7 @@ func TestUpgradeNamesOrder(t *testing.T) {
upgrade_v1_10_0.UpgradeName,
upgrade_v1_10_1.UpgradeName,
upgrade_v1_11_0.UpgradeName,
upgrade_v1_11_1.UpgradeName,
}
require.Equal(t, expected, upgradeNames, "upgradeNames should stay in ascending order")
}
Expand Down Expand Up @@ -80,7 +82,7 @@ func TestSetupUpgradesAndHandlers(t *testing.T) {

// v1.9.0 and v1.11.0 require full keeper wiring; exercising them here would require
// a full app harness. This test only verifies registration and gating.
if upgradeName == upgrade_v1_9_0.UpgradeName || upgradeName == upgrade_v1_10_0.UpgradeName || upgradeName == upgrade_v1_10_1.UpgradeName || upgradeName == upgrade_v1_11_0.UpgradeName {
if upgradeName == upgrade_v1_9_0.UpgradeName || upgradeName == upgrade_v1_10_0.UpgradeName || upgradeName == upgrade_v1_10_1.UpgradeName || upgradeName == upgrade_v1_11_0.UpgradeName || upgradeName == upgrade_v1_11_1.UpgradeName {
continue
}

Expand Down
71 changes: 71 additions & 0 deletions app/upgrades/v1_11_1/upgrade.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package v1_11_1

import (
"context"
"fmt"

upgradetypes "cosmossdk.io/x/upgrade/types"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"

appParams "github.com/LumeraProtocol/lumera/app/upgrades/params"
audittypes "github.com/LumeraProtocol/lumera/x/audit/v1/types"
)

// UpgradeName is the on-chain name used for this upgrade.
const UpgradeName = "v1.11.1"

// auditMinDiskFreePercentFloor is the minimum acceptable value for
// audit.params.min_disk_free_percent after this upgrade.
const auditMinDiskFreePercentFloor = uint32(15)

// CreateUpgradeHandler runs module migrations and enforces a floor for
// audit.params.min_disk_free_percent.
func CreateUpgradeHandler(p appParams.AppUpgradeParams) upgradetypes.UpgradeHandler {
return func(goCtx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
p.Logger.Info(fmt.Sprintf("Starting upgrade %s...", UpgradeName))

ctx := sdk.UnwrapSDKContext(goCtx)

p.Logger.Info("Running module migrations...")
newVM, err := p.ModuleManager.RunMigrations(ctx, p.Configurator, fromVM)
if err != nil {
p.Logger.Error("Failed to run migrations", "error", err)
return nil, fmt.Errorf("failed to run migrations: %w", err)
}
p.Logger.Info("Module migrations completed.")

if p.AuditKeeper == nil {
return nil, fmt.Errorf("%s upgrade requires audit keeper to be wired", UpgradeName)
}

params := p.AuditKeeper.GetParams(ctx).WithDefaults()
updatedParams, changed := withMinDiskFreePercentFloor(params, auditMinDiskFreePercentFloor)
if changed {
if err := p.AuditKeeper.SetParams(ctx, updatedParams); err != nil {
return nil, fmt.Errorf("set audit params: %w", err)
}
p.Logger.Info("Updated audit params min_disk_free_percent floor",
"previous", params.MinDiskFreePercent,
"current", updatedParams.MinDiskFreePercent,
)
} else {
p.Logger.Info("Audit min_disk_free_percent already satisfies floor",
"current", params.MinDiskFreePercent,
)
}

p.Logger.Info(fmt.Sprintf("Successfully completed upgrade %s", UpgradeName))
return newVM, nil
}
}

func withMinDiskFreePercentFloor(params audittypes.Params, floor uint32) (audittypes.Params, bool) {
params = params.WithDefaults()
if params.MinDiskFreePercent >= floor {
return params, false
}
params.MinDiskFreePercent = floor
return params, true
}
40 changes: 40 additions & 0 deletions app/upgrades/v1_11_1/upgrade_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package v1_11_1

import (
"testing"

"github.com/stretchr/testify/require"

audittypes "github.com/LumeraProtocol/lumera/x/audit/v1/types"
)

func TestWithMinDiskFreePercentFloor_RaisesWhenBelowFloor(t *testing.T) {
params := audittypes.DefaultParams()
params.MinDiskFreePercent = 0

updated, changed := withMinDiskFreePercentFloor(params, 15)
require.True(t, changed)
require.Equal(t, uint32(15), updated.MinDiskFreePercent)
}

func TestWithMinDiskFreePercentFloor_NoChangeAtOrAboveFloor(t *testing.T) {
testCases := []struct {
name string
value uint32
floor uint32
}{
{name: "equal", value: 15, floor: 15},
{name: "greater", value: 22, floor: 15},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
params := audittypes.DefaultParams()
params.MinDiskFreePercent = tc.value

updated, changed := withMinDiskFreePercentFloor(params, tc.floor)
require.False(t, changed)
require.Equal(t, tc.value, updated.MinDiskFreePercent)
})
}
}
Loading