Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add a new stressing test to GRAS. Yeah, it actually breaks things quite often...
[simgrid.git] / teshsuite / gras / numerous_rpc / numerous_rpc.c
diff --git a/teshsuite/gras/numerous_rpc/numerous_rpc.c b/teshsuite/gras/numerous_rpc/numerous_rpc.c
new file mode 100644 (file)
index 0000000..35d7649
--- /dev/null
@@ -0,0 +1,87 @@
+/* numerous_rpc -- ensures that no race condition occurs when there is a    */
+/*                 huge amount of very small messages                       */
+
+/* Copyright (c) 2012. The SimGrid Team. All rights reserved.               */
+/* Thanks to Soumeya Leila Hernane for reporting an issue around this       */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "gras.h"
+
+#define RPC_AMOUNT 50000 /* amount of RPC calls to do in a raw */
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(numerous_rpc,"logs attached to the RPC crash test");
+
+int give_hostname(gras_msg_cb_ctx_t ctx, void *payload);
+int server(int argc, char *argv[]);
+int client(int argc, char *argv[]);
+
+/*************************************/
+
+/* callback used for the test */
+int give_hostname(gras_msg_cb_ctx_t ctx, void *payload) {            /* rpc, return hostname */
+  const char* myself = gras_os_myname();
+
+  gras_msg_rpcreturn(-1,ctx,&myself);
+
+  gras_socket_close(gras_msg_cb_ctx_from(ctx));
+  return 0;
+}
+
+/*************************************/
+int server(int argc, char *argv[]) {
+  xbt_socket_t mysock;
+  int i;
+
+  gras_init(&argc, argv);
+  gras_msgtype_declare_rpc("give_hostname",xbt_datadesc_by_name("xbt_string_t"),xbt_datadesc_by_name("xbt_string_t"));
+  gras_cb_register("give_hostname", &give_hostname);
+
+  mysock = gras_socket_server(2222);
+
+  for (i=0;i<RPC_AMOUNT;i++)
+    gras_msg_handle(-1);
+
+  gras_socket_close(mysock);
+  gras_exit();
+  return 0;
+
+}
+
+/* ****************** Code of the client ****************************** */
+int client(int argc, char *argv[]) {
+  long int i;
+  xbt_socket_t server_sock,client_sock;
+  xbt_string_t myself = xbt_strdup(gras_os_myname());
+  xbt_string_t hostname = xbt_malloc(60);
+
+  gras_init(&argc, argv);
+  gras_msgtype_declare_rpc("give_hostname",xbt_datadesc_by_name("xbt_string_t"),xbt_datadesc_by_name("xbt_string_t"));
+
+  client_sock = gras_socket_server_range(1024, 10000, 0, 0);
+
+  for(i=0;i<RPC_AMOUNT;i++) {
+    server_sock = gras_socket_client(argv[1], 2222);
+    //if (i%1000==0)
+      XBT_INFO("iteration %ld",i);
+    gras_msg_rpccall(server_sock,-1,"give_hostname",&myself,&hostname);
+    gras_socket_close(server_sock) ;
+  }
+
+  gras_socket_close(client_sock);
+
+  xbt_free(hostname);
+  xbt_free(myself);
+  gras_exit();
+
+  return 0;
+}
+
+
+
+
+
+
+
+