Compare commits

...

2 Commits

Author SHA1 Message Date
Hemna 813bc7ea29 Added default_packet_send_count config
This allows you to configure how many times a non ACK packet
will be sent before giving up.
2024-04-19 15:59:55 -04:00
Hemna bef32059f4 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.
2024-04-19 13:02:58 -04:00
4 changed files with 28 additions and 4 deletions

View File

@ -105,6 +105,11 @@ aprsd_opts = [
"'multiline' will use multiple lines for each packet and is the traditional format." "'multiline' will use multiple lines for each packet and is the traditional format."
"both will log both compact and multiline.", "both will log both compact and multiline.",
), ),
cfg.IntOpt(
"default_packet_send_count",
default=3,
help="The number of times to send a non ack packet before giving up.",
),
cfg.IntOpt( cfg.IntOpt(
"default_ack_send_count", "default_ack_send_count",
default=3, default=3,

View File

@ -22,15 +22,22 @@ def log_multiline(packet, tx: Optional[bool] = False, header: Optional[bool] = T
"""LOG a packet to the logfile.""" """LOG a packet to the logfile."""
if CONF.log_packet_format == "compact": if CONF.log_packet_format == "compact":
return return
# asdict(packet) # asdict(packet)
logit = ["\n"] logit = ["\n"]
name = packet.__class__.__name__ name = packet.__class__.__name__
if isinstance(packet, AckPacket):
pkt_max_send_count = CONF.default_ack_send_count
else:
pkt_max_send_count = CONF.default_packet_send_count
if header: if header:
if tx: if tx:
header_str = f"<{TX_COLOR}>TX</{TX_COLOR}>" header_str = f"<{TX_COLOR}>TX</{TX_COLOR}>"
logit.append( logit.append(
f"{header_str}________(<{PACKET_COLOR}>{name}</{PACKET_COLOR}> " f"{header_str}________(<{PACKET_COLOR}>{name}</{PACKET_COLOR}> "
f"TX:{packet.send_count + 1} of {packet.retry_count})", f"TX:{packet.send_count + 1} of {pkt_max_send_count}",
) )
else: else:
header_str = f"<{RX_COLOR}>RX</{RX_COLOR}>" header_str = f"<{RX_COLOR}>RX</{RX_COLOR}>"
@ -78,6 +85,10 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No
logit = [] logit = []
name = packet.__class__.__name__ name = packet.__class__.__name__
if isinstance(packet, AckPacket):
pkt_max_send_count = CONF.default_ack_send_count
else:
pkt_max_send_count = CONF.default_packet_send_count
if header: if header:
if tx: if tx:
@ -87,7 +98,7 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No
f"<red>TX {arrow}</red> " f"<red>TX {arrow}</red> "
f"<cyan>{name}</cyan>" f"<cyan>{name}</cyan>"
f":{packet.msgNo}" f":{packet.msgNo}"
f" ({packet.send_count + 1} of {packet.retry_count})", f" ({packet.send_count + 1} of {pkt_max_send_count})",
) )
else: else:
via_color = "fg #828282" via_color = "fg #828282"

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: