Convert numeric types to int64
This commit is contained in:
		
							parent
							
								
									e11882c556
								
							
						
					
					
						commit
						c06d5d4f94
					
				@ -37,6 +37,7 @@ func New(st *storage.Storage) *Hub {
 | 
			
		||||
func (h *Hub) Pub(queue string, msg []byte) bool {
 | 
			
		||||
	for _, s := range h.subscribers {
 | 
			
		||||
		if ok := s.Need(queue); ok {
 | 
			
		||||
			// Check if subscription is already served
 | 
			
		||||
			select {
 | 
			
		||||
			case <-s.Done():
 | 
			
		||||
				continue
 | 
			
		||||
@ -77,11 +78,11 @@ func (h *Hub) Flush(queues []string) []MessageDump {
 | 
			
		||||
	return messages
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Hub) Info() map[string]map[string]uint {
 | 
			
		||||
	info := make(map[string]map[string]uint)
 | 
			
		||||
func (h *Hub) Info() map[string]map[string]int64 {
 | 
			
		||||
	info := make(map[string]map[string]int64)
 | 
			
		||||
 | 
			
		||||
	for queue, size := range h.storage.QueueSizes() {
 | 
			
		||||
		info[queue] = map[string]uint{
 | 
			
		||||
		info[queue] = map[string]int64{
 | 
			
		||||
			"messages":      size,
 | 
			
		||||
			"subscriptions": 0,
 | 
			
		||||
		}
 | 
			
		||||
@ -89,7 +90,7 @@ func (h *Hub) Info() map[string]map[string]uint {
 | 
			
		||||
	for _, sub := range h.subscribers {
 | 
			
		||||
		for _, queue := range sub.Queues {
 | 
			
		||||
			if _, ok := info[queue]; !ok {
 | 
			
		||||
				info[queue] = map[string]uint{"messages": 0}
 | 
			
		||||
				info[queue] = map[string]int64{"messages": 0}
 | 
			
		||||
			}
 | 
			
		||||
			if _, ok := info[queue]["subscriptions"]; !ok {
 | 
			
		||||
				info[queue]["subscriptions"] = 0
 | 
			
		||||
 | 
			
		||||
@ -5,31 +5,31 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	maxIndex = ^uint(0) // Max unit value
 | 
			
		||||
	maxIndex = ^int64(0) // Max unit value
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// Counter is responsible for operating queue read and write indexes
 | 
			
		||||
	counter struct {
 | 
			
		||||
		write uint // Number of the record last written to the queue
 | 
			
		||||
		read  uint // Number of the record last read from the queue
 | 
			
		||||
		write int64 // Number of the record last written to the queue
 | 
			
		||||
		read  int64 // Number of the record last read from the queue
 | 
			
		||||
		// If write index is greater than read index then there are unread messages
 | 
			
		||||
		// If write index is less tham read index then max index was reached
 | 
			
		||||
 | 
			
		||||
		mutex     sync.Mutex
 | 
			
		||||
		stream    chan uint
 | 
			
		||||
		stream    chan int64
 | 
			
		||||
		streaming *sync.Cond
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func newCounter(wi, ri uint) *counter {
 | 
			
		||||
func newCounter(wi, ri int64) *counter {
 | 
			
		||||
	m := &sync.Mutex{}
 | 
			
		||||
	m.Lock()
 | 
			
		||||
 | 
			
		||||
	c := &counter{
 | 
			
		||||
		write:     wi,
 | 
			
		||||
		read:      ri,
 | 
			
		||||
		stream:    make(chan uint),
 | 
			
		||||
		stream:    make(chan int64),
 | 
			
		||||
		streaming: sync.NewCond(m),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -38,17 +38,20 @@ func newCounter(wi, ri uint) *counter {
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *counter) tryWrite(fn func(i uint) bool) {
 | 
			
		||||
func (c *counter) tryWrite(fn func(i int64) bool) {
 | 
			
		||||
	c.mutex.Lock()
 | 
			
		||||
	defer c.mutex.Unlock()
 | 
			
		||||
 | 
			
		||||
	if ok := fn(c.write + 1); ok {
 | 
			
		||||
		c.write++
 | 
			
		||||
		if c.write++; c.write < 0 {
 | 
			
		||||
			c.write = 0
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		c.streaming.Signal()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *counter) distance() uint {
 | 
			
		||||
func (c *counter) distance() int64 {
 | 
			
		||||
	d := c.write - c.read
 | 
			
		||||
	if d < 0 {
 | 
			
		||||
		d += maxIndex
 | 
			
		||||
@ -62,7 +65,12 @@ func (c *counter) increment() {
 | 
			
		||||
			c.streaming.Wait()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		c.stream <- c.read + 1
 | 
			
		||||
		c.read++
 | 
			
		||||
		next := c.read + 1
 | 
			
		||||
		if next < 0 {
 | 
			
		||||
			next = 0
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		c.stream <- next
 | 
			
		||||
		c.read = next
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ func (s *Storage) Get(queue string, done <-chan struct{}) (message []byte, ok bo
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var index uint
 | 
			
		||||
	var index int64
 | 
			
		||||
	select {
 | 
			
		||||
	case index = <-s.counters[queue].stream:
 | 
			
		||||
	case <-done:
 | 
			
		||||
@ -68,7 +68,7 @@ func (s *Storage) Put(queue string, message []byte) (err error) {
 | 
			
		||||
		s.counters[queue] = newCounter(0, 0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s.counters[queue].tryWrite(func(index uint) bool {
 | 
			
		||||
	s.counters[queue].tryWrite(func(index int64) bool {
 | 
			
		||||
		key := makeKey(queue, index)
 | 
			
		||||
		err = s.kyoto.Set(key, message)
 | 
			
		||||
 | 
			
		||||
@ -92,8 +92,8 @@ func (s *Storage) Flush(queue string) (messages [][]byte) {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Storage) QueueSizes() map[string]uint {
 | 
			
		||||
	info := make(map[string]uint)
 | 
			
		||||
func (s *Storage) QueueSizes() map[string]int64 {
 | 
			
		||||
	info := make(map[string]int64)
 | 
			
		||||
 | 
			
		||||
	for queue, c := range s.counters {
 | 
			
		||||
		info[queue] = c.distance()
 | 
			
		||||
@ -136,9 +136,9 @@ func (s *Storage) Close() (err error) {
 | 
			
		||||
// State
 | 
			
		||||
 | 
			
		||||
func (s *Storage) saveState() (err error) {
 | 
			
		||||
	state := make(map[string]map[string]uint)
 | 
			
		||||
	state := make(map[string]map[string]int64)
 | 
			
		||||
	for queue, ctr := range s.counters {
 | 
			
		||||
		state[queue] = map[string]uint{
 | 
			
		||||
		state[queue] = map[string]int64{
 | 
			
		||||
			"wi": ctr.write,
 | 
			
		||||
			"ri": ctr.read,
 | 
			
		||||
		}
 | 
			
		||||
@ -153,7 +153,7 @@ func (s *Storage) saveState() (err error) {
 | 
			
		||||
func (s *Storage) loadState() (err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		jsn   []byte
 | 
			
		||||
		state = make(map[string]map[string]uint)
 | 
			
		||||
		state = make(map[string]map[string]int64)
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if jsn, err = s.kyoto.Get([]byte(stateMetaKey)); err != nil {
 | 
			
		||||
@ -186,7 +186,9 @@ func (s *Storage) keepStatePersisted() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeKey(queue string, index uint) []byte {
 | 
			
		||||
	// TODO: There should be a faster way
 | 
			
		||||
	return []byte(strings.Join([]string{queue, strconv.FormatUint(uint64(index), 10)}, "_"))
 | 
			
		||||
func makeKey(queue string, index int64) []byte {
 | 
			
		||||
	return []byte(strings.Join([]string{
 | 
			
		||||
		queue,
 | 
			
		||||
		strconv.FormatInt(index, 10),
 | 
			
		||||
	}, "_"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user