libfunctions.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include <errno.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include <string.h>
  7. #include <fcntl.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <stdarg.h>
  11. #include "libfunctions.h"
  12. #include "my_rtrm.h"
  13. void handler_Enter(int sender_id, char *handler){
  14. cur_time = time(NULL);
  15. cur_t = localtime(&cur_time);
  16. if (sender_id == -1){
  17. fprintf(log_file, "\n\n[%d:%d:%d]: I entered %s with state = %s\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,handler,id2string(state));
  18. }else{
  19. fprintf(log_file, "\n\n[%d:%d:%d]: I entered %s with sender = %d state = %s\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,handler,sender_id,id2string(state));
  20. }
  21. return;
  22. }
  23. void handler_Exit(int sender_id, char *handler){
  24. cur_time = time(NULL);
  25. cur_t = localtime(&cur_time);
  26. if (sender_id == -1){
  27. fprintf(log_file, "\n\n[%d:%d:%d]: I leave %s with state = %s\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,handler,id2string(state));
  28. }else{
  29. fprintf(log_file, "\n\n[%d:%d:%d]: I leave %s with sender = %d state = %s\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,handler,sender_id,id2string(state));
  30. }
  31. return;
  32. }
  33. /* pl4tinum 11.10.2016 */
  34. char * app_state_2_string(application_states state_id){
  35. if (state_id == 0)
  36. return "NO_APP";
  37. else if (state_id == 1)
  38. return "APP_TERMINATED";
  39. else if (state_id == 2)
  40. return "RUNNING";
  41. else
  42. return "RESIZING";
  43. }
  44. /* pl4tinum 11.10.2016 */
  45. char * id2string(core_states state_id){
  46. if (state_id == 0)
  47. return "IDLE_CORE";
  48. else if (state_id == 1)
  49. return "WORKING_NODE";
  50. else if (state_id == 2)
  51. return "TERMINATED";
  52. else if (state_id == 3)
  53. /* Controller States */
  54. return "IDLE_IDAG";
  55. else if (state_id == 4)
  56. return "IDLE_IDAG_INIT_SEND";
  57. else if (state_id == 5)
  58. return "IDLE_CHK_APP_FILE";
  59. else if (state_id == 6)
  60. return "CHK_APP_FILE";
  61. else if (state_id == 7)
  62. return "USER_INPUT";
  63. /* Initial core States */
  64. else if (state_id == 8)
  65. return "INIT_MANAGER";
  66. else if (state_id == 9)
  67. return "INIT_MANAGER_SEND_OFFERS";
  68. else if (state_id == 10)
  69. return "IDLE_INIT_MAN";
  70. else if (state_id == 11)
  71. return "INIT_MAN_CHK_OFFERS";
  72. /* Manager States */
  73. else if (state_id == 12)
  74. return "IDLE_AGENT";
  75. else if (state_id == 13)
  76. return "IDLE_AGENT_WAITING_OFF";
  77. else if (state_id == 14)
  78. return "AGENT_INIT_STATE";
  79. else if (state_id == 15)
  80. return "AGENT_SELF_OPT";
  81. else if (state_id == 16)
  82. return "AGENT_SELF_CHK_OFFERS";
  83. else if (state_id == 17)
  84. return "AGENT_ENDING";
  85. else if (state_id == 18)
  86. return "IDAG_ENDING";
  87. else if (state_id == 19)
  88. return "NO_PENDING_STATE";
  89. else if (state_id == 20)
  90. return "AGENT_ZOMBIE";
  91. /* Multiple Pending States */
  92. else if (state_id == 21)
  93. return "AGENT_INIT_APP_INIT";
  94. else if (state_id == 22)
  95. return "AGENT_INIT_CHK_OFFERS";
  96. else if (state_id == 23)
  97. return "AGENT_INIT_IDLE_INIT";
  98. else if (state_id == 24)
  99. return "IDLE_INIT_IDLE_AGENT";
  100. else if (state_id == 25)
  101. return "IDLE_INIT_AGENT_SELFOPT";
  102. else if (state_id == 26)
  103. return "INIT_CHK_OFFERS_IDLE_AGENT";
  104. else if (state_id == 27)
  105. return "INIT_CHK_OFFERS_SELFOPT";
  106. else if (state_id == 28)
  107. return "PAXOS_ACTIVE";
  108. else if (state_id == 29)
  109. return "NEW_IDAG";
  110. else if (state_id == 30)
  111. return "NEW_AGENT";
  112. else
  113. return "error";
  114. }
  115. /* pl4tinum 11.10.2016 */
  116. char * inter2string(inter_types interaction){
  117. if (interaction == 0)
  118. return "INIT_CORE";
  119. else if (interaction == 1)
  120. return "REMOVE_APP";
  121. else if (interaction == 2)
  122. return "INIT_APP";
  123. else if (interaction == 3)
  124. return "DECLARE_INIT_AVAILABILITY";
  125. else if (interaction == 4)
  126. return "DEBUG_IDAG_REQ_DDS";
  127. else if (interaction == 5)
  128. return "IDAG_FIND_IDAGS_PENDING";
  129. else if (interaction == 6)
  130. return "IDAG_FIND_IDAGS";
  131. else if (interaction == 7)
  132. return "IDAG_REQ_DDS_PENDING";
  133. else if (interaction == 8)
  134. return "IDAG_REQ_DDS";
  135. else if (interaction == 9)
  136. return "REP_IDAG_FIND_IDAGS";
  137. else if (interaction == 10)
  138. return "REP_IDAG_REQ_DDS";
  139. else if (interaction == 11)
  140. return "AGENT_REQ_CORES";
  141. else if (interaction == 12)
  142. return "AGENT_REQ_CORES_PENDING";
  143. else if (interaction == 13)
  144. return "REP_AGENT_REQ_CORES";
  145. else if (interaction == 14)
  146. return "AGENT_OFFER_SENT";
  147. else if (interaction == 15)
  148. return "REP_AGENT_OFFER_SENT";
  149. else if (interaction == 16)
  150. return "REP_AGENT_OFFER_PENDING";
  151. else if (interaction == 17)
  152. return "SELFOPT_IDAG_FIND_IDAGS_PENDING";
  153. else if (interaction == 18)
  154. return "SELFOPT_IDAG_FIND_IDAGS";
  155. else if (interaction == 19)
  156. return "SELFOPT_IDAG_REQ_DDS_PENDING";
  157. else if (interaction == 20)
  158. return "SELFOPT_IDAG_REQ_DDS";
  159. else if (interaction == 21)
  160. return "SELFOPT_REQ_CORES_PENDING";
  161. else if (interaction == 22)
  162. return "SELFOPT_REQ_CORES";
  163. else if (interaction == 23)
  164. return "IDAG_ADD_CORES_DDS";
  165. else if (interaction == 24)
  166. return "IDAG_REM_CORES_DDS";
  167. else if (interaction == 25)
  168. return "INIT_AGENT";
  169. else if (interaction == 26)
  170. return "INIT_WORK_NODE_PENDING";
  171. else if (interaction == 27)
  172. return "APPOINT_WORK_NODE_PENDING";
  173. else if (interaction == 28)
  174. return "INIT_WORK_NODE";
  175. else if (interaction == 29)
  176. return "APPOINT_WORK_NODE";
  177. else if (interaction == 30)
  178. return "TERMINATION_STATS";
  179. else if (interaction == 31)
  180. return "REP_STATISTICS";
  181. /* PAXOS Interactions */
  182. else if (interaction == 32)
  183. return "PAXOS_INIT";
  184. else if (interaction == 33)
  185. return "PREPARE_REQUEST";
  186. else if (interaction == 34)
  187. return "PREPARE_ACCEPT_NO_PREVIOUS";
  188. else if (interaction == 35)
  189. return "PREPARE_ACCEPT";
  190. else if (interaction == 36)
  191. return "ACCEPT_REQUEST";
  192. else if (interaction == 37)
  193. return "ACCEPTED";
  194. else if (interaction == 38)
  195. return "LEARN";
  196. else if (interaction == 39)
  197. return "LEARN_ACK";
  198. else if (interaction == 40)
  199. return "LEARN_ACK_CONTR";
  200. else if (interaction == 41)
  201. return "REINIT_APP";
  202. else if (interaction == 42)
  203. return "CONTR_TO";
  204. else if (interaction == 43)
  205. return "REMOVE_FROM_DDS";
  206. else if (interaction == 44)
  207. return "ADD_TO_DDS";
  208. else if (interaction == 45)
  209. return "HEARTBEAT_REQ";
  210. else if (interaction == 46)
  211. return "HEARTBEAT_REP";
  212. else if (interaction == 47)
  213. return "PAXOS_STATS_REQ";
  214. else if (interaction == 48)
  215. return "PAXOS_STATS_REP";
  216. return "error";
  217. }
  218. char * sig2string(int sig_id){
  219. if (sig_id == 0)
  220. return "NO_SIG";
  221. else if (sig_id == SIG_BASE_NUM)
  222. return "SIG_ACK";
  223. else if (sig_id == SIG_BASE_NUM + 1)
  224. return "SIG_INIT";
  225. else if (sig_id == SIG_BASE_NUM + 2)
  226. return "SIG_TERMINATE";
  227. else if (sig_id == SIG_BASE_NUM + 3)
  228. return "SIG_INIT_APP";
  229. else if (sig_id == SIG_BASE_NUM + 4)
  230. return "SIG_IDAG_FIND_IDAGS";
  231. else if (sig_id == SIG_BASE_NUM + 5)
  232. return "SIG_REQ_DDS";
  233. else if (sig_id == SIG_BASE_NUM + 6)
  234. return "SIG_REQ_CORES";
  235. else if (sig_id == SIG_BASE_NUM + 7)
  236. return "SIG_REP_OFFERS";
  237. else if (sig_id == SIG_BASE_NUM + 8)
  238. return "SIG_INIT_AGENT";
  239. else if (sig_id == SIG_BASE_NUM + 9)
  240. return "SIG_ADD_CORES_DDS";
  241. else if (sig_id == SIG_BASE_NUM + 10)
  242. return "SIG_REM_CORES_DDS";
  243. else if (sig_id == SIG_BASE_NUM + 11)
  244. return "SIG_APPOINT_WORK";
  245. else if (sig_id == SIG_BASE_NUM + 12)
  246. return "SIG_FINISH";
  247. else if (sig_id == SIG_BASE_NUM + 13)
  248. return "SIG_REJECT";
  249. else if (sig_id == SIG_BASE_NUM + 14)
  250. return "SIG_APP_TERMINATED";
  251. /* PAXOS SIGNALS */
  252. else if (sig_id == SIG_BASE_NUM + 15)
  253. return "SIG_PREPARE_REQUEST";
  254. else if (sig_id == SIG_BASE_NUM + 16)
  255. return "SIG_PREPARE_ACCEPT_NO_PREVIOUS";
  256. else if (sig_id == SIG_BASE_NUM + 17)
  257. return "SIG_PREPARE_ACCEPT";
  258. else if (sig_id == SIG_BASE_NUM + 18)
  259. return "SIG_ACCEPT_REQUEST";
  260. else if (sig_id == SIG_BASE_NUM + 19)
  261. return "SIG_ACCEPTED";
  262. else if (sig_id == SIG_BASE_NUM + 20)
  263. return "SIG_LEARN";
  264. else if (sig_id == SIG_BASE_NUM + 21)
  265. return "SIG_LEARN_ACK";
  266. else if (sig_id == SIG_BASE_NUM + 22)
  267. return "SIG_LEARN_ACK_CONTR";
  268. else if (sig_id == SIG_BASE_NUM + 23)
  269. return "SIG_REINIT_APP";
  270. else if (sig_id == SIG_BASE_NUM + 24)
  271. return "SIG_CONTR_TO";
  272. else if (sig_id == SIG_BASE_NUM + 25)
  273. return "SIG_REMOVE_FROM_DDS";
  274. else if (sig_id == SIG_BASE_NUM + 26)
  275. return "SIG_ADD_TO_DDS";
  276. else if (sig_id == SIG_BASE_NUM + 27)
  277. return "SIG_HEARTBEAT_REQ";
  278. else if (sig_id == SIG_BASE_NUM + 28)
  279. return "SIG_HEARTBEAT_REP";
  280. else if (sig_id == SIG_BASE_NUM + 29)
  281. return "SIG_FAIL";
  282. else if (sig_id == SIG_BASE_NUM + 30)
  283. return "SIG_PAXOS_STATS_REQ";
  284. else if (sig_id == SIG_BASE_NUM + 31)
  285. return "SIG_PAXOS_STATS_REP";
  286. else
  287. return "Unknown Sig";
  288. }
  289. char * itoa(int value){
  290. char *tmp;
  291. int size=1, i, threshold=10;
  292. while (value >= threshold) {
  293. size++;
  294. threshold *= 10;
  295. }
  296. /*
  297. if (value<10)
  298. size = 1;
  299. else if (value<100)
  300. size = 2;
  301. else if (value<1000)
  302. size = 3;
  303. else
  304. size = 4;
  305. */
  306. tmp = (char *) malloc((size+1)*sizeof(char));
  307. for (i=size-1; i>=0; i--){
  308. tmp[i] = (char) 48 + (value % 10);
  309. value = value / 10;
  310. }
  311. tmp[size] = '\0';
  312. return tmp;
  313. }
  314. FILE * create_log_file(int node_id, int log, char scen_directory[SCEN_DIR_SIZE], char scen_num[SCEN_NUM_SIZE]){
  315. char log_file_name[MAX_STR_NAME_SIZE], *name;
  316. FILE *log_file;
  317. #ifdef PLAT_SCC
  318. strcpy(log_file_name, "/shared/herc/");
  319. #else
  320. strcpy(log_file_name, "../");
  321. #endif
  322. strcat(log_file_name, scen_directory);
  323. strcat(log_file_name, "/");
  324. strcat(log_file_name, scen_num);
  325. if (log == 0)
  326. strcat(log_file_name,"/log_files/log_file_");
  327. else{
  328. strcat(log_file_name,"/paxos_log_files/log_file_");
  329. }
  330. name = itoa(node_id);
  331. strcat(log_file_name,name);
  332. free(name);
  333. //if ((fd = open(log_file_name, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) < 0) {
  334. if ((log_file = fopen(log_file_name, "w")) == NULL){
  335. printf("Open log error my id is %d path: %s \n ",node_id, log_file_name);
  336. fflush(stdout);
  337. perror("open log");
  338. }
  339. //free(log_file_name);
  340. return log_file;
  341. }
  342. int majority(int cores){
  343. return cores/2 + 1;
  344. }