func (d *delayedRouteUpdater) run() {
	err := wait.PollImmediateInfinite(d.interval, func() (bool, error) {
		d.updateRoutes()
		return false, nil
	})
	if err != nil {  
		panic(err)
	}
}
run starts the updater reconciling loop.
package azure
import (
	"context"
	"fmt"
	"strings"
	"sync"
	"time"
	"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network"
	"github.com/Azure/go-autorest/autorest/to"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/apimachinery/pkg/util/wait"
	cloudprovider "k8s.io/cloud-provider"
	"k8s.io/klog/v2"
	azcache "k8s.io/legacy-cloud-providers/azure/cache"
	"k8s.io/legacy-cloud-providers/azure/metrics"
	utilnet "k8s.io/utils/net"
)
var (
	routeUpdateInterval = 30 * time.Second
)
type routeOperation string
const (
	routeNameFmt       = "%s____%s"
	routeNameSeparator = "____"
	routeOperationAdd             routeOperation = "add"
	routeOperationDelete          routeOperation = "delete"
	routeTableOperationUpdateTags routeOperation = "updateRouteTableTags"
)
type delayedRouteOperation struct {
	route          network.Route
	routeTableTags map[string]*string
	operation      routeOperation
	result         chan error
}
func (op *delayedRouteOperation) wait() error {
	return <-op.result
}
type delayedRouteUpdater struct {
	az       *Cloud
	interval time.Duration
	lock           sync.Mutex
	routesToUpdate []*delayedRouteOperation
}
func newDelayedRouteUpdater(az *Cloud, interval time.Duration) *delayedRouteUpdater {
	return &delayedRouteUpdater{
		az:             az,
		interval:       interval,
		routesToUpdate: make([]*delayedRouteOperation, 0),
	}
}