fix(splitter): tighten stale job validation

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 12:11:48 +00:00
parent fe2872149e
commit 22f1420d1c
4 changed files with 25 additions and 4 deletions

View file

@ -84,7 +84,7 @@ func (s *NonceStorage) Remove(miner *proxy.Miner) {
// storage.SetJob(job)
func (s *NonceStorage) SetJob(job proxy.Job) {
s.mu.Lock()
if s.job.ClientID == job.ClientID || s.job.ClientID == "" {
if s.job.IsValid() && s.job.ClientID != "" && s.job.ClientID == job.ClientID {
s.prevJob = s.job
} else {
s.prevJob = proxy.Job{}
@ -131,7 +131,7 @@ func (s *NonceStorage) JobForID(id string) (job proxy.Job, valid bool, expired b
if id == s.job.JobID {
return s.job, true, false
}
if id == s.prevJob.JobID && id != "" {
if s.prevJob.IsValid() && s.prevJob.ClientID != "" && id == s.prevJob.JobID {
return s.prevJob, true, true
}
return proxy.Job{}, false, false

View file

@ -62,6 +62,15 @@ func TestNonceStorage_IsValidJobID_Ugly(t *testing.T) {
}
}
func TestNonceStorage_IsValidJobID_BadClientID(t *testing.T) {
storage := NewNonceStorage()
storage.SetJob(proxy.Job{Blob: "abcd", JobID: "job-1", ClientID: "pool-a"})
storage.SetJob(proxy.Job{Blob: "efgh", JobID: "job-2", ClientID: "pool-b"})
if storage.IsValidJobID("job-1") {
t.Fatal("expected previous job ID from a different client to be invalid")
}
}
func TestNonceMapper_OnDisconnect_Ugly(t *testing.T) {
mapper := NewNonceMapper(1, &proxy.Config{}, nil)
mapper.pending[1] = SubmitContext{RequestID: 7}

View file

@ -46,7 +46,7 @@ func (m *SimpleMapper) OnJob(job proxy.Job) {
}
m.mu.Lock()
if m.job.ClientID == job.ClientID || m.job.ClientID == "" {
if m.job.IsValid() && m.job.ClientID != "" && m.job.ClientID == job.ClientID {
m.prevJob = m.job
} else {
m.prevJob = proxy.Job{}
@ -75,7 +75,7 @@ func (m *SimpleMapper) JobForID(id string) (proxy.Job, bool, bool) {
if id == m.job.JobID {
return m.job, true, false
}
if id == m.prevJob.JobID {
if m.prevJob.IsValid() && m.prevJob.ClientID != "" && id == m.prevJob.JobID {
return m.prevJob, true, true
}
return proxy.Job{}, false, false

View file

@ -152,6 +152,18 @@ func TestSimpleMapper_OnResultAccepted_Good(t *testing.T) {
}
}
func TestSimpleMapper_JobForID_BadClientID(t *testing.T) {
mapper := &SimpleMapper{
pending: make(map[int64]simpleSubmitContext),
}
mapper.OnJob(proxy.Job{Blob: strings.Repeat("1", 160), JobID: "job-a", ClientID: "pool-a"})
mapper.OnJob(proxy.Job{Blob: strings.Repeat("0", 160), JobID: "job-b", ClientID: "pool-b"})
if valid, expired := mapper.JobStatus("job-a"); valid || expired {
t.Fatalf("expected stale job from a different client to be invalid, got valid=%t expired=%t", valid, expired)
}
}
func TestConfigWatcher_Start_Ugly(t *testing.T) {
path := t.TempDir() + "/config.json"
errorValue := os.WriteFile(path, []byte(`{"bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-a:3333","enabled":true}]}`), 0o644)