Skip to content

Commit

Permalink
probe: Allow the caller to specify the amount to probe
Browse files Browse the repository at this point in the history
We used to only probe for a 10sat amount, which allows us to test
basic reachability, but it doesn't say much about whether we can
actually pay for something reasonable, so this fixes that.

This may require the following SQL statement to be applied to the
database if you are upgrading from a prior version:

```sql
ALTER TABLE probes ADD amount INTEGER;
```

This is not required if you start with a new database.
  • Loading branch information
cdecker committed Mar 25, 2021
1 parent a7a0007 commit 4a5f7a0
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
13 changes: 10 additions & 3 deletions probe/probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,13 @@ class Probe(Base):
payment_hash = Column(String)
started_at = Column(DateTime)
finished_at = Column(DateTime)
amount = Column(Integer)

def jsdict(self):
return {
'id': self.id,
'destination': self.destination,
'amount': self.amount,
'route': self.route,
'erring_channel': self.erring_channel,
'failcode': self.failcode,
Expand All @@ -87,19 +89,24 @@ def start_probe(plugin):


@plugin.async_method('probe')
def probe(plugin, request, node_id=None, **kwargs):
def probe(plugin, request, node_id=None, amount=10000, **kwargs):
res = None
if node_id is None:
nodes = plugin.rpc.listnodes()['nodes']
node_id = choice(nodes)['nodeid']

s = plugin.Session()
p = Probe(destination=node_id, started_at=datetime.now())
p = Probe(
destination=node_id,
started_at=datetime.now(),
amount=amount
)
s.add(p)

try:
route = plugin.rpc.getroute(
node_id,
msatoshi=10000,
msatoshi=amount,
riskfactor=1,
exclude=exclusions + list(temporary_exclusions.keys())
)['route']
Expand Down
42 changes: 42 additions & 0 deletions probe/test_probe.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import unittest
import os
from pyln.testing.fixtures import * # noqa: F401,F403

Expand All @@ -14,3 +15,44 @@ def test_probe_starts(node_factory):
# Then statically
l1.daemon.opts["plugin"] = plugin_path
l1.start()


@unittest.skipIf(not DEVELOPER, "Gossip is slow")
def test_probe(node_factory):
l1, l2, l3, l4 = node_factory.line_graph(
4,
opts=[
{'plugin': plugin_path},
{},
{},
{}
],
wait_for_announce=True
)

res = l1.rpc.probe(l4.info['id'])
assert(res['destination'] == l4.info['id'])
assert(res['failcode'] == 16399)


@unittest.skipIf(not DEVELOPER, "Gossip is slow")
def test_route_unreachable(node_factory):
l1, l2, l3, l4 = node_factory.line_graph(
4,
opts=[
{'plugin': plugin_path},
{},
{},
{}
],
wait_for_announce=True
)

l2.rpc.close(l3.info['id'])

res = l1.rpc.probe(l4.info['id'])
assert(res['destination'] == l4.info['id'])
assert(res['failcode'] == 16394)
route = res['route'].split(',')
assert(route.index(res['erring_channel']) == 1)

0 comments on commit 4a5f7a0

Please sign in to comment.