Call packet collecter after prepare during tx.

We have to call the packet collector.tx() only after
a packet has been prepared for tx, because that's when the
new msgNo is assigned.
This commit is contained in:
Hemna 2024-04-19 12:53:12 -04:00
parent 717db6083e
commit bef32059f4
2 changed files with 10 additions and 2 deletions

View File

@ -1,4 +1,5 @@
import datetime import datetime
import logging
import threading import threading
from oslo_config import cfg from oslo_config import cfg
@ -9,6 +10,7 @@ from aprsd.utils import objectstore
CONF = cfg.CONF CONF = cfg.CONF
LOG = logging.getLogger("APRSD")
class PacketTrack(objectstore.ObjectStoreMixin): class PacketTrack(objectstore.ObjectStoreMixin):
@ -100,7 +102,7 @@ class PacketTrack(objectstore.ObjectStoreMixin):
@wrapt.synchronized(lock) @wrapt.synchronized(lock)
def get(self, key): def get(self, key):
return self.data.get(key, None) return self.data.get(key)
@wrapt.synchronized(lock) @wrapt.synchronized(lock)
def remove(self, key): def remove(self, key):

View File

@ -1,4 +1,5 @@
import logging import logging
import threading
import time import time
from oslo_config import cfg from oslo_config import cfg
@ -6,6 +7,7 @@ from rush import quota, throttle
from rush.contrib import decorator from rush.contrib import decorator
from rush.limiters import periodic from rush.limiters import periodic
from rush.stores import dictionary from rush.stores import dictionary
import wrapt
from aprsd import client from aprsd import client
from aprsd import conf # noqa from aprsd import conf # noqa
@ -37,15 +39,19 @@ ack_t = throttle.Throttle(
msg_throttle_decorator = decorator.ThrottleDecorator(throttle=msg_t) msg_throttle_decorator = decorator.ThrottleDecorator(throttle=msg_t)
ack_throttle_decorator = decorator.ThrottleDecorator(throttle=ack_t) ack_throttle_decorator = decorator.ThrottleDecorator(throttle=ack_t)
s_lock = threading.Lock()
@wrapt.synchronized(s_lock)
@msg_throttle_decorator.sleep_and_retry @msg_throttle_decorator.sleep_and_retry
def send(packet: core.Packet, direct=False, aprs_client=None): def send(packet: core.Packet, direct=False, aprs_client=None):
"""Send a packet either in a thread or directly to the client.""" """Send a packet either in a thread or directly to the client."""
# prepare the packet for sending. # prepare the packet for sending.
# This constructs the packet.raw # This constructs the packet.raw
collector.PacketCollector().tx(packet)
packet.prepare() packet.prepare()
# Have to call the collector to track the packet
# After prepare, as prepare assigns the msgNo
collector.PacketCollector().tx(packet)
if isinstance(packet, core.AckPacket): if isinstance(packet, core.AckPacket):
_send_ack(packet, direct=direct, aprs_client=aprs_client) _send_ack(packet, direct=direct, aprs_client=aprs_client)
else: else: