Переглянути джерело

Merge branch 'write-userfile-timer'

* write-userfile-timer:
  * If the userfile gets delayed by 15 seconds, just write it to be safe
  * Delay writing userfile by 3 seconds to allow for better bursts and user change floods
  * Write userfile asynchronously

Conflicts:
	doc/UPDATES
Bryan Drewery 14 роки тому
батько
коміт
3864984bd5
5 змінених файлів з 27 додано та 2 видалено
  1. 1 0
      doc/UPDATES
  2. 5 0
      src/main.c
  3. 1 1
      src/main.h
  4. 19 1
      src/userrec.c
  5. 1 0
      src/userrec.h

+ 1 - 0
doc/UPDATES

@@ -17,6 +17,7 @@
   * Add './wraith -V' which will display the packconfig that the bot is using.
   * Add cmd_newhub for adding a new hub. All bots will add this to their config.
   * Hubs can now be overridden inside the botconfig (-C)
+  * Optimize userfile writing by doing it asynchronously
 
 maint
   * Fix various compile warnings with newer GCC

+ 5 - 0
src/main.c

@@ -98,6 +98,7 @@ bool     have_linked_to_hub = 0;  /* Have we ever been linked to a hub? */
 int	default_uflags = 0;	/* Default userdefinied flags for people
 				   who say 'hello' or for .adduser */
 int     do_restart = 0;
+int     do_write_userfile = 0;
 bool	backgrd = 1;		/* Run in the background? */
 uid_t   myuid;
 pid_t   mypid;
@@ -534,6 +535,10 @@ static void core_secondly()
     cnt = 0;
   }
 
+  if (unlikely(do_write_userfile) && do_write_userfile-- == 1) {
+    real_write_userfile(-1);
+  }
+
   memcpy(&nowtm, gmtime(&now), sizeof(struct tm));
   if (nowtm.tm_min != lastmin) {
     int i = 0;

+ 1 - 1
src/main.h

@@ -15,7 +15,7 @@ enum {
 };
 
 extern int		role, default_flags, default_uflags, do_confedit,
-			updating, do_restart;
+			updating, do_restart, do_write_userfile;
 extern bool		use_stderr, backgrd, used_B, term_z, loading, have_linked_to_hub, restart_was_update, restarting, safe_to_log;
 extern char		tempdir[], *binname, owner[121], version[151], ver[101], quit_msg[], *socksfile;
 extern time_t		online_since, now, restart_time;

+ 19 - 1
src/userrec.c

@@ -474,7 +474,7 @@ void stream_writeuserfile(bd::Stream& stream, const struct userrec *bu, bool old
 /* Rewrite the entire user file. Call USERFILE hook as well, probably
  * causing the channel file to be rewritten as well.
  */
-int write_userfile(int idx)
+int real_write_userfile(int idx)
 {
   if (!userlist) {
     return 1;
@@ -515,6 +515,24 @@ int write_userfile(int idx)
   return 0;
 }
 
+int write_userfile(int idx) {
+  if (idx >= 0) {
+    return real_write_userfile(idx);
+  }
+
+  if (!do_write_userfile) {
+    do_write_userfile = 3;
+  } else if (do_write_userfile == 15) {
+    do_write_userfile = 0;
+    return real_write_userfile(idx);
+  } else {
+    ++do_write_userfile;
+  }
+
+  return 0;
+}
+
+
 int change_handle(struct userrec *u, char *newh)
 {
   if (!u)

+ 1 - 0
src/userrec.h

@@ -16,6 +16,7 @@ int deluser(char *);
 int change_handle(struct userrec *, char *);
 void correct_handle(char *);
 void stream_writeuserfile(bd::Stream&, const struct userrec *, bool = 0);
+int real_write_userfile(int);
 int write_userfile(int);
 void touch_laston(struct userrec *, char *, time_t);
 void user_del_chan(char *);