Moved some types into internal folder as they will do not need to be exported. Changed GetState method to getState to make it private to the echovault package

This commit is contained in:
Kelvin Mwinuka
2024-03-26 20:26:48 +08:00
parent a8ad7e3db1
commit bc188cfea4
17 changed files with 551 additions and 507 deletions

View File

@@ -20,7 +20,6 @@ import (
"github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/commands" "github.com/echovault/echovault/pkg/commands"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils"
"log" "log"
"os" "os"
"os/signal" "os/signal"
@@ -33,7 +32,7 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
ctx := context.WithValue(context.Background(), utils.ContextServerID("ServerID"), conf.ServerID) ctx := context.WithValue(context.Background(), internal.ContextServerID("ServerID"), conf.ServerID)
// Default BindAddr if it's not specified // Default BindAddr if it's not specified
if conf.BindAddr == "" { if conf.BindAddr == "" {

View File

@@ -1,77 +1,4 @@
mode: set mode: set
github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:33.108,34.34 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:33.108,34.34 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:34.34,36.3 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:34.34,36.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:37.2,38.9 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:37.2,38.9 2 1
@@ -276,260 +203,6 @@ github.com/echovault/echovault/pkg/modules/acl/commands.go:569.62,571.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:579.62,581.7 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:579.62,581.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:592.62,594.7 1 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:592.62,594.7 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:602.62,604.7 1 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:602.62,604.7 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:33.13,34.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:34.34,38.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:40.2,41.29 2 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:41.29,43.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:51.104,53.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:53.16,55.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:57.2,62.16 5 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:62.16,64.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.2,68.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.16,69.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:69.34,71.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:71.9,73.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.2,76.44 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.44,78.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:78.34,80.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:81.3,81.36 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.8,82.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.51,84.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:84.33,86.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:87.3,87.45 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:88.8,90.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:90.34,93.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:93.9,96.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.16,100.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:101.2,103.76 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:103.76,105.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.2,108.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.28,110.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:112.2,112.17 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:115.105,116.44 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:116.44,118.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:120.2,123.15 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:123.15,124.29 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:124.29,125.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:125.16,131.5 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.2,136.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.30,137.15 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:137.15,142.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.2,147.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.28,148.31 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:148.31,149.52 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:149.52,151.5 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:152.4,153.12 2 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.3,155.60 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.60,157.4 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:158.3,158.55 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.2,162.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.28,163.58 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:163.58,165.4 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:168.2,168.38 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:171.104,173.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:173.16,175.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:176.2,178.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:178.33,180.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:182.2,183.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:183.16,185.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:186.2,190.51 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:193.105,195.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:195.16,197.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:199.2,202.27 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:202.27,203.31 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:203.31,205.12 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.3,207.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.33,209.18 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:209.18,211.5 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:212.4,213.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:215.3,215.19 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.2,217.15 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.15,218.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:218.34,219.14 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:219.14,222.5 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.2,226.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.28,228.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:230.2,232.30 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:232.30,233.24 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:233.24,235.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:237.3,237.96 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:240.2,240.19 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:243.104,245.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:245.16,247.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:248.2,249.27 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:249.27,251.17 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:251.17,253.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:255.3,255.13 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:257.2,257.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:260.108,262.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:262.16,264.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:266.2,268.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:268.33,270.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.2,272.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.51,274.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:275.2,278.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:278.31,280.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:282.2,284.30 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:287.111,289.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:289.16,291.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:293.2,295.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:295.33,297.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.2,299.52 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.52,301.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:302.2,306.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:306.31,308.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:310.2,311.46 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:311.46,313.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:315.2,315.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:318.104,320.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:320.16,322.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:324.2,326.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:326.33,328.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.2,330.52 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.52,332.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:333.2,337.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:337.31,339.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:341.2,342.39 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:342.39,344.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.2,346.12 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.12,348.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:350.2,350.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:353.107,355.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:355.16,357.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:359.2,363.16 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:363.16,365.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:366.2,367.42 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:367.42,369.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.2,371.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.33,373.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.2,375.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.51,377.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:378.2,380.19 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:380.19,383.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:385.2,387.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:388.12,389.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:389.39,391.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:392.3,392.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:393.12,394.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:394.39,396.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:397.3,397.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:398.12,399.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:399.39,401.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.3,402.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.39,404.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:405.3,405.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:406.12,407.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:407.39,408.40 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:408.40,410.5 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:411.4,411.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:413.3,413.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:414.10,415.71 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:418.2,418.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:421.109,423.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:423.16,425.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:427.2,431.16 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:431.16,433.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:434.2,435.44 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:435.44,437.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.2,439.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.33,441.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.2,443.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.51,445.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:446.2,448.19 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:448.19,451.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:453.2,455.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:456.12,457.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:457.39,459.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:460.3,460.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:461.12,462.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:462.39,464.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:465.3,465.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:466.12,467.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:467.39,469.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.3,470.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.39,472.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:473.3,473.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:474.12,475.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:475.39,476.40 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:476.40,478.5 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:479.4,479.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:481.3,481.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:482.10,483.71 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:486.2,486.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:489.33,644.2 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0
github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1
@@ -794,6 +467,260 @@ github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1 github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1 github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1
github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1 github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:33.13,34.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:34.34,38.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:40.2,41.29 2 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:41.29,43.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:51.104,53.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:53.16,55.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:57.2,62.16 5 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:62.16,64.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.2,68.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:68.16,69.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:69.34,71.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:71.9,73.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.2,76.44 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:76.44,78.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:78.34,80.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:81.3,81.36 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.8,82.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:82.51,84.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:84.33,86.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:87.3,87.45 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:88.8,90.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:90.34,93.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:93.9,96.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:98.16,100.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:101.2,103.76 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:103.76,105.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.2,108.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:108.28,110.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:112.2,112.17 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:115.105,116.44 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:116.44,118.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:120.2,123.15 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:123.15,124.29 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:124.29,125.16 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:125.16,131.5 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.2,136.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:136.30,137.15 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:137.15,142.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.2,147.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:147.28,148.31 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:148.31,149.52 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:149.52,151.5 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:152.4,153.12 2 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.3,155.60 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:155.60,157.4 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:158.3,158.55 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.2,162.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:162.28,163.58 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:163.58,165.4 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:168.2,168.38 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:171.104,173.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:173.16,175.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:176.2,178.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:178.33,180.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:182.2,183.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:183.16,185.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:186.2,190.51 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:193.105,195.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:195.16,197.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:199.2,202.27 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:202.27,203.31 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:203.31,205.12 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.3,207.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:207.33,209.18 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:209.18,211.5 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:212.4,213.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:215.3,215.19 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.2,217.15 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:217.15,218.34 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:218.34,219.14 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:219.14,222.5 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.2,226.28 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:226.28,228.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:230.2,232.30 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:232.30,233.24 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:233.24,235.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:237.3,237.96 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:240.2,240.19 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:243.104,245.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:245.16,247.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:248.2,249.27 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:249.27,251.17 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:251.17,253.12 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:255.3,255.13 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:257.2,257.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:260.108,262.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:262.16,264.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:266.2,268.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:268.33,270.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.2,272.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:272.51,274.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:275.2,278.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:278.31,280.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:282.2,284.30 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:287.111,289.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:289.16,291.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:293.2,295.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:295.33,297.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.2,299.52 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:299.52,301.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:302.2,306.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:306.31,308.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:310.2,311.46 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:311.46,313.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:315.2,315.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:318.104,320.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:320.16,322.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:324.2,326.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:326.33,328.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.2,330.52 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:330.52,332.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:333.2,337.31 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:337.31,339.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:341.2,342.39 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:342.39,344.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.2,346.12 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:346.12,348.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:350.2,350.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:353.107,355.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:355.16,357.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:359.2,363.16 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:363.16,365.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:366.2,367.42 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:367.42,369.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.2,371.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:371.33,373.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.2,375.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:375.51,377.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:378.2,380.19 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:380.19,383.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:385.2,387.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:388.12,389.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:389.39,391.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:392.3,392.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:393.12,394.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:394.39,396.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:397.3,397.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:398.12,399.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:399.39,401.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.3,402.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:402.39,404.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:405.3,405.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:406.12,407.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:407.39,408.40 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:408.40,410.5 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:411.4,411.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:413.3,413.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:414.10,415.71 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:418.2,418.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:421.109,423.16 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:423.16,425.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:427.2,431.16 3 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:431.16,433.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:434.2,435.44 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:435.44,437.3 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.2,439.33 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:439.33,441.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.2,443.51 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:443.51,445.3 1 0
github.com/echovault/echovault/pkg/modules/generic/commands.go:446.2,448.19 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:448.19,451.3 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:453.2,455.33 2 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:456.12,457.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:457.39,459.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:460.3,460.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:461.12,462.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:462.39,464.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:465.3,465.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:466.12,467.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:467.39,469.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.3,470.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:470.39,472.4 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:473.3,473.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:474.12,475.39 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:475.39,476.40 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:476.40,478.5 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:479.4,479.47 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:481.3,481.46 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:482.10,483.71 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:486.2,486.30 1 1
github.com/echovault/echovault/pkg/modules/generic/commands.go:489.33,644.2 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0
github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0
github.com/echovault/echovault/pkg/modules/generic/utils.go:31.77,32.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:32.19,34.3 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:35.2,35.33 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:36.13,38.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:40.12,41.26 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:41.26,43.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:44.3,45.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:47.12,48.26 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:48.26,50.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:51.3,52.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:54.12,55.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:55.19,57.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.3,58.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:58.29,60.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:61.3,63.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:63.17,65.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:66.3,67.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:69.12,70.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:70.19,72.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.3,73.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:73.29,75.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:76.3,78.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:78.17,80.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:81.3,82.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:84.14,85.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:85.19,87.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.3,88.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:88.29,90.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:91.3,93.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:93.17,95.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:96.3,97.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:99.14,100.19 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:100.19,102.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.3,103.29 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:103.29,105.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1
github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1
github.com/echovault/echovault/pkg/modules/list/commands.go:29.105,31.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:29.105,31.16 2 1
github.com/echovault/echovault/pkg/modules/list/commands.go:31.16,33.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:31.16,33.3 1 1
github.com/echovault/echovault/pkg/modules/list/commands.go:35.2,37.33 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:35.2,37.33 2 1
@@ -1013,6 +940,79 @@ github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1
github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1
github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1

View File

@@ -16,9 +16,9 @@ package aof
import ( import (
"fmt" "fmt"
"github.com/echovault/echovault/internal"
logstore "github.com/echovault/echovault/internal/aof/log" logstore "github.com/echovault/echovault/internal/aof/log"
"github.com/echovault/echovault/internal/aof/preamble" "github.com/echovault/echovault/internal/aof/preamble"
"github.com/echovault/echovault/pkg/utils"
"log" "log"
"sync" "sync"
) )
@@ -40,8 +40,8 @@ type Engine struct {
startRewriteFunc func() startRewriteFunc func()
finishRewriteFunc func() finishRewriteFunc func()
getStateFunc func() map[string]utils.KeyData getStateFunc func() map[string]internal.KeyData
setKeyDataFunc func(key string, data utils.KeyData) setKeyDataFunc func(key string, data internal.KeyData)
handleCommand func(command []byte) handleCommand func(command []byte)
} }
@@ -69,13 +69,13 @@ func WithFinishRewriteFunc(f func()) func(engine *Engine) {
} }
} }
func WithGetStateFunc(f func() map[string]utils.KeyData) func(engine *Engine) { func WithGetStateFunc(f func() map[string]internal.KeyData) func(engine *Engine) {
return func(engine *Engine) { return func(engine *Engine) {
engine.getStateFunc = f engine.getStateFunc = f
} }
} }
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(engine *Engine) { func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(engine *Engine) {
return func(engine *Engine) { return func(engine *Engine) {
engine.setKeyDataFunc = f engine.setKeyDataFunc = f
} }
@@ -108,8 +108,8 @@ func NewAOFEngine(options ...func(engine *Engine)) *Engine {
logCount: 0, logCount: 0,
startRewriteFunc: func() {}, startRewriteFunc: func() {},
finishRewriteFunc: func() {}, finishRewriteFunc: func() {},
getStateFunc: func() map[string]utils.KeyData { return nil }, getStateFunc: func() map[string]internal.KeyData { return nil },
setKeyDataFunc: func(key string, data utils.KeyData) {}, setKeyDataFunc: func(key string, data internal.KeyData) {},
handleCommand: func(command []byte) {}, handleCommand: func(command []byte) {},
} }

View File

@@ -17,7 +17,7 @@ package preamble
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/internal"
"io" "io"
"log" "log"
"os" "os"
@@ -37,8 +37,8 @@ type PreambleStore struct {
rw PreambleReadWriter rw PreambleReadWriter
mut sync.Mutex mut sync.Mutex
directory string directory string
getStateFunc func() map[string]utils.KeyData getStateFunc func() map[string]internal.KeyData
setKeyDataFunc func(key string, data utils.KeyData) setKeyDataFunc func(key string, data internal.KeyData)
} }
func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) { func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) {
@@ -47,13 +47,13 @@ func WithReadWriter(rw PreambleReadWriter) func(store *PreambleStore) {
} }
} }
func WithGetStateFunc(f func() map[string]utils.KeyData) func(store *PreambleStore) { func WithGetStateFunc(f func() map[string]internal.KeyData) func(store *PreambleStore) {
return func(store *PreambleStore) { return func(store *PreambleStore) {
store.getStateFunc = f store.getStateFunc = f
} }
} }
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(store *PreambleStore) { func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(store *PreambleStore) {
return func(store *PreambleStore) { return func(store *PreambleStore) {
store.setKeyDataFunc = f store.setKeyDataFunc = f
} }
@@ -70,11 +70,11 @@ func NewPreambleStore(options ...func(store *PreambleStore)) *PreambleStore {
rw: nil, rw: nil,
mut: sync.Mutex{}, mut: sync.Mutex{},
directory: "", directory: "",
getStateFunc: func() map[string]utils.KeyData { getStateFunc: func() map[string]internal.KeyData {
// No-Op by default // No-Op by default
return nil return nil
}, },
setKeyDataFunc: func(key string, data utils.KeyData) {}, setKeyDataFunc: func(key string, data internal.KeyData) {},
} }
for _, option := range options { for _, option := range options {
@@ -143,7 +143,7 @@ func (store *PreambleStore) Restore() error {
return nil return nil
} }
state := make(map[string]utils.KeyData) state := make(map[string]internal.KeyData)
if err = json.Unmarshal(b, &state); err != nil { if err = json.Unmarshal(b, &state); err != nil {
return err return err
@@ -163,7 +163,7 @@ func (store *PreambleStore) Close() error {
} }
// filterExpiredKeys filters out keys that are already expired, so they are not persisted. // filterExpiredKeys filters out keys that are already expired, so they are not persisted.
func (store *PreambleStore) filterExpiredKeys(state map[string]utils.KeyData) map[string]utils.KeyData { func (store *PreambleStore) filterExpiredKeys(state map[string]internal.KeyData) map[string]internal.KeyData {
var keysToDelete []string var keysToDelete []string
for k, v := range state { for k, v := range state {
if v.ExpireAt.Before(time.Now()) { if v.ExpireAt.Before(time.Now()) {

View File

@@ -20,7 +20,6 @@ import (
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/memberlist" "github.com/hashicorp/memberlist"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
"log" "log"
@@ -93,8 +92,8 @@ func (delegate *Delegate) NotifyMsg(msgBytes []byte) {
} }
// Current node is the cluster leader, handle the key deletion // Current node is the cluster leader, handle the key deletion
ctx := context.WithValue( ctx := context.WithValue(
context.WithValue(context.Background(), utils.ContextServerID("ServerID"), string(msg.ServerID)), context.WithValue(context.Background(), internal.ContextServerID("ServerID"), string(msg.ServerID)),
utils.ContextConnID("ConnectionID"), msg.ConnId) internal.ContextConnID("ConnectionID"), msg.ConnId)
key := string(msg.Content) key := string(msg.Content)
@@ -110,8 +109,8 @@ func (delegate *Delegate) NotifyMsg(msgBytes []byte) {
} }
// Current node is the cluster leader, handle the mutation // Current node is the cluster leader, handle the mutation
ctx := context.WithValue( ctx := context.WithValue(
context.WithValue(context.Background(), utils.ContextServerID("ServerID"), string(msg.ServerID)), context.WithValue(context.Background(), internal.ContextServerID("ServerID"), string(msg.ServerID)),
utils.ContextConnID("ConnectionID"), msg.ConnId) internal.ContextConnID("ConnectionID"), msg.ConnId)
cmd, err := internal.Decode(msg.Content) cmd, err := internal.Decode(msg.Content)
if err != nil { if err != nil {

View File

@@ -23,7 +23,6 @@ import (
"log" "log"
"time" "time"
"github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/memberlist" "github.com/hashicorp/memberlist"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
"github.com/sethvargo/go-retry" "github.com/sethvargo/go-retry"
@@ -124,7 +123,7 @@ func (m *MemberList) broadcastRaftAddress() {
// The ForwardDeleteKey function is only called by non-leaders. // The ForwardDeleteKey function is only called by non-leaders.
// It uses the broadcast queue to forward a key eviction command within the cluster. // It uses the broadcast queue to forward a key eviction command within the cluster.
func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) { func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) {
connId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string) connId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{ m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
Action: "DeleteKey", Action: "DeleteKey",
Content: []byte(key), Content: []byte(key),
@@ -141,7 +140,7 @@ func (m *MemberList) ForwardDeleteKey(ctx context.Context, key string) {
// The ForwardDataMutation function is only called by non-leaders. // The ForwardDataMutation function is only called by non-leaders.
// It uses the broadcast queue to forward a data mutation within the cluster. // It uses the broadcast queue to forward a data mutation within the cluster.
func (m *MemberList) ForwardDataMutation(ctx context.Context, cmd []byte) { func (m *MemberList) ForwardDataMutation(ctx context.Context, cmd []byte) {
connId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string) connId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
m.broadcastQueue.QueueBroadcast(&BroadcastMessage{ m.broadcastQueue.QueueBroadcast(&BroadcastMessage{
Action: "MutateData", Action: "MutateData",
Content: cmd, Content: cmd,

View File

@@ -18,7 +18,6 @@ import (
"encoding/json" "encoding/json"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
"strconv" "strconv"
"strings" "strings"
@@ -26,7 +25,7 @@ import (
type SnapshotOpts struct { type SnapshotOpts struct {
config config.Config config config.Config
data map[string]utils.KeyData data map[string]internal.KeyData
startSnapshot func() startSnapshot func()
finishSnapshot func() finishSnapshot func()
setLatestSnapshot func(msec int64) setLatestSnapshot func(msec int64)
@@ -52,7 +51,7 @@ func (s *Snapshot) Persist(sink raft.SnapshotSink) error {
return err return err
} }
snapshotObject := utils.SnapshotObject{ snapshotObject := internal.SnapshotObject{
State: internal.FilterExpiredKeys(s.options.data), State: internal.FilterExpiredKeys(s.options.data),
LatestSnapshotMilliseconds: int64(msec), LatestSnapshotMilliseconds: int64(msec),
} }

View File

@@ -30,6 +30,7 @@ import (
type FSMOpts struct { type FSMOpts struct {
Config config.Config Config config.Config
EchoVault utils.EchoVault EchoVault utils.EchoVault
GetState func() map[string]internal.KeyData
GetCommand func(command string) (utils.Command, error) GetCommand func(command string) (utils.Command, error)
DeleteKey func(ctx context.Context, key string) error DeleteKey func(ctx context.Context, key string) error
} }
@@ -50,33 +51,33 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
default: default:
// No-Op // No-Op
case raft.LogCommand: case raft.LogCommand:
var request utils.ApplyRequest var request internal.ApplyRequest
if err := json.Unmarshal(log.Data, &request); err != nil { if err := json.Unmarshal(log.Data, &request); err != nil {
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: err, Error: err,
Response: nil, Response: nil,
} }
} }
ctx := context.WithValue(context.Background(), utils.ContextServerID("ServerID"), request.ServerID) ctx := context.WithValue(context.Background(), internal.ContextServerID("ServerID"), request.ServerID)
ctx = context.WithValue(ctx, utils.ContextConnID("ConnectionID"), request.ConnectionID) ctx = context.WithValue(ctx, internal.ContextConnID("ConnectionID"), request.ConnectionID)
switch strings.ToLower(request.Type) { switch strings.ToLower(request.Type) {
default: default:
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: fmt.Errorf("unsupported raft command type %s", request.Type), Error: fmt.Errorf("unsupported raft command type %s", request.Type),
Response: nil, Response: nil,
} }
case "delete-key": case "delete-key":
if err := fsm.options.DeleteKey(ctx, request.Key); err != nil { if err := fsm.options.DeleteKey(ctx, request.Key); err != nil {
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: err, Error: err,
Response: nil, Response: nil,
} }
} }
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: nil, Error: nil,
Response: []byte("OK"), Response: []byte("OK"),
} }
@@ -85,7 +86,7 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
// Handle command // Handle command
command, err := fsm.options.GetCommand(request.CMD[0]) command, err := fsm.options.GetCommand(request.CMD[0])
if err != nil { if err != nil {
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: err, Error: err,
Response: nil, Response: nil,
} }
@@ -99,12 +100,12 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
} }
if res, err := handler(ctx, request.CMD, fsm.options.EchoVault, nil); err != nil { if res, err := handler(ctx, request.CMD, fsm.options.EchoVault, nil); err != nil {
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: err, Error: err,
Response: nil, Response: nil,
} }
} else { } else {
return utils.ApplyResponse{ return internal.ApplyResponse{
Error: nil, Error: nil,
Response: res, Response: res,
} }
@@ -119,10 +120,10 @@ func (fsm *FSM) Apply(log *raft.Log) interface{} {
func (fsm *FSM) Snapshot() (raft.FSMSnapshot, error) { func (fsm *FSM) Snapshot() (raft.FSMSnapshot, error) {
return NewFSMSnapshot(SnapshotOpts{ return NewFSMSnapshot(SnapshotOpts{
config: fsm.options.Config, config: fsm.options.Config,
data: fsm.options.EchoVault.GetState(),
startSnapshot: fsm.options.EchoVault.StartSnapshot, startSnapshot: fsm.options.EchoVault.StartSnapshot,
finishSnapshot: fsm.options.EchoVault.FinishSnapshot, finishSnapshot: fsm.options.EchoVault.FinishSnapshot,
setLatestSnapshot: fsm.options.EchoVault.SetLatestSnapshot, setLatestSnapshot: fsm.options.EchoVault.SetLatestSnapshot,
data: fsm.options.GetState(),
}), nil }), nil
} }
@@ -135,8 +136,8 @@ func (fsm *FSM) Restore(snapshot io.ReadCloser) error {
return err return err
} }
data := utils.SnapshotObject{ data := internal.SnapshotObject{
State: make(map[string]utils.KeyData), State: make(map[string]internal.KeyData),
LatestSnapshotMilliseconds: 0, LatestSnapshotMilliseconds: 0,
} }

View File

@@ -18,6 +18,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/memberlist" "github.com/echovault/echovault/internal/memberlist"
"log" "log"
@@ -34,6 +35,7 @@ import (
type Opts struct { type Opts struct {
Config config.Config Config config.Config
EchoVault utils.EchoVault EchoVault utils.EchoVault
GetState func() map[string]internal.KeyData
GetCommand func(command string) (utils.Command, error) GetCommand func(command string) (utils.Command, error)
DeleteKey func(ctx context.Context, key string) error DeleteKey func(ctx context.Context, key string) error
} }
@@ -109,6 +111,7 @@ func (r *Raft) RaftInit(ctx context.Context) {
NewFSM(FSMOpts{ NewFSM(FSMOpts{
Config: r.options.Config, Config: r.options.Config,
EchoVault: r.options.EchoVault, EchoVault: r.options.EchoVault,
GetState: r.options.GetState,
GetCommand: r.options.GetCommand, GetCommand: r.options.GetCommand,
DeleteKey: r.options.DeleteKey, DeleteKey: r.options.DeleteKey,
}), }),

View File

@@ -20,7 +20,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/pkg/utils"
"io" "io"
"io/fs" "io/fs"
"log" "log"
@@ -44,10 +43,10 @@ type Engine struct {
snapshotThreshold uint64 snapshotThreshold uint64
startSnapshotFunc func() startSnapshotFunc func()
finishSnapshotFunc func() finishSnapshotFunc func()
getStateFunc func() map[string]utils.KeyData getStateFunc func() map[string]internal.KeyData
setLatestSnapshotTimeFunc func(msec int64) setLatestSnapshotTimeFunc func(msec int64)
getLatestSnapshotTimeFunc func() int64 getLatestSnapshotTimeFunc func() int64
setKeyDataFunc func(key string, data utils.KeyData) setKeyDataFunc func(key string, data internal.KeyData)
} }
func WithDirectory(directory string) func(engine *Engine) { func WithDirectory(directory string) func(engine *Engine) {
@@ -80,7 +79,7 @@ func WithFinishSnapshotFunc(f func()) func(engine *Engine) {
} }
} }
func WithGetStateFunc(f func() map[string]utils.KeyData) func(engine *Engine) { func WithGetStateFunc(f func() map[string]internal.KeyData) func(engine *Engine) {
return func(engine *Engine) { return func(engine *Engine) {
engine.getStateFunc = f engine.getStateFunc = f
} }
@@ -98,7 +97,7 @@ func WithGetLatestSnapshotTimeFunc(f func() int64) func(engine *Engine) {
} }
} }
func WithSetKeyDataFunc(f func(key string, data utils.KeyData)) func(engine *Engine) { func WithSetKeyDataFunc(f func(key string, data internal.KeyData)) func(engine *Engine) {
return func(engine *Engine) { return func(engine *Engine) {
engine.setKeyDataFunc = f engine.setKeyDataFunc = f
} }
@@ -112,14 +111,14 @@ func NewSnapshotEngine(options ...func(engine *Engine)) *Engine {
snapshotThreshold: 1000, snapshotThreshold: 1000,
startSnapshotFunc: func() {}, startSnapshotFunc: func() {},
finishSnapshotFunc: func() {}, finishSnapshotFunc: func() {},
getStateFunc: func() map[string]utils.KeyData { getStateFunc: func() map[string]internal.KeyData {
return map[string]utils.KeyData{} return map[string]internal.KeyData{}
}, },
setLatestSnapshotTimeFunc: func(msec int64) {}, setLatestSnapshotTimeFunc: func(msec int64) {},
getLatestSnapshotTimeFunc: func() int64 { getLatestSnapshotTimeFunc: func() int64 {
return 0 return 0
}, },
setKeyDataFunc: func(key string, data utils.KeyData) {}, setKeyDataFunc: func(key string, data internal.KeyData) {},
} }
for _, option := range options { for _, option := range options {
@@ -205,7 +204,7 @@ func (engine *Engine) TakeSnapshot() error {
} }
// Get current state // Get current state
snapshotObject := utils.SnapshotObject{ snapshotObject := internal.SnapshotObject{
State: internal.FilterExpiredKeys(engine.getStateFunc()), State: internal.FilterExpiredKeys(engine.getStateFunc()),
LatestSnapshotMilliseconds: engine.getLatestSnapshotTimeFunc(), LatestSnapshotMilliseconds: engine.getLatestSnapshotTimeFunc(),
} }
@@ -334,7 +333,7 @@ func (engine *Engine) Restore() error {
return nil return nil
} }
snapshotObject := new(utils.SnapshotObject) snapshotObject := new(internal.SnapshotObject)
if err = json.Unmarshal(sd, snapshotObject); err != nil { if err = json.Unmarshal(sd, snapshotObject); err != nil {
return err return err

43
internal/types.go Normal file
View File

@@ -0,0 +1,43 @@
// Copyright 2024 Kelvin Clement Mwinuka
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import "time"
type KeyData struct {
Value interface{}
ExpireAt time.Time
}
type ContextServerID string
type ContextConnID string
type ApplyRequest struct {
Type string `json:"Type"` // command | delete-key
ServerID string `json:"ServerID"`
ConnectionID string `json:"ConnectionID"`
CMD []string `json:"CMD"`
Key string `json:"Key"`
}
type ApplyResponse struct {
Error error
Response []byte
}
type SnapshotObject struct {
State map[string]KeyData
LatestSnapshotMilliseconds int64
}

View File

@@ -202,7 +202,7 @@ func IsMaxMemoryExceeded(maxMemory uint64) bool {
} }
// FilterExpiredKeys filters out keys that are already expired, so they are not persisted. // FilterExpiredKeys filters out keys that are already expired, so they are not persisted.
func FilterExpiredKeys(state map[string]utils.KeyData) map[string]utils.KeyData { func FilterExpiredKeys(state map[string]KeyData) map[string]KeyData {
var keysToDelete []string var keysToDelete []string
for k, v := range state { for k, v := range state {
// Skip keys with no expiry time. // Skip keys with no expiry time.

View File

@@ -18,7 +18,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/internal"
"time" "time"
) )
@@ -27,9 +27,9 @@ func (server *EchoVault) isInCluster() bool {
} }
func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) error { func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) error {
serverId, _ := ctx.Value(utils.ContextServerID("ServerID")).(string) serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
deleteKeyRequest := utils.ApplyRequest{ deleteKeyRequest := internal.ApplyRequest{
Type: "delete-key", Type: "delete-key",
ServerID: serverId, ServerID: serverId,
ConnectionID: "nil", ConnectionID: "nil",
@@ -47,7 +47,7 @@ func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) err
return err return err
} }
r, ok := applyFuture.Response().(utils.ApplyResponse) r, ok := applyFuture.Response().(internal.ApplyResponse)
if !ok { if !ok {
return fmt.Errorf("unprocessable entity %v", r) return fmt.Errorf("unprocessable entity %v", r)
@@ -61,10 +61,10 @@ func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) err
} }
func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) { func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) {
serverId, _ := ctx.Value(utils.ContextServerID("ServerID")).(string) serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
connectionId, _ := ctx.Value(utils.ContextConnID("ConnectionID")).(string) connectionId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
applyRequest := utils.ApplyRequest{ applyRequest := internal.ApplyRequest{
Type: "command", Type: "command",
ServerID: serverId, ServerID: serverId,
ConnectionID: connectionId, ConnectionID: connectionId,
@@ -82,7 +82,7 @@ func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]
return nil, err return nil, err
} }
r, ok := applyFuture.Response().(utils.ApplyResponse) r, ok := applyFuture.Response().(internal.ApplyResponse)
if !ok { if !ok {
return nil, fmt.Errorf("unprocessable entity %v", r) return nil, fmt.Errorf("unprocessable entity %v", r)

View File

@@ -48,9 +48,9 @@ type EchoVault struct {
// the new number is the new connection's ID. // the new number is the new connection's ID.
connId atomic.Uint64 connId atomic.Uint64
store map[string]utils.KeyData // Data store to hold the keys and their associated data, expiry time, etc. store map[string]internal.KeyData // Data store to hold the keys and their associated data, expiry time, etc.
keyLocks map[string]*sync.RWMutex // Map to hold all the individual key locks. keyLocks map[string]*sync.RWMutex // Map to hold all the individual key locks.
keyCreationLock *sync.Mutex // The mutex for creating a new key. Only one goroutine should be able to create a key at a time. keyCreationLock *sync.Mutex // The mutex for creating a new key. Only one goroutine should be able to create a key at a time.
// Holds all the keys that are currently associated with an expiry. // Holds all the keys that are currently associated with an expiry.
keysWithExpiry struct { keysWithExpiry struct {
@@ -111,7 +111,7 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
context: context.Background(), context: context.Background(),
commands: make([]utils.Command, 0), commands: make([]utils.Command, 0),
config: config.DefaultConfig(), config: config.DefaultConfig(),
store: make(map[string]utils.KeyData), store: make(map[string]internal.KeyData),
keyLocks: make(map[string]*sync.RWMutex), keyLocks: make(map[string]*sync.RWMutex),
keyCreationLock: &sync.Mutex{}, keyCreationLock: &sync.Mutex{},
} }
@@ -120,7 +120,7 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
option(echovault) option(echovault)
} }
echovault.context = context.WithValue(echovault.context, "ServerID", utils.ContextServerID(echovault.config.ServerID)) echovault.context = context.WithValue(echovault.context, "ServerID", internal.ContextServerID(echovault.config.ServerID))
// Set up ACL module // Set up ACL module
echovault.ACL = acl.NewACL(echovault.config) echovault.ACL = acl.NewACL(echovault.config)
@@ -134,6 +134,15 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
EchoVault: echovault, EchoVault: echovault,
GetCommand: echovault.getCommand, GetCommand: echovault.getCommand,
DeleteKey: echovault.DeleteKey, DeleteKey: echovault.DeleteKey,
GetState: func() map[string]internal.KeyData {
state := make(map[string]internal.KeyData)
for k, v := range echovault.getState() {
if data, ok := v.(internal.KeyData); ok {
state[k] = data
}
}
return state
},
}) })
echovault.memberList = memberlist.NewMemberList(memberlist.Opts{ echovault.memberList = memberlist.NewMemberList(memberlist.Opts{
Config: echovault.config, Config: echovault.config,
@@ -150,12 +159,20 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
snapshot.WithDirectory(echovault.config.DataDir), snapshot.WithDirectory(echovault.config.DataDir),
snapshot.WithThreshold(echovault.config.SnapShotThreshold), snapshot.WithThreshold(echovault.config.SnapShotThreshold),
snapshot.WithInterval(echovault.config.SnapshotInterval), snapshot.WithInterval(echovault.config.SnapshotInterval),
snapshot.WithGetStateFunc(echovault.GetState),
snapshot.WithStartSnapshotFunc(echovault.StartSnapshot), snapshot.WithStartSnapshotFunc(echovault.StartSnapshot),
snapshot.WithFinishSnapshotFunc(echovault.FinishSnapshot), snapshot.WithFinishSnapshotFunc(echovault.FinishSnapshot),
snapshot.WithSetLatestSnapshotTimeFunc(echovault.SetLatestSnapshot), snapshot.WithSetLatestSnapshotTimeFunc(echovault.SetLatestSnapshot),
snapshot.WithGetLatestSnapshotTimeFunc(echovault.GetLatestSnapshot), snapshot.WithGetLatestSnapshotTimeFunc(echovault.GetLatestSnapshot),
snapshot.WithSetKeyDataFunc(func(key string, data utils.KeyData) { snapshot.WithGetStateFunc(func() map[string]internal.KeyData {
state := make(map[string]internal.KeyData)
for k, v := range echovault.getState() {
if data, ok := v.(internal.KeyData); ok {
state[k] = data
}
}
return state
}),
snapshot.WithSetKeyDataFunc(func(key string, data internal.KeyData) {
ctx := context.Background() ctx := context.Background()
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil { if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
log.Println(err) log.Println(err)
@@ -173,8 +190,16 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
aof.WithStrategy(echovault.config.AOFSyncStrategy), aof.WithStrategy(echovault.config.AOFSyncStrategy),
aof.WithStartRewriteFunc(echovault.StartRewriteAOF), aof.WithStartRewriteFunc(echovault.StartRewriteAOF),
aof.WithFinishRewriteFunc(echovault.FinishRewriteAOF), aof.WithFinishRewriteFunc(echovault.FinishRewriteAOF),
aof.WithGetStateFunc(echovault.GetState), aof.WithGetStateFunc(func() map[string]internal.KeyData {
aof.WithSetKeyDataFunc(func(key string, value utils.KeyData) { state := make(map[string]internal.KeyData)
for k, v := range echovault.getState() {
if data, ok := v.(internal.KeyData); ok {
state[k] = data
}
}
return state
}),
aof.WithSetKeyDataFunc(func(key string, value internal.KeyData) {
ctx := context.Background() ctx := context.Background()
if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil { if _, err := echovault.CreateKeyAndLock(ctx, key); err != nil {
log.Println(err) log.Println(err)
@@ -292,8 +317,8 @@ func (server *EchoVault) handleConnection(conn net.Conn) {
w, r := io.Writer(conn), io.Reader(conn) w, r := io.Writer(conn), io.Reader(conn)
cid := server.connId.Add(1) cid := server.connId.Add(1)
ctx := context.WithValue(server.context, utils.ContextConnID("ConnectionID"), ctx := context.WithValue(server.context, internal.ContextConnID("ConnectionID"),
fmt.Sprintf("%s-%d", server.context.Value(utils.ContextServerID("ServerID")), cid)) fmt.Sprintf("%s-%d", server.context.Value(internal.ContextServerID("ServerID")), cid))
for { for {
message, err := internal.ReadMessage(r) message, err := internal.ReadMessage(r)

View File

@@ -141,7 +141,7 @@ func (server *EchoVault) CreateKeyAndLock(ctx context.Context, key string) (bool
keyLock.Lock() keyLock.Lock()
server.keyLocks[key] = keyLock server.keyLocks[key] = keyLock
// Create key entry // Create key entry
server.store[key] = utils.KeyData{ server.store[key] = internal.KeyData{
Value: nil, Value: nil,
ExpireAt: time.Time{}, ExpireAt: time.Time{},
} }
@@ -170,7 +170,7 @@ func (server *EchoVault) SetValue(ctx context.Context, key string, value interfa
return errors.New("max memory reached, key value not set") return errors.New("max memory reached, key value not set")
} }
server.store[key] = utils.KeyData{ server.store[key] = internal.KeyData{
Value: value, Value: value,
ExpireAt: server.store[key].ExpireAt, ExpireAt: server.store[key].ExpireAt,
} }
@@ -203,7 +203,7 @@ func (server *EchoVault) GetExpiry(ctx context.Context, key string) time.Time {
// or the access time on lru eviction policy. // or the access time on lru eviction policy.
// The key must be locked prior to calling this function. // The key must be locked prior to calling this function.
func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) { func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) {
server.store[key] = utils.KeyData{ server.store[key] = internal.KeyData{
Value: server.store[key].Value, Value: server.store[key].Value,
ExpireAt: expireAt, ExpireAt: expireAt,
} }
@@ -228,7 +228,7 @@ func (server *EchoVault) SetExpiry(ctx context.Context, key string, expireAt tim
// The key must be locked prior ro calling this function. // The key must be locked prior ro calling this function.
func (server *EchoVault) RemoveExpiry(key string) { func (server *EchoVault) RemoveExpiry(key string) {
// Reset expiry time // Reset expiry time
server.store[key] = utils.KeyData{ server.store[key] = internal.KeyData{
Value: server.store[key].Value, Value: server.store[key].Value,
ExpireAt: time.Time{}, ExpireAt: time.Time{},
} }
@@ -245,7 +245,7 @@ func (server *EchoVault) RemoveExpiry(key string) {
// functions that require a deep copy of the state. // functions that require a deep copy of the state.
// The copy only starts when there's no current copy in progress (represented by stateCopyInProgress atomic boolean) // The copy only starts when there's no current copy in progress (represented by stateCopyInProgress atomic boolean)
// and when there's no current state mutation in progress (represented by stateMutationInProgress atomic boolean) // and when there's no current state mutation in progress (represented by stateMutationInProgress atomic boolean)
func (server *EchoVault) GetState() map[string]utils.KeyData { func (server *EchoVault) getState() map[string]interface{} {
// Wait unit there's no state mutation or copy in progress before starting a new copy process. // Wait unit there's no state mutation or copy in progress before starting a new copy process.
for { for {
if !server.stateCopyInProgress.Load() && !server.stateMutationInProgress.Load() { if !server.stateCopyInProgress.Load() && !server.stateMutationInProgress.Load() {
@@ -253,7 +253,7 @@ func (server *EchoVault) GetState() map[string]utils.KeyData {
break break
} }
} }
data := make(map[string]utils.KeyData) data := make(map[string]interface{})
for k, v := range server.store { for k, v := range server.store {
data[k] = v data[k] = v
} }

View File

@@ -29,6 +29,11 @@ import (
var mockServer *echovault.EchoVault var mockServer *echovault.EchoVault
type KeyData struct {
Value interface{}
ExpireAt time.Time
}
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(config.Config{ echovault.WithConfig(config.Config{
@@ -41,7 +46,7 @@ func init() {
func Test_HandleSET(t *testing.T) { func Test_HandleSET(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse interface{} expectedResponse interface{}
expectedValue interface{} expectedValue interface{}
expectedExpiry time.Time expectedExpiry time.Time
@@ -81,7 +86,7 @@ func Test_HandleSET(t *testing.T) {
}, },
{ // 5. Throw error when value already exists with NX flag passed { // 5. Throw error when value already exists with NX flag passed
command: []string{"SET", "SetKey5", "value5", "NX"}, command: []string{"SET", "SetKey5", "value5", "NX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"SetKey5": { "SetKey5": {
Value: "preset-value5", Value: "preset-value5",
ExpireAt: time.Time{}, ExpireAt: time.Time{},
@@ -94,7 +99,7 @@ func Test_HandleSET(t *testing.T) {
}, },
{ // 6. Set new key value when key exists with XX flag passed { // 6. Set new key value when key exists with XX flag passed
command: []string{"SET", "SetKey6", "value6", "XX"}, command: []string{"SET", "SetKey6", "value6", "XX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"SetKey6": { "SetKey6": {
Value: "preset-value6", Value: "preset-value6",
ExpireAt: time.Time{}, ExpireAt: time.Time{},
@@ -273,7 +278,7 @@ func Test_HandleSET(t *testing.T) {
}, },
{ // 26. Get the previous value when GET flag is passed { // 26. Get the previous value when GET flag is passed
command: []string{"SET", "SetKey26", "value26", "GET", "EX", "1000"}, command: []string{"SET", "SetKey26", "value26", "GET", "EX", "1000"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"SetKey26": { "SetKey26": {
Value: "previous-value", Value: "previous-value",
ExpireAt: time.Time{}, ExpireAt: time.Time{},
@@ -617,14 +622,14 @@ func Test_HandleMGET(t *testing.T) {
func Test_HandleDEL(t *testing.T) { func Test_HandleDEL(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectToExist map[string]bool expectToExist map[string]bool
expectedErr error expectedErr error
}{ }{
{ {
command: []string{"DEL", "DelKey1", "DelKey2", "DelKey3", "DelKey4", "DelKey5"}, command: []string{"DEL", "DelKey1", "DelKey2", "DelKey3", "DelKey4", "DelKey5"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"DelKey1": {Value: "value1", ExpireAt: time.Time{}}, "DelKey1": {Value: "value1", ExpireAt: time.Time{}},
"DelKey2": {Value: "value2", ExpireAt: time.Time{}}, "DelKey2": {Value: "value2", ExpireAt: time.Time{}},
"DelKey3": {Value: "value3", ExpireAt: time.Time{}}, "DelKey3": {Value: "value3", ExpireAt: time.Time{}},
@@ -701,18 +706,18 @@ func Test_HandleDEL(t *testing.T) {
func Test_HandlePERSIST(t *testing.T) { func Test_HandlePERSIST(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectedValues map[string]utils.KeyData expectedValues map[string]KeyData
expectedError error expectedError error
}{ }{
{ // 1. Successfully persist a volatile key { // 1. Successfully persist a volatile key
command: []string{"PERSIST", "PersistKey1"}, command: []string{"PERSIST", "PersistKey1"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"PersistKey1": {Value: "value1", ExpireAt: timeNow().Add(1000 * time.Second)}, "PersistKey1": {Value: "value1", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"PersistKey1": {Value: "value1", ExpireAt: time.Time{}}, "PersistKey1": {Value: "value1", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
@@ -726,11 +731,11 @@ func Test_HandlePERSIST(t *testing.T) {
}, },
{ // 3. Return 0 when trying to persist a non-volatile key { // 3. Return 0 when trying to persist a non-volatile key
command: []string{"PERSIST", "PersistKey3"}, command: []string{"PERSIST", "PersistKey3"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}}, "PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"PersistKey3": {Value: "value3", ExpireAt: time.Time{}}, "PersistKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
@@ -815,13 +820,13 @@ func Test_HandlePERSIST(t *testing.T) {
func Test_HandleEXPIRETIME(t *testing.T) { func Test_HandleEXPIRETIME(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectedError error expectedError error
}{ }{
{ // 1. Return expire time in seconds { // 1. Return expire time in seconds
command: []string{"EXPIRETIME", "ExpireTimeKey1"}, command: []string{"EXPIRETIME", "ExpireTimeKey1"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireTimeKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)}, "ExpireTimeKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
}, },
expectedResponse: int(timeNow().Add(100 * time.Second).Unix()), expectedResponse: int(timeNow().Add(100 * time.Second).Unix()),
@@ -829,7 +834,7 @@ func Test_HandleEXPIRETIME(t *testing.T) {
}, },
{ // 2. Return expire time in milliseconds { // 2. Return expire time in milliseconds
command: []string{"PEXPIRETIME", "ExpireTimeKey2"}, command: []string{"PEXPIRETIME", "ExpireTimeKey2"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireTimeKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)}, "ExpireTimeKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
}, },
expectedResponse: int(timeNow().Add(4096 * time.Millisecond).UnixMilli()), expectedResponse: int(timeNow().Add(4096 * time.Millisecond).UnixMilli()),
@@ -837,7 +842,7 @@ func Test_HandleEXPIRETIME(t *testing.T) {
}, },
{ // 3. If the key is non-volatile, return -1 { // 3. If the key is non-volatile, return -1
command: []string{"PEXPIRETIME", "ExpireTimeKey3"}, command: []string{"PEXPIRETIME", "ExpireTimeKey3"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireTimeKey3": {Value: "value3", ExpireAt: time.Time{}}, "ExpireTimeKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedResponse: -1, expectedResponse: -1,
@@ -908,13 +913,13 @@ func Test_HandleEXPIRETIME(t *testing.T) {
func Test_HandleTTL(t *testing.T) { func Test_HandleTTL(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectedError error expectedError error
}{ }{
{ // 1. Return TTL time in seconds { // 1. Return TTL time in seconds
command: []string{"TTL", "TTLKey1"}, command: []string{"TTL", "TTLKey1"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"TTLKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)}, "TTLKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
}, },
expectedResponse: 100, expectedResponse: 100,
@@ -922,7 +927,7 @@ func Test_HandleTTL(t *testing.T) {
}, },
{ // 2. Return TTL time in milliseconds { // 2. Return TTL time in milliseconds
command: []string{"PTTL", "TTLKey2"}, command: []string{"PTTL", "TTLKey2"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"TTLKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)}, "TTLKey2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)},
}, },
expectedResponse: 4096, expectedResponse: 4096,
@@ -930,7 +935,7 @@ func Test_HandleTTL(t *testing.T) {
}, },
{ // 3. If the key is non-volatile, return -1 { // 3. If the key is non-volatile, return -1
command: []string{"TTL", "TTLKey3"}, command: []string{"TTL", "TTLKey3"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"TTLKey3": {Value: "value3", ExpireAt: time.Time{}}, "TTLKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedResponse: -1, expectedResponse: -1,
@@ -1001,146 +1006,146 @@ func Test_HandleTTL(t *testing.T) {
func Test_HandleEXPIRE(t *testing.T) { func Test_HandleEXPIRE(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectedValues map[string]utils.KeyData expectedValues map[string]KeyData
expectedError error expectedError error
}{ }{
{ // 1. Set new expire by seconds { // 1. Set new expire by seconds
command: []string{"EXPIRE", "ExpireKey1", "100"}, command: []string{"EXPIRE", "ExpireKey1", "100"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey1": {Value: "value1", ExpireAt: time.Time{}}, "ExpireKey1": {Value: "value1", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)}, "ExpireKey1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 2. Set new expire by milliseconds { // 2. Set new expire by milliseconds
command: []string{"PEXPIRE", "ExpireKey2", "1000"}, command: []string{"PEXPIRE", "ExpireKey2", "1000"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey2": {Value: "value2", ExpireAt: time.Time{}}, "ExpireKey2": {Value: "value2", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey2": {Value: "value2", ExpireAt: timeNow().Add(1000 * time.Millisecond)}, "ExpireKey2": {Value: "value2", ExpireAt: timeNow().Add(1000 * time.Millisecond)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 3. Set new expire only when key does not have an expiry time with NX flag { // 3. Set new expire only when key does not have an expiry time with NX flag
command: []string{"EXPIRE", "ExpireKey3", "1000", "NX"}, command: []string{"EXPIRE", "ExpireKey3", "1000", "NX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey3": {Value: "value3", ExpireAt: time.Time{}}, "ExpireKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey3": {Value: "value3", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey3": {Value: "value3", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 4. Return 0, when NX flag is provided and key already has an expiry time { // 4. Return 0, when NX flag is provided and key already has an expiry time
command: []string{"EXPIRE", "ExpireKey4", "1000", "NX"}, command: []string{"EXPIRE", "ExpireKey4", "1000", "NX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 5. Set new expire time from now key only when the key already has an expiry time with XX flag { // 5. Set new expire time from now key only when the key already has an expiry time with XX flag
command: []string{"EXPIRE", "ExpireKey5", "1000", "XX"}, command: []string{"EXPIRE", "ExpireKey5", "1000", "XX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)}, "ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey5": {Value: "value5", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 6. Return 0 when key does not have an expiry and the XX flag is provided { // 6. Return 0 when key does not have an expiry and the XX flag is provided
command: []string{"EXPIRE", "ExpireKey6", "1000", "XX"}, command: []string{"EXPIRE", "ExpireKey6", "1000", "XX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}}, "ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey6": {Value: "value6", ExpireAt: time.Time{}}, "ExpireKey6": {Value: "value6", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 7. Set expiry time when the provided time is after the current expiry time when GT flag is provided { // 7. Set expiry time when the provided time is after the current expiry time when GT flag is provided
command: []string{"EXPIRE", "ExpireKey7", "1000", "GT"}, command: []string{"EXPIRE", "ExpireKey7", "1000", "GT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)}, "ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey7": {Value: "value7", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 8. Return 0 when GT flag is passed and current expiry time is greater than provided time { // 8. Return 0 when GT flag is passed and current expiry time is greater than provided time
command: []string{"EXPIRE", "ExpireKey8", "1000", "GT"}, command: []string{"EXPIRE", "ExpireKey8", "1000", "GT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 9. Return 0 when GT flag is passed and key does not have an expiry time { // 9. Return 0 when GT flag is passed and key does not have an expiry time
command: []string{"EXPIRE", "ExpireKey9", "1000", "GT"}, command: []string{"EXPIRE", "ExpireKey9", "1000", "GT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}}, "ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey9": {Value: "value9", ExpireAt: time.Time{}}, "ExpireKey9": {Value: "value9", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 10. Set expiry time when the provided time is before the current expiry time when LT flag is provided { // 10. Set expiry time when the provided time is before the current expiry time when LT flag is provided
command: []string{"EXPIRE", "ExpireKey10", "1000", "LT"}, command: []string{"EXPIRE", "ExpireKey10", "1000", "LT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey10": {Value: "value10", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 11. Return 0 when LT flag is passed and current expiry time is less than provided time { // 11. Return 0 when LT flag is passed and current expiry time is less than provided time
command: []string{"EXPIRE", "ExpireKey11", "5000", "LT"}, command: []string{"EXPIRE", "ExpireKey11", "5000", "LT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireKey11": {Value: "value11", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 12. Return 0 when LT flag is passed and key does not have an expiry time { // 12. Return 0 when LT flag is passed and key does not have an expiry time
command: []string{"EXPIRE", "ExpireKey12", "1000", "LT"}, command: []string{"EXPIRE", "ExpireKey12", "1000", "LT"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey12": {Value: "value12", ExpireAt: time.Time{}}, "ExpireKey12": {Value: "value12", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireKey12": {Value: "value12", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireKey12": {Value: "value12", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 13. Return error when unknown flag is passed { // 13. Return error when unknown flag is passed
command: []string{"EXPIRE", "ExpireKey13", "1000", "UNKNOWN"}, command: []string{"EXPIRE", "ExpireKey13", "1000", "UNKNOWN"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireKey13": {Value: "value13", ExpireAt: time.Time{}}, "ExpireKey13": {Value: "value13", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
@@ -1234,51 +1239,51 @@ func Test_HandleEXPIRE(t *testing.T) {
func Test_HandleEXPIREAT(t *testing.T) { func Test_HandleEXPIREAT(t *testing.T) {
tests := []struct { tests := []struct {
command []string command []string
presetValues map[string]utils.KeyData presetValues map[string]KeyData
expectedResponse int expectedResponse int
expectedValues map[string]utils.KeyData expectedValues map[string]KeyData
expectedError error expectedError error
}{ }{
{ // 1. Set new expire by unix seconds { // 1. Set new expire by unix seconds
command: []string{"EXPIREAT", "ExpireAtKey1", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix())}, command: []string{"EXPIREAT", "ExpireAtKey1", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix())},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Time{}}, "ExpireAtKey1": {Value: "value1", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey1": {Value: "value1", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey1": {Value: "value1", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 2. Set new expire by milliseconds { // 2. Set new expire by milliseconds
command: []string{"PEXPIREAT", "ExpireAtKey2", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).UnixMilli())}, command: []string{"PEXPIREAT", "ExpireAtKey2", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).UnixMilli())},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey2": {Value: "value2", ExpireAt: time.Time{}}, "ExpireAtKey2": {Value: "value2", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey2": {Value: "value2", ExpireAt: time.UnixMilli(timeNow().Add(1000 * time.Second).UnixMilli())}, "ExpireAtKey2": {Value: "value2", ExpireAt: time.UnixMilli(timeNow().Add(1000 * time.Second).UnixMilli())},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 3. Set new expire only when key does not have an expiry time with NX flag { // 3. Set new expire only when key does not have an expiry time with NX flag
command: []string{"EXPIREAT", "ExpireAtKey3", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"}, command: []string{"EXPIREAT", "ExpireAtKey3", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Time{}}, "ExpireAtKey3": {Value: "value3", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey3": {Value: "value3", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey3": {Value: "value3", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 4. Return 0, when NX flag is provided and key already has an expiry time { // 4. Return 0, when NX flag is provided and key already has an expiry time
command: []string{"EXPIREAT", "ExpireAtKey4", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"}, command: []string{"EXPIREAT", "ExpireAtKey4", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "NX"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireAtKey4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
@@ -1288,11 +1293,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey5", "EXPIREAT", "ExpireAtKey5",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)}, "ExpireAtKey5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey5": {Value: "value5", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey5": {Value: "value5", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
@@ -1302,11 +1307,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey6", "EXPIREAT", "ExpireAtKey6",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "XX",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}}, "ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}}, "ExpireAtKey6": {Value: "value6", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
@@ -1316,11 +1321,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey7", "EXPIREAT", "ExpireAtKey7",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)}, "ExpireAtKey7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey7": {Value: "value7", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey7": {Value: "value7", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
@@ -1330,11 +1335,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey8", "EXPIREAT", "ExpireAtKey8",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireAtKey8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
@@ -1344,11 +1349,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey9", "EXPIREAT", "ExpireAtKey9",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "GT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}}, "ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}}, "ExpireAtKey9": {Value: "value9", ExpireAt: time.Time{}},
}, },
expectedError: nil, expectedError: nil,
@@ -1358,11 +1363,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey10", "EXPIREAT", "ExpireAtKey10",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)}, "ExpireAtKey10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey10": {Value: "value10", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey10": {Value: "value10", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
@@ -1372,11 +1377,11 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey11", "EXPIREAT", "ExpireAtKey11",
fmt.Sprintf("%d", timeNow().Add(3000*time.Second).Unix()), "LT", fmt.Sprintf("%d", timeNow().Add(3000*time.Second).Unix()), "LT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedResponse: 0, expectedResponse: 0,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)}, "ExpireAtKey11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)},
}, },
expectedError: nil, expectedError: nil,
@@ -1386,18 +1391,18 @@ func Test_HandleEXPIREAT(t *testing.T) {
"EXPIREAT", "ExpireAtKey12", "EXPIREAT", "ExpireAtKey12",
fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT", fmt.Sprintf("%d", timeNow().Add(1000*time.Second).Unix()), "LT",
}, },
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Time{}}, "ExpireAtKey12": {Value: "value12", ExpireAt: time.Time{}},
}, },
expectedResponse: 1, expectedResponse: 1,
expectedValues: map[string]utils.KeyData{ expectedValues: map[string]KeyData{
"ExpireAtKey12": {Value: "value12", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)}, "ExpireAtKey12": {Value: "value12", ExpireAt: time.Unix(timeNow().Add(1000*time.Second).Unix(), 0)},
}, },
expectedError: nil, expectedError: nil,
}, },
{ // 13. Return error when unknown flag is passed { // 13. Return error when unknown flag is passed
command: []string{"EXPIREAT", "ExpireAtKey13", "1000", "UNKNOWN"}, command: []string{"EXPIREAT", "ExpireAtKey13", "1000", "UNKNOWN"},
presetValues: map[string]utils.KeyData{ presetValues: map[string]KeyData{
"ExpireAtKey13": {Value: "value13", ExpireAt: time.Time{}}, "ExpireAtKey13": {Value: "value13", ExpireAt: time.Time{}},
}, },
expectedResponse: 0, expectedResponse: 0,

View File

@@ -20,12 +20,6 @@ import (
"time" "time"
) )
// KeyData holds the structure of the in-memory data stored at a string key.
type KeyData struct {
Value interface{}
ExpireAt time.Time
}
type EchoVault interface { type EchoVault interface {
KeyLock(ctx context.Context, key string) (bool, error) KeyLock(ctx context.Context, key string) (bool, error)
KeyUnlock(ctx context.Context, key string) KeyUnlock(ctx context.Context, key string)
@@ -39,7 +33,6 @@ type EchoVault interface {
SetExpiry(ctx context.Context, key string, expire time.Time, touch bool) SetExpiry(ctx context.Context, key string, expire time.Time, touch bool)
RemoveExpiry(key string) RemoveExpiry(key string)
DeleteKey(ctx context.Context, key string) error DeleteKey(ctx context.Context, key string) error
GetState() map[string]KeyData
GetAllCommands() []Command GetAllCommands() []Command
GetACL() interface{} GetACL() interface{}
GetPubSub() interface{} GetPubSub() interface{}
@@ -51,22 +44,6 @@ type EchoVault interface {
RewriteAOF() error RewriteAOF() error
} }
type ContextServerID string
type ContextConnID string
type ApplyRequest struct {
Type string `json:"Type"` // command | delete-key
ServerID string `json:"ServerID"`
ConnectionID string `json:"ConnectionID"`
CMD []string `json:"CMD"`
Key string `json:"Key"`
}
type ApplyResponse struct {
Error error
Response []byte
}
type KeyExtractionFunc func(cmd []string) ([]string, error) type KeyExtractionFunc func(cmd []string) ([]string, error)
type HandlerFunc func(ctx context.Context, cmd []string, echovault EchoVault, conn *net.Conn) ([]byte, error) type HandlerFunc func(ctx context.Context, cmd []string, echovault EchoVault, conn *net.Conn) ([]byte, error)
@@ -95,8 +72,3 @@ type ACL interface {
} }
type PubSub interface{} type PubSub interface{}
type SnapshotObject struct {
State map[string]KeyData
LatestSnapshotMilliseconds int64
}