From 1d88a8f0733acd9fa439b0c6b3c91df9fab8ba3b Mon Sep 17 00:00:00 2001 From: scott Date: Sat, 7 Nov 2020 17:22:16 -0800 Subject: [PATCH] Now deletes owner index when keys expire --- app.go | 2 +- setup/dev-setup.sh | 3 +++ x/crud/client/rest/query.go | 13 +++++++++++++ x/crud/client/rest/rest.go | 1 + x/crud/handler.go | 2 +- x/crud/internal/keeper/keeper.go | 24 ++++++++++++++++++++---- 6 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 setup/dev-setup.sh diff --git a/app.go b/app.go index 5e5d3231..9054440d 100644 --- a/app.go +++ b/app.go @@ -350,7 +350,7 @@ func (app *CRUDApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) ab func (app *CRUDApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { r := app.mm.EndBlock(ctx, req) - app.crudKeeper.ProcessLeasesAtBlockHeight(ctx, app.crudKeeper.GetKVStore(ctx), app.crudKeeper.GetLeaseStore(ctx), ctx.BlockHeight()) + app.crudKeeper.ProcessLeasesAtBlockHeight(ctx, app.crudKeeper.GetKVStore(ctx), app.crudKeeper.GetLeaseStore(ctx), app.crudKeeper.GetOwnerStore(ctx), ctx.BlockHeight()) return r } diff --git a/setup/dev-setup.sh b/setup/dev-setup.sh new file mode 100644 index 00000000..551761e3 --- /dev/null +++ b/setup/dev-setup.sh @@ -0,0 +1,3 @@ +rm -rf ~/.blz* + +blzd init dev --chain-id bluzelle \ No newline at end of file diff --git a/x/crud/client/rest/query.go b/x/crud/client/rest/query.go index 950b5b23..77690563 100644 --- a/x/crud/client/rest/query.go +++ b/x/crud/client/rest/query.go @@ -125,6 +125,19 @@ func BlzQCountHandler(cliCtx context.CLIContext, storeName string) http.HandlerF } } +func BlzQMyKeysHandler(cliCtx context.CLIContext, storeName string) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/mykeys/%s/%s", storeName, vars["owner"], vars["UUID"]), nil) + if err != nil { + rest.WriteErrorResponse(w, http.StatusNotFound, err.Error()) + return + } + rest.PostProcessResponse(w, cliCtx, res) + } +} + func BlzQGetLeaseHandler(cliCtx context.CLIContext, storeName string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) diff --git a/x/crud/client/rest/rest.go b/x/crud/client/rest/rest.go index 5e3c8327..2552b5f6 100644 --- a/x/crud/client/rest/rest.go +++ b/x/crud/client/rest/rest.go @@ -48,4 +48,5 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, storeName string) r.HandleFunc(fmt.Sprintf("/%s/upsert", storeName), BlzUpsertHandler(cliCtx)).Methods("POST") r.HandleFunc(fmt.Sprintf("/%s/renewlease", storeName), BlzRenewLease(cliCtx)).Methods("POST") r.HandleFunc(fmt.Sprintf("/%s/renewleaseall", storeName), BlzRenewLeaseAll(cliCtx)).Methods("POST") + r.HandleFunc(fmt.Sprintf("/%s/mykeys/{owner}/{UUID}", storeName), BlzQMyKeysHandler(cliCtx, storeName)).Methods("GET") } diff --git a/x/crud/handler.go b/x/crud/handler.go index e9a571cf..dffd0503 100644 --- a/x/crud/handler.go +++ b/x/crud/handler.go @@ -201,8 +201,8 @@ func handleMsgDelete(ctx sdk.Context, keeper keeper.IKeeper, msg types.MsgDelete } newCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - keeper.DeleteValue(ctx, keeper.GetKVStore(ctx), keeper.GetLeaseStore(newCtx), msg.UUID, msg.Key) keeper.DeleteOwner(keeper.GetKVStore(ctx), keeper.GetOwnerStore(ctx), msg.UUID, msg.Key) + keeper.DeleteValue(ctx, keeper.GetKVStore(ctx), keeper.GetLeaseStore(newCtx), msg.UUID, msg.Key) return &sdk.Result{}, nil } diff --git a/x/crud/internal/keeper/keeper.go b/x/crud/internal/keeper/keeper.go index ffcb9b34..2f8a76ab 100644 --- a/x/crud/internal/keeper/keeper.go +++ b/x/crud/internal/keeper/keeper.go @@ -17,14 +17,15 @@ package keeper import ( + "bytes" "fmt" "github.com/bluzelle/curium/x/crud/internal/types" "github.com/cosmos/cosmos-sdk/codec" + cosmosTypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank" "sort" "strconv" - cosmosTypes "github.com/cosmos/cosmos-sdk/store/types" ) type MaxKeeperSizes struct { @@ -53,7 +54,7 @@ type IKeeper interface { GetValue(ctx sdk.Context, store sdk.KVStore, UUID string, key string) types.BLZValue GetValuesIterator(ctx sdk.Context, store sdk.KVStore) sdk.Iterator IsKeyPresent(ctx sdk.Context, store sdk.KVStore, UUID string, key string) bool - ProcessLeasesAtBlockHeight(ctx sdk.Context, store sdk.KVStore, leaseStore sdk.KVStore, lease int64) + ProcessLeasesAtBlockHeight(ctx sdk.Context, store sdk.KVStore, leaseStore sdk.KVStore, ownerStore sdk.KVStore, lease int64) RenameKey(ctx sdk.Context, store sdk.KVStore, UUID string, key string, newkey string) bool SetLease(leaseStore sdk.KVStore, UUID string, key string, blockHeight int64, lease int64) SetValue(ctx sdk.Context, store sdk.KVStore, UUID string, key string, value types.BLZValue) @@ -346,12 +347,17 @@ func (k Keeper) SetOwner(store sdk.KVStore, ownerStore sdk.KVStore, UUID string, } func (k Keeper) DeleteOwner(store sdk.KVStore, ownerStore sdk.KVStore, UUID string, key string) { + metaKey := MakeMetaKey(UUID, key) var bz = store.Get([]byte(metaKey)) var value types.BLZValue k.cdc.MustUnmarshalBinaryBare(bz, &value) - ownerStore.Delete([]byte(MakeOwnerKey(value.Owner, UUID, key))) + ownerKey := MakeOwnerKey(value.Owner, UUID, key) + oldKey := ownerStore.Get([]byte(ownerKey)) + fmt.Println(oldKey) + + ownerStore.Delete([]byte(ownerKey)) } func (k Keeper) SetLease(leaseStore sdk.KVStore, UUID string, key string, blockHeight int64, leaseBlocks int64) { @@ -366,12 +372,22 @@ func (k Keeper) DeleteLease(leaseStore sdk.KVStore, UUID string, key string, blo leaseStore.Delete([]byte(MakeLeaseKey(blockHeight+leaseBlocks, UUID, key))) } -func (k Keeper) ProcessLeasesAtBlockHeight(_ sdk.Context, store sdk.KVStore, leaseStore sdk.KVStore, lease int64) { +func (k Keeper) ProcessLeasesAtBlockHeight(ctx sdk.Context, store sdk.KVStore, leaseStore sdk.KVStore, ownerStore sdk.KVStore, lease int64) { prefix := strconv.FormatInt(lease, 10) + "\x00" iterator := sdk.KVStorePrefixIterator(leaseStore, []byte(prefix)) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { + + // Delete from owner index + parts := bytes.Split(iterator.Key()[len(prefix):], []byte("\x00")) + uuid := string(parts[0]) + key := string(parts[1]) + + k.DeleteOwner(store, ownerStore, uuid, key) + + + // Delete lease fmt.Printf("\n\tdeleting %s, %s\n", prefix, string(iterator.Key())) store.Delete(iterator.Key()[len(prefix):]) leaseStore.Delete(iterator.Key())