[Freeciv-Dev] CMA assertion
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Hi Folks,
You may want to skip to the end of this email then come back. Saves you
wasting your time if this problem is known.
CVS 1.12.3-devel GTK CygWin/XFree86 FreeCiv
cma_core.c 1783
Machine "SD" [IP=192.168.0.1] (NT4 WKS SP6a) running one human civclient
and civserver. Machine "HH" [IP=192.168.0.16] (NT4 SVR SP6a) running one
human civclient and connected to civserver on SD. Six AI players.
This was reproducable at the time. Symptoms were that client on HH quit
unexpectedly triggered by the CMA assertion at line 1782 above.
Moreover, the client on HH could not reconnect: the moment it did so,
the same assertion triggered again.
Spurious (very infrequent) quitting of the clients has occurred before,
the CMA always gets a mention but I cannot verify if those were down to
the same assertion or not. Clients (one but never both at the same time
to date) have quit with both of us playing and when one person plays
with their own local civserver - therefore I doubt any of the network
and machine info above is relevent - I only mention it in case someone
knows better. To put it in a nutshell: CMA issues mentioned in this
paragraph "went away" when the client reconnected thus the game could be
continued. Obviously HH could not continue(*).
I just recreated the situation. Same machines, same connection, same
users (ie same .civclientrc), same server running the same "faulty" game
I saved at the time that the HH client assertion was reproducable. No
problems at all - to the extent that the two CMA controlled cities that
were being 'detached from' at the time of the failure, are still
controlled by the CMA even after a couple of turns by both clients.
(*) HH could continue. HH went to make a cup of tea and some toast ;-)
Meantime I hacked out the assertion from handle_city() in cma_core.c,
look for /*~~~*/ below. I half expected something horrible to happen as
a result of this but HH got connected and the game was completed.
<snip>
static void handle_city(struct city *pcity)
{
struct cma_parameter parameter;
struct cma_result result;
size_t len;
bool handled;
int i;
len = attr_city_get(ATTR_CITY_CMA_PARAMETER, pcity->id,
sizeof(parameter), ¶meter);
if (len == 0) {
return;
}
freelog(HANDLE_CITY_LOG_LEVEL,
"handle_city(city='%s'(%d) pos=(%d,%d) owner=%s)",
pcity->name,
pcity->id, pcity->x, pcity->y, city_owner(pcity)->name);
if (city_owner(pcity) != game.player_ptr) {
cma_release_city(pcity);
create_event(pcity->x, pcity->y, E_CITY_CMA_RELEASE,
_("CMA: You lost control of %s. Detaching from city."),
pcity->name);
return;
}
assert(len == sizeof(parameter));
freelog(HANDLE_CITY_LOG_LEVEL2, "START handle city='%s'(%d)",
pcity->name, pcity->id);
handled = FALSE;
for (i = 0; i < 5; i++) {
freelog(HANDLE_CITY_LOG_LEVEL2, " try %d", i);
cma_query_result(pcity, ¶meter, &result);
if (!result.found_a_valid) {
freelog(HANDLE_CITY_LOG_LEVEL2, " no valid found result");
cma_release_city(pcity);
create_event(pcity->x, pcity->y, E_CITY_CMA_RELEASE,
_("CMA: The agent can't fulfill the requirements "
"for %s. Passing back control."), pcity->name);
handled = TRUE;
break;
} else {
if (!apply_result_on_server(pcity, &result)) {
freelog(HANDLE_CITY_LOG_LEVEL2, " doesn't cleanly apply");
if (i == 0) {
create_event(pcity->x, pcity->y, E_NOEVENT,
_("CMA: %s has changed and the calculated "
"result can't be applied. Will retry."),
pcity->name);
}
} else {
freelog(HANDLE_CITY_LOG_LEVEL2, " ok");
/* Everything ok */
handled = TRUE;
break;
}
}
}
if (!handled) {
freelog(HANDLE_CITY_LOG_LEVEL2, " not handled");
create_event(pcity->x, pcity->y, E_CITY_CMA_RELEASE,
_("CMA: %s has changed multiple times. This may be "
"an error in freeciv or bad luck. Please contact "
"<freeciv-dev@xxxxxxxxxxx>. The CMA will detach "
"itself from the city now."), pcity->name);
cma_release_city(pcity);
/*~~~*/
#if 0
#if (IS_DEVEL_VERSION || IS_BETA_VERSION)
freelog(LOG_ERROR, _("CMA: %s has changed multiple times. This may
be "
"an error in freeciv or bad luck. Please
contact "
"<freeciv-dev@xxxxxxxxxxx>. The CMA will detach
"
"itself from the city now."), pcity->name);
assert(0);
exit(EXIT_FAILURE);
#endif
#else
#warning "FIXME: Hacked around DEVEL assertion"
#endif
/*~~~*/
}
freelog(HANDLE_CITY_LOG_LEVEL2, "END handle city='%s'(%d)",
pcity->name,
pcity->id);
}
</snip>
The difference between "irreproducable" but identical situation *now*
and reproducable but identical situation *then*? civserver looks likely.
Atm civserver's freshly loaded and "clean". Back then I left it running
even whilst I hacked the assertion out of both clients: I did *not* quit
civserver and reload the game.
The fact that HH couldn't stay connected is possibly a side-issue. I'm
not familiar with the FreeCiv sources but would it be unreasonable to
assume the assertion knobbled the client in such a way that not all CMA
controlled cities were detached? Until I recreated the situation today I
thought that this was the bug I was reporting - not too dramatic because
it wouldn't quit the client in a release version. The difference in CMA
behaviour imposed upon HH is obviously more important. Has Mr Leaky
visited the CMA code perhaps? ;-)
I didn't consider posting the saved game would be worthwhile. I'll hang
on to it for a few days just in case.
Thanks for all the effort you guys must be putting in developing this
game. Very impressive!
--
swamp-dog@xxxxxxxxxxxx
- [Freeciv-Dev] CMA assertion,
Guy Harrison <=
|
|