Route all remaining fill paths through the shared atomic queue
Completes the overfill-race fix (item #1). New queue.php functions, all under the same GET_LOCK + transaction and self-healing numplayers: - pqs_add_player_to_mission (staff 'new' -> registration.php) - pqs_add_player_to_missions (staff 'add to N missions' -> registration.php) - pqs_enqueue_group (kiosk group leader -> callsign.php) - pqs_claim_group_slot (kiosk group member -> callsign.php) callsign.php and registration.php now call these instead of their own non-atomic read-check-insert blocks. Verified on the local stack: scenario test (leader/member/staff paths) and 120 mixed concurrent solo+group writers x3 -> zero overfill, zero drift; HTTP smoke of leader/member/new paths all seat correctly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+14
-54
@@ -111,16 +111,17 @@ if (isset($_GET['submit'])) {
|
||||
$lastCommitTime = $rs2[1];
|
||||
|
||||
if($isMember){
|
||||
$replaceWho = $_GET['who'];
|
||||
$sql = "SELECT ID, MissionID FROM pqs_queue WHERE `CallSign` like '$replaceWho-%' LIMIT 1";
|
||||
$result = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
$line = mysqli_fetch_array($result);
|
||||
$replaceID = $line[0];
|
||||
$missionid = $line[1];
|
||||
|
||||
$sql = "UPDATE `pqs_queue` SET `CallSign`='$callsign',`Mech`='$mechname' WHERE `ID` = '$replaceID'";
|
||||
$result = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
mysqli_close($link);
|
||||
// Atomically claim an unclaimed slot reserved by the group leader.
|
||||
require_once("includes/queue.php");
|
||||
$missionid = pqs_claim_group_slot($_GET['who'], $callsign, $mechname);
|
||||
if ($missionid === null) {
|
||||
echo "<table width='1024' height='768' align='center' style='background: url(images/bsb.jpg);' border=1>";
|
||||
echo "<tr><td><br><br><table width='820' height='614' align='center' style='background: url(images/mr-block.gif);'>";
|
||||
echo "<tr><td height='500' align='center' valign='middle'><div class='queued'><br>Sorry $_GET[callsign], there are no open slots left in that group.<br><br>Please register on your own or ask the group leader to reserve more slots.<br><br></div></td></tr>";
|
||||
echo "</table></td></tr></table>";
|
||||
echo "<meta http-equiv='refresh' content='4;url=callsign.php'>";
|
||||
exit;
|
||||
}
|
||||
|
||||
$minToDeparture = $timePerGame*($missionid-$lastCommitedMissionID);
|
||||
$d=strtotime("+$minToDeparture Minutes",$lastCommitTime);
|
||||
@@ -136,50 +137,9 @@ if (isset($_GET['submit'])) {
|
||||
|
||||
if($isLeader){
|
||||
|
||||
$sql = "SELECT MissionID, numplayers FROM pqs_mission WHERE Completed = 0 AND locked = 0 AND ($hm + numplayers) <= MissionSize ORDER BY MissionID ASC";
|
||||
$getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
$rs = mysqli_fetch_array($getid);
|
||||
$missionid = $rs[0];
|
||||
$numplayers = $rs[1];
|
||||
mysqli_close($link);
|
||||
|
||||
if ($missionid == "") {
|
||||
$missionsize = $_SESSION['mechpods'];
|
||||
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
|
||||
mysqli_select_db($link, 'pqs') or die('Could not select database');
|
||||
$sql = "INSERT INTO pqs_mission (MissionDate, MissionSize, numplayers, MissionTime) VALUES ($tdate, $missionsize, $hm, $ttime)";
|
||||
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
$sql = "SELECT MissionID, numplayers FROM pqs_mission WHERE Completed = 0 AND locked = 0 AND numplayers <= MissionSize ORDER BY MissionID DESC";
|
||||
$getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
$rs1 = mysqli_fetch_array($getid);
|
||||
$missionid = $rs1[0];
|
||||
$query = "INSERT INTO pqs_queue (callsign, mech, missionid) VALUES ('$callsign','$mechname',$missionid)";
|
||||
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
|
||||
$i = 2;
|
||||
while ($i <= $hm){
|
||||
$query = "INSERT INTO pqs_queue (callsign, mech, missionid) VALUES ('$callsign-$i','$mechname',$missionid)";
|
||||
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
|
||||
$i ++;
|
||||
}
|
||||
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
mysqli_close($link);
|
||||
} else {
|
||||
$newplayers = $numplayers + $hm;
|
||||
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
|
||||
mysqli_select_db($link, 'pqs') or die('Could not select database');
|
||||
$sql = "UPDATE pqs_mission SET numplayers = $newplayers WHERE MissionID = $missionid";
|
||||
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
|
||||
$query = "INSERT INTO pqs_queue (callsign, mech, missionid) VALUES ('$callsign','$mechname',$missionid)";
|
||||
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
|
||||
$i = 2;
|
||||
while ($i <= $hm){
|
||||
$query = "INSERT INTO pqs_queue (callsign, mech, missionid) VALUES ('$callsign-$i','$mechname',$missionid)";
|
||||
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
|
||||
$i ++;
|
||||
}
|
||||
|
||||
mysqli_close($link);
|
||||
}
|
||||
// Atomically reserve $hm seats (leader + placeholders) in one mission.
|
||||
require_once("includes/queue.php");
|
||||
$missionid = pqs_enqueue_group($callsign, $mechname, $hm);
|
||||
|
||||
$minToDeparture = $timePerGame*($missionid-$lastCommitedMissionID);
|
||||
$d=strtotime("+$minToDeparture Minutes",$lastCommitTime);
|
||||
|
||||
Reference in New Issue
Block a user