text-garb.c 5.92 KB
Newer Older
Linus Tolke Y's avatar
Linus Tolke Y committed
1
/*
2
 * $Id: text-garb.c,v 0.23 1998/07/08 13:42:05 ceder Exp $
Per Cederqvist's avatar
Per Cederqvist committed
3
 * Copyright (C) 1991, 1992, 1993, 1994, 1995  Lysator Academic Computer Association.
Linus Tolke Y's avatar
Linus Tolke Y committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * This file is part of the LysKOM server.
 * 
 * LysKOM is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 1, or (at your option) 
 * any later version.
 * 
 * LysKOM is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with LysKOM; see the file COPYING.  If not, write to
 * Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
 * or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
 * MA 02139, USA.
 *
 * Please mail bug reports to bug-lyskom@lysator.liu.se. 
 */
Per Cederqvist's avatar
Per Cederqvist committed
25 26 27 28 29 30
/*
 * This file contains the functions that deletes old texts.
 *
 * Author: Per Cederqvist.
 */

31 32
static const char *
rcsid = "$Id: text-garb.c,v 0.23 1998/07/08 13:42:05 ceder Exp $";
33 34
#include "rcs.h"
USE(rcsid);
Per Cederqvist's avatar
Per Cederqvist committed
35

Per Cederqvist's avatar
Per Cederqvist committed
36
#include <stdio.h>
Per Cederqvist's avatar
Per Cederqvist committed
37
#include <time.h>
Per Cederqvist's avatar
Per Cederqvist committed
38
#include <sys/types.h>
39 40 41
#ifdef HAVE_STDARG_H
#  include <stdarg.h>
#endif
Per Cederqvist's avatar
Per Cederqvist committed
42

43
#include "ldifftime.h"
44
#include "s-string.h"
Per Cederqvist's avatar
Per Cederqvist committed
45 46 47 48
#include "kom-types.h"
#include "text-garb.h"
#include "misc-types.h"
#include "debug.h"
Per Cederqvist's avatar
Per Cederqvist committed
49
#include "cache.h"
Per Cederqvist's avatar
Per Cederqvist committed
50
#include "lyskomd.h"
Per Cederqvist's avatar
Per Cederqvist committed
51 52
#include "log.h"
#include "internal-services.h"
53
#include "param.h"
Per Cederqvist's avatar
Per Cederqvist committed
54

55 56 57
/*
 * This comment is a description of how this _could_ be done in a more
 * efficient way.  It is not yet implemented.  Design by Inge Wallin
58
 * and Per Cederqvist 1992-10-07. +++FIXME.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
 *
 * Today, all text statuses are read into the core during the garbage
 * collection phase. Due to step 3 below we think that we can reduce
 * the number of text-status-fetches by 95 %.
 *
 * 1) Allocate a bitmap with one bit for each text. Clear all bits.
 *    This bit is set as soon as it is certain that this text should
 *    not be deleted during this garbage collection pass.
 * 2) Loop over all persons:
 *	+ Set the bit for all his/her marked texts.
 *    (This step may, or may not, be efficient. Profile your code!)
 * 3) Loop over all conferences:
 *	+ Loop over all texts in the conference:
 *		+ If the bit is already set, skip the text.
 *		+ Retrieve the text status from the data base.
 *		+ If it is old enough (in all the recipient conferences)
 *			delete it.
 *		  else
 *		        set the bit.
 *		+ If it is too young to be deleted (only
 *    		  considering this conferene)
 *			+ Set the bit for this text and all subsequent
 *    			  texts in this conference.
 * 4) Loop over all remaining texts:
 *	+ If the bit is not set,
 *		+ delete the text. (It has no recipients).
 * 5) Deallocate the bitmap and wait 24 hours.
 */
Per Cederqvist's avatar
Per Cederqvist committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

/*
 * Delete old texts.
 *
 * Return value is TRUE if there is nothing more to do right now,
 * FALSE if this function should be called again as soon as the
 * server has some time over.
 */

Bool
garb_text(void)
{
    static Text_no last_checked = 0;
    static time_t  last_start = NO_TIME;
    static long	   deleted_texts = 0;
    BUGDECL;

    Text_stat	  *text_s;
    Misc_info 	  *misc;
106
    u_short 	   nmisc, naux;
Per Cederqvist's avatar
Per Cederqvist committed
107 108
    double	   age;			/* How many seconds is this text? */
    double	   limit = 24 * 3600;
109 110 111 112

    if (param.garb_enable == FALSE)
	return TRUE;

Per Cederqvist's avatar
Per Cederqvist committed
113 114 115
    if ( last_checked == 0 )
    {
	if ( last_start != NO_TIME
116
	    && ldifftime(time(NULL), last_start) < param.garb_interval * 60 )
Per Cederqvist's avatar
Per Cederqvist committed
117 118 119 120 121 122 123
	{
	    return TRUE;
	}
	
	log("MSG: garb started.\n");
	time( &last_start );
    }
124 125

    tell_cache_garb_text(1);
Per Cederqvist's avatar
Per Cederqvist committed
126 127 128 129 130
    last_checked = traverse_text( last_checked );

    if ( last_checked == 0 )
    {
	log("MSG: garb ready. %lu texts deleted.\n", (u_long)deleted_texts);
131
	deleted_texts = 0;
132
	tell_cache_garb_text(0);
Per Cederqvist's avatar
Per Cederqvist committed
133 134 135 136 137 138
	return FALSE;
    }
    
    if ( (text_s = cached_get_text_stat( last_checked )) == NULL )
    {
	log("ERROR: garb_text(): Can't get text-stat.\n");
139
	tell_cache_garb_text(0);
Per Cederqvist's avatar
Per Cederqvist committed
140 141 142
	return FALSE;
    }

143
    age = ldifftime( time(NULL), text_s->creation_time );
Per Cederqvist's avatar
Per Cederqvist committed
144 145 146
    
    if ( text_s->no_of_marks > 0 || age < 24 * 3600 )
    {
147
	tell_cache_garb_text(0);
Per Cederqvist's avatar
Per Cederqvist committed
148 149 150
	return FALSE;
    }

151 152 153 154 155 156 157 158 159
    for (naux = 0; naux < text_s->aux_item_list.length; --naux)
    {
        if (text_s->aux_item_list.items[naux].flags.dont_garb)
        {
            tell_cache_garb_text(0);
            return FALSE;
        }
    }

Per Cederqvist's avatar
Per Cederqvist committed
160 161 162 163 164 165 166
    for (nmisc = text_s->no_of_misc, misc = text_s->misc_items;
	 nmisc > 0;
	 --nmisc, ++misc )
    {
	switch ( misc->type )
	{
	case recpt:
167 168 169 170 171
	    if ( cached_conf_exists( misc->datum.recipient ) )
	    {
		limit = (24 * 3600 *
			 cached_get_garb_nice( misc->datum.recipient ));
		if ( age < limit )	
172 173
		{
		    tell_cache_garb_text(0);
174
		    return FALSE;
175
		}
176 177
	    }

Per Cederqvist's avatar
Per Cederqvist committed
178 179 180
	    break;

	case cc_recpt:
181 182 183 184 185
	    if ( cached_conf_exists( misc->datum.cc_recipient ))
	    {
		limit = ( 24 * 3600
			 * cached_get_garb_nice( misc->datum.cc_recipient ));
		if ( age < limit )
186 187
		{
		    tell_cache_garb_text(0);
188
		    return FALSE;
189
		}
190
	    }
Per Cederqvist's avatar
Per Cederqvist committed
191 192 193

	    break;

194 195 196 197 198 199 200 201 202 203 204 205 206 207
	case bcc_recpt:
	    if ( cached_conf_exists( misc->datum.bcc_recipient ))
	    {
		limit = ( 24 * 3600
			 * cached_get_garb_nice( misc->datum.bcc_recipient ));
		if ( age < limit )
		{
		    tell_cache_garb_text(0);
		    return FALSE;
		}
	    }

	    break;

Per Cederqvist's avatar
Per Cederqvist committed
208 209 210 211 212 213 214 215 216 217 218 219 220
	case comm_to:
	case comm_in:
	case footn_to:
	case footn_in:
	    limit = 24 * 3600;
	    break;
	    
	case loc_no:
	case rec_time:
	case sent_by:
	    break;
	    
	case sent_at:
221
	    if ( ldifftime ( time(NULL), misc->datum.sent_at )
Per Cederqvist's avatar
Per Cederqvist committed
222 223
		< limit )
	    {
224
		tell_cache_garb_text(0);
Per Cederqvist's avatar
Per Cederqvist committed
225 226 227 228 229 230 231 232 233 234 235 236
		return FALSE;
	    }
	    		
	    break;

#ifndef COMPILE_CHECKS
	default:
	    restart_kom("garb_text(): Illegal misc-item.\n");
#endif
	}
    }

237
    VBUG(("garb_text: deleting %lu\n", last_checked));
Per Cederqvist's avatar
Per Cederqvist committed
238 239
    do_delete_text ( last_checked, text_s );
    deleted_texts++;
240
    tell_cache_garb_text(0);
Per Cederqvist's avatar
Per Cederqvist committed
241 242 243
    return FALSE;
}