From 352b91a3be5cdcc72bc1d75379d9da952c1dcdbd Mon Sep 17 00:00:00 2001 From: PJ Date: Fri, 16 Jun 2023 14:42:24 +0200 Subject: [PATCH 1/3] worker: record upload spending --- worker/rhpv3.go | 28 +++++++++++++++++----------- worker/spending.go | 6 ------ worker/worker.go | 3 --- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/worker/rhpv3.go b/worker/rhpv3.go index 5733f9235..19c1874bf 100644 --- a/worker/rhpv3.go +++ b/worker/rhpv3.go @@ -549,27 +549,27 @@ func (h *host) priceTable(ctx context.Context, rev *types.FileContractRevision) return pt.HostPriceTable, nil } -func (r *host) DownloadSector(ctx context.Context, w io.Writer, root types.Hash256, offset, length uint64) (err error) { - pt, err := r.priceTable(ctx, nil) +func (h *host) DownloadSector(ctx context.Context, w io.Writer, root types.Hash256, offset, length uint64) (err error) { + pt, err := h.priceTable(ctx, nil) if err != nil { return err } // return errBalanceInsufficient if balance insufficient defer func() { if isBalanceInsufficient(err) { - err = fmt.Errorf("%w %v, err: %v", errBalanceInsufficient, r.HostKey(), err) + err = fmt.Errorf("%w %v, err: %v", errBalanceInsufficient, h.HostKey(), err) } }() - return r.acc.WithWithdrawal(ctx, func() (amount types.Currency, err error) { - err = r.transportPool.withTransportV3(ctx, r.HostKey(), r.siamuxAddr, func(t *transportV3) error { + return h.acc.WithWithdrawal(ctx, func() (amount types.Currency, err error) { + err = h.transportPool.withTransportV3(ctx, h.HostKey(), h.siamuxAddr, func(t *transportV3) error { cost, err := readSectorCost(pt) if err != nil { return err } var refund types.Currency - payment := rhpv3.PayByEphemeralAccount(r.acc.id, cost, pt.HostBlockHeight+defaultWithdrawalExpiryBlocks, r.accountKey) + payment := rhpv3.PayByEphemeralAccount(h.acc.id, cost, pt.HostBlockHeight+defaultWithdrawalExpiryBlocks, h.accountKey) cost, refund, err = RPCReadSector(ctx, t, w, pt, &payment, offset, length, root, true) amount = cost.Sub(refund) return err @@ -579,9 +579,9 @@ func (r *host) DownloadSector(ctx context.Context, w io.Writer, root types.Hash2 } // UploadSector uploads a sector to the host. -func (r *host) UploadSector(ctx context.Context, sector *[rhpv2.SectorSize]byte, rev types.FileContractRevision) (root types.Hash256, err error) { +func (h *host) UploadSector(ctx context.Context, sector *[rhpv2.SectorSize]byte, rev types.FileContractRevision) (root types.Hash256, err error) { // fetch price table - pt, err := r.priceTable(ctx, nil) + pt, err := h.priceTable(ctx, nil) if err != nil { return types.Hash256{}, err } @@ -597,15 +597,21 @@ func (r *host) UploadSector(ctx context.Context, sector *[rhpv2.SectorSize]byte, if rev.RevisionNumber == math.MaxUint64 { return types.Hash256{}, errors.New("revision number has reached max") } - payment, ok := rhpv3.PayByContract(&rev, expectedCost, r.acc.id, r.renterKey) + payment, ok := rhpv3.PayByContract(&rev, expectedCost, h.acc.id, h.renterKey) if !ok { return types.Hash256{}, errors.New("failed to create payment") } - err = r.transportPool.withTransportV3(ctx, r.HostKey(), r.siamuxAddr, func(t *transportV3) error { - root, _, err = RPCAppendSector(ctx, t, r.renterKey, pt, rev, &payment, sector) + err = h.transportPool.withTransportV3(ctx, h.HostKey(), h.siamuxAddr, func(t *transportV3) error { + root, _, err = RPCAppendSector(ctx, t, h.renterKey, pt, rev, &payment, sector) return err }) + if err != nil { + return types.Hash256{}, err + } + + // record spending + h.contractSpendingRecorder.Record(rev.ParentID, rev.RevisionNumber, api.ContractSpending{Uploads: expectedCost}) return root, err } diff --git a/worker/spending.go b/worker/spending.go index 05e1dfd93..957efedb0 100644 --- a/worker/spending.go +++ b/worker/spending.go @@ -41,12 +41,6 @@ func recordContractSpending(ctx context.Context, rev *types.FileContractRevision } } -// WithContractSpendingRecorder returns a context with the -// ContractSpendingRecorder attached. -func WithContractSpendingRecorder(ctx context.Context, sr ContractSpendingRecorder) context.Context { - return context.WithValue(ctx, keyContractSpendingRecorder, sr) -} - func (w *worker) initContractSpendingRecorder() { if w.contractSpendingRecorder != nil { panic("contractSpendingRecorder already initialized") // developer error diff --git a/worker/worker.go b/worker/worker.go index a3e560728..7ed9a67f7 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -855,9 +855,6 @@ func (w *worker) slabMigrateHandler(jc jape.Context) { // attach gouging checker to the context ctx = WithGougingChecker(ctx, w.bus, up.GougingParams) - // attach contract spending recorder to the context. - ctx = WithContractSpendingRecorder(ctx, w.contractSpendingRecorder) - // fetch all contracts dlContracts, err := w.bus.Contracts(ctx) if jc.Check("couldn't fetch contracts from bus", err) != nil { From 234c0412049d3483b5b0aff6a00a0d32091b891c Mon Sep 17 00:00:00 2001 From: PJ Date: Fri, 16 Jun 2023 14:48:27 +0200 Subject: [PATCH 2/3] worker: register cost --- worker/rhpv3.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worker/rhpv3.go b/worker/rhpv3.go index 19c1874bf..8fabcd0aa 100644 --- a/worker/rhpv3.go +++ b/worker/rhpv3.go @@ -602,8 +602,9 @@ func (h *host) UploadSector(ctx context.Context, sector *[rhpv2.SectorSize]byte, return types.Hash256{}, errors.New("failed to create payment") } + var cost types.Currency err = h.transportPool.withTransportV3(ctx, h.HostKey(), h.siamuxAddr, func(t *transportV3) error { - root, _, err = RPCAppendSector(ctx, t, h.renterKey, pt, rev, &payment, sector) + root, cost, err = RPCAppendSector(ctx, t, h.renterKey, pt, rev, &payment, sector) return err }) if err != nil { @@ -611,7 +612,7 @@ func (h *host) UploadSector(ctx context.Context, sector *[rhpv2.SectorSize]byte, } // record spending - h.contractSpendingRecorder.Record(rev.ParentID, rev.RevisionNumber, api.ContractSpending{Uploads: expectedCost}) + h.contractSpendingRecorder.Record(rev.ParentID, rev.RevisionNumber, api.ContractSpending{Uploads: cost}) return root, err } From ae50feee60a5ad7606bf4cda67ea89424ab32a3e Mon Sep 17 00:00:00 2001 From: PJ Date: Fri, 16 Jun 2023 15:47:43 +0200 Subject: [PATCH 3/3] internal: fix TestUploadDownloadSpending --- internal/testing/cluster_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/testing/cluster_test.go b/internal/testing/cluster_test.go index f522666cc..e0e22f5d3 100644 --- a/internal/testing/cluster_test.go +++ b/internal/testing/cluster_test.go @@ -524,6 +524,12 @@ func TestUploadDownloadSpending(t *testing.T) { nFunded := 0 for _, c := range cms { + if !c.Spending.Uploads.IsZero() { + t.Fatal("upload spending should be zero") + } + if !c.Spending.Downloads.IsZero() { + t.Fatal("download spending should be zero") + } if !c.Spending.FundAccount.IsZero() { nFunded++ if c.RevisionNumber == 0 { @@ -654,8 +660,8 @@ func TestUploadDownloadSpending(t *testing.T) { } for _, c := range cms { - if !c.Spending.Uploads.IsZero() { - t.Fatal("upload spending should be zero") + if c.Spending.Uploads.IsZero() { + t.Fatal("upload spending shouldn't be zero") } if !c.Spending.Downloads.IsZero() { t.Fatal("download spending should be zero")