Bug #58247 ndb_mgm_bindaddress produces errors on stdout; errno/errmsg incorrect
Submitted: 17 Nov 2010 8:30
Reporter: Geert Vanderkelen Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Cluster: NDB API Severity:S3 (Non-critical)
Version:mysql-5.1-telco-7.0 OS:Any
Assigned to: CPU Architecture:Any
Tags: mgmapi

[17 Nov 2010 8:30] Geert Vanderkelen
Description:
When  ndb_mgm_set_bindaddress fails, errors are reported on STDOUT and the ndb_mgm_latest_error() function reports a weird errno.

The code in 'How to repeat' produces the following output:

Unable to bind local address '10.0.0.5:0' errno: 49, while trying to connect with connect string: 'nodeid=0,bind-address=10.0.0.5:0,192.168.14.30:1186'
1012: Error

How to repeat:
# Make sure you use address which is not available.

#include <stdlib.h>
#include <ndbapi/NdbApi.hpp>
#include <mgmapi/mgmapi.h>

int main()
{
  ndb_init();
  NdbMgmHandle handle = ndb_mgm_create_handle();
  ndb_mgm_set_bindaddress(handle, "10.0.0.5");
  ndb_mgm_set_timeout(handle, 500);
  ndb_mgm_connect(handle, 0, 0, 0);
  printf("%d: %s\n", ndb_mgm_get_latest_error(handle),
    ndb_mgm_get_latest_error_msg(handle));
  ndb_end(0);
}

Suggested fix:
ndb_mgm_connect() should act nicer since this is the one reporting it and definitely not report errors using STDOUT.
Also, the error 1012 seems way off.
[15 Dec 2010 12:22] Hartmut Holzgraefe
There are also other places in storage/ndb/src/mgmapi/mgmapi.cpp that directly print error messages. In ndb_mgm_connect() this is controlled by setting the 'verbose' parameter to !=0, but other functions like ndb_mgm_bindaddress, ndb_mgm_call, etc. print to handle->errstream unconditionally.

Regarding the 1012 error code: this is the MGMAPI code for NDB_MGM_BIND_ADDRESS
and the setError() call supposed to set the error string looks correct to me:     

      setError(handle, NDB_MGM_BIND_ADDRESS, __LINE__,
               "Unable to bind local address '%s:0' errno: %d, errno: %d, "
               "while trying to connect with connect string: '%s:%d'\n",
               bind_address, err, errno, hostname, port);
 
No idea why ndb_mgm_get_latest_error_msg() does not return anything useful here

For a list of MGMAPI error codes see storage/ndb/include/mgmapi/mgmapi_error.h