Files
abap-llm/scripts_probe/killcreate.py

53 lines
2.3 KiB
Python

"""Two clients both CREATE and WRITE the same table at the same time (two controllers installing the seed of run 200273)."""
import json, os, signal, subprocess, sys, time
sys.path.insert(0, "/Users/erhankeseli/projects/abap-llm/harness/scripts_probe")
from lockprobe import *
from killtabl import DDL
VICTIM2 = r'''
import sys, json
sys.path.insert(0, "/Users/erhankeseli/projects/abap-llm/harness")
from harness.adt_client import load_env; load_env("/Users/erhankeseli/projects/abap-llm/harness/.env")
from harness.mcp_client import McpClient
a = json.loads(sys.argv[1])
m = McpClient().open()
print("SENT", flush=True)
m.call("sap_create_object", {"objectType": "TABL", "objectName": a["objectName"], "packageName": "$TMP", "description": "seed"})
print("CREATED", flush=True)
m.call("sap_push_source", a)
print("DONE", flush=True)
'''
def attempt(delay, n):
name = "ZPROBE0K3_%03d" % n
args = {"objectType": "TABL", "objectName": name, "source": DDL.format(n=name.lower(), w=20 + n)}
ps = [subprocess.Popen([sys.executable, "-c", VICTIM2, json.dumps(args)], stdout=subprocess.PIPE, text=True) for _ in range(2)]
for p in ps:
assert p.stdout.readline().strip() == "SENT"
time.sleep(delay)
states = []
for p in ps:
states.append("finished" if p.poll() is not None else "killed")
try: os.kill(p.pid, signal.SIGKILL)
except ProcessLookupError: pass
p.wait()
time.sleep(3)
out = {"name": name, "delay": delay, "victims": states}
with McpClient() as m:
out["enqueue"] = read_locks(m)
e, t = m.call("sap_push_source", {"objectType": "TABL", "objectName": name, "source": DDL.format(n=name.lower(), w=40 + n)})
out["follow_up"] = t[:300]
e, t = m.call("sap_search_object", {"query": name}); out["exists"] = name in t
out["leak"] = "[LOCK]" in out["follow_up"] or "ZPROBE0K3" in out["enqueue"]
if out["exists"]:
out["delete"] = {k.split("/")[-1]: (v["deleted"], v["msg"]) for k, v in delete_uris(["/sap/bc/adt/ddic/tables/" + name.lower()]).items()}
return out
if __name__ == "__main__":
n = int(sys.argv[2])
for d in (float(x) for x in sys.argv[1].split(",")):
o = attempt(d, n); n += 1
o["enqueue"] = o["enqueue"][:1200]
print(json.dumps(o, indent=1))
if o["leak"]:
print("LEAK at delay", d, "object", o["name"]); break