Go TTL expiration checker always returns false

38 Views Asked by At

I have this TTL expiration checker that takes creationDate string & ttl int (seconds):

package utils

import ...

func IsExpired(creationDate string, ttl int) (bool, error) {
    createdAt, err := time.Parse("2006-01-02 15:04:05", creationDate)

    if err != nil {
        return false, err
    }

    expirationTime := createdAt.Add(time.Duration(ttl) * time.Second)
    currentTime := time.Now()

    return currentTime.After(expirationTime), nil
}

When I pass this JSON dataset (parsed of course):

{"hello":{"value":"world","created_at":"2023-06-08 18:08:22","ttl":2}}

It returns false for the first 2 seconds which I expect. But then even after 2 seconds, it returns false? I looked for a lot of solutions but still all of them give me the same snippet which gives always returns false.

Here is where I am using it if needed:

func CleanDB() {
    ticker := time.NewTicker(5 * time.Second)

    for range ticker.C {
        mapJsonContent, err := readFromCache()

        if err != nil {
            fmt.Println("Database cleaner: cleaning iteration failed.")
            return
        }

        for key, data := range mapJsonContent {
            if data.CreatedAt == "" {
                continue
            }

            expired, err := utils.IsExpired(data.CreatedAt, data.TTL)

            if err != nil {
                fmt.Printf("Database cleaner: Failed to parse `map[%s].CreatedAt` as datetime\n", key)
                continue
            }

            // Always prints "next false"
            fmt.Println("next ", expired)

            if expired {
                // NEVER prints
                fmt.Println("expired: ", key)
                DeleteValue(key)
            }
        }
    }
}

The CleanDB is run as a go routine in the main.go file.

Can anyone help ?

0

There are 0 best solutions below