This commit is contained in:
2026-06-15 10:47:24 +00:00
parent ca125c99d2
commit 06823ee547
28 changed files with 1243 additions and 1383 deletions

View File

@@ -5,7 +5,6 @@ import (
"sync"
qb "gordenko.dev/dima/qb"
"gordenko.dev/dima/qb/atree"
"gordenko.dev/dima/qb/enc"
"gordenko.dev/dima/qb/inbox"
"gordenko.dev/dima/qb/proto"
@@ -86,15 +85,8 @@ func New(opt Options) *Worker {
return s
}
func (s *Worker) ReleaseRLock(metricID uint32) {
// s.mutex.Lock()
// //s.rLocksToRelease = append(s.rLocksToRelease, metricID)
// s.mutex.Unlock()
// select {
// case s.signalCh <- struct{}{}:
// default:
// }
type ReleaseRLock struct {
MetricID uint32
}
func (s *Worker) Run() {
@@ -114,39 +106,12 @@ func (s *Worker) Run() {
func (s *Worker) doWork() {
queue := s.inbox.Drain()
//rLocksToRelease := s.rLocksToRelease
//s.rLocksToRelease = nil
// for _, metricID := range rLocksToRelease {
// metric, ok := s.metrics[metricID]
// if !ok {
// qb.Abort(qb.NoMetricBug,
// fmt.Errorf("drainQueues: metric %d not found", metricID))
// }
// if metric.XLock {
// qb.Abort(qb.XLockBug,
// fmt.Errorf("drainQueues: xlock is set for the metric %d",
// metricID))
// }
// if metric.RLocks <= 0 {
// qb.Abort(qb.NoRLockBug,
// fmt.Errorf("drainQueues: rlock not set for the metric %d",
// metricID))
// }
// metric.RLocks--
// if len(metric.WaitQueue) > 0 {
// s.processMetricQueue(metricID, metric)
// }
// }
for _, untyped := range queue {
switch req := untyped.(type) {
case AppendMeasuresReq:
s.AppendMeasures(req)
case ReleaseRLock:
s.releaseRLock(req.MetricID)
case storage.Changes:
s.applyCommits(req) // all metrics only
case ListCurrentValuesReq:
@@ -170,29 +135,10 @@ func (s *Worker) doWork() {
}
}
// суть у тому що треба запускати запити, пока не зустріну XLock
func (s *Worker) processMetricQueue(metricID uint32, metric *Metric, tmp []byte) {
if len(metric.waitQueue) == 0 {
return
}
for _, untyped := range metric.waitQueue {
switch req := untyped.(type) {
case RangeScanReq:
metric.StartRangeScan(req)
case FullScanReq:
metric.StartFullScan(req)
case GetMetricReq:
s.GetMetric(req)
case AppendMeasuresReq:
metric.AppendMeasures(req, tmp, s.storageInbox)
case DeleteMetricReq:
s.DeleteMetric(req)
case DeleteMeasuresReq:
metric.DeleteMeasures(req)
default:
qb.Abort(qb.UnknownMetricWaitQueueItemBug,
fmt.Errorf("bug: unknown metric wait queue item type %T", req))
}
func (s *Worker) releaseRLock(metricID uint32) {
metric, ok := s.metrics[metricID]
if ok {
metric.ReleaseRLock()
}
}
@@ -318,8 +264,8 @@ func (s *Worker) AppendMeasures(req AppendMeasuresReq) {
type RangeScanResult struct {
ResultCode byte
FracDigits byte
RootPageNo uint32
LastPageNo uint32
IsDataPage bool // for UntilNotFound only
}
type RangeScanReq struct {
@@ -327,7 +273,7 @@ type RangeScanReq struct {
Since uint32
Until uint32
MetricType qb.MetricType
ResponseWriter atree.WorkerMeasureConsumer
ResponseWriter qb.WorkerMeasureConsumer
ResultCh chan RangeScanResult
}
@@ -361,7 +307,7 @@ type FullScanResult struct {
type FullScanReq struct {
MetricID uint32
MetricType qb.MetricType
ResponseWriter atree.WorkerMeasureConsumer
ResponseWriter qb.WorkerMeasureConsumer
ResultCh chan FullScanResult
}
@@ -398,7 +344,7 @@ func (s *Worker) ListCurrentValues(req ListCurrentValuesReq) {
if ok {
req.ResponseWriter.BufferValue(transform.CurrentValue{
MetricID: metricID,
Timestamp: metric.LastTimestamp(),
Timestamp: metric.timestamps.CommitedUntil(),
Value: metric.LastValue(),
})
}