Fs_log: new truncate behavior
Files are truncated at the next client session if all previous sessions associated with the file are closed. Issue #1538
This commit is contained in:
parent
77c00bc26d
commit
88f107e0f9
|
@ -36,6 +36,7 @@ class Fs_log::Log_file : public List<Log_file>::Element
|
||||||
File_system::Session &_fs;
|
File_system::Session &_fs;
|
||||||
File_handle _handle;
|
File_handle _handle;
|
||||||
seek_off_t _offset;
|
seek_off_t _offset;
|
||||||
|
int _clients;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -46,12 +47,14 @@ class Fs_log::Log_file : public List<Log_file>::Element
|
||||||
char const *dir_path, char const *file_name,
|
char const *dir_path, char const *file_name,
|
||||||
seek_off_t offset)
|
seek_off_t offset)
|
||||||
:
|
:
|
||||||
_fs(fs), _handle(handle), _offset(offset)
|
_fs(fs), _handle(handle), _offset(offset), _clients(0)
|
||||||
{
|
{
|
||||||
strncpy(_dir_path, dir_path, sizeof(_dir_path));
|
strncpy(_dir_path, dir_path, sizeof(_dir_path));
|
||||||
strncpy(_file_name, file_name, sizeof(_file_name));
|
strncpy(_file_name, file_name, sizeof(_file_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~Log_file() { _fs.close(_handle); }
|
||||||
|
|
||||||
bool match(char const *dir, char const *filename) const
|
bool match(char const *dir, char const *filename) const
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
|
@ -59,6 +62,10 @@ class Fs_log::Log_file : public List<Log_file>::Element
|
||||||
(strcmp(_file_name, filename, MAX_NAME_LEN) == 0);
|
(strcmp(_file_name, filename, MAX_NAME_LEN) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void incr() { ++_clients; }
|
||||||
|
void decr() { --_clients; }
|
||||||
|
int client_count() const { return _clients; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a log message to the packet buffer.
|
* Write a log message to the packet buffer.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -212,6 +212,16 @@ class Fs_log::Root_component :
|
||||||
return new (md_alloc()) Unlabeled_session_component(*file);
|
return new (md_alloc()) Unlabeled_session_component(*file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _destroy_session(Session_component *session)
|
||||||
|
{
|
||||||
|
Log_file *file = session->file();
|
||||||
|
destroy(md_alloc(), session);
|
||||||
|
if (file->client_count() < 1) {
|
||||||
|
_log_files.remove(file);
|
||||||
|
destroy(env()->heap(), file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,15 +33,24 @@ namespace Fs_log {
|
||||||
|
|
||||||
class Fs_log::Session_component : public Rpc_object<Log_session, Unlabeled_session_component>
|
class Fs_log::Session_component : public Rpc_object<Log_session, Unlabeled_session_component>
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Log_file &_log_file;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Session_component(Log_file &log_file)
|
||||||
|
: _log_file(log_file) { _log_file.incr(); }
|
||||||
|
|
||||||
|
~Session_component() { _log_file.decr(); }
|
||||||
|
|
||||||
|
Log_file *file() const { return &_log_file; }
|
||||||
|
|
||||||
virtual size_t write(String const &string) = 0;
|
virtual size_t write(String const &string) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Fs_log::Unlabeled_session_component : public Session_component
|
class Fs_log::Unlabeled_session_component : public Session_component
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
|
|
||||||
Log_file &_log_file;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -49,7 +58,7 @@ class Fs_log::Unlabeled_session_component : public Session_component
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Unlabeled_session_component(Log_file &log_file)
|
Unlabeled_session_component(Log_file &log_file)
|
||||||
: _log_file(log_file) { }
|
: Session_component(log_file) { }
|
||||||
|
|
||||||
/*****************
|
/*****************
|
||||||
** Log session **
|
** Log session **
|
||||||
|
@ -75,7 +84,6 @@ class Fs_log::Labeled_session_component : public Session_component
|
||||||
|
|
||||||
char _label[Log_session::String::MAX_SIZE];
|
char _label[Log_session::String::MAX_SIZE];
|
||||||
size_t _label_len;
|
size_t _label_len;
|
||||||
Log_file &_log_file;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -83,7 +91,7 @@ class Fs_log::Labeled_session_component : public Session_component
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Labeled_session_component(char const *label, Log_file &log_file)
|
Labeled_session_component(char const *label, Log_file &log_file)
|
||||||
: _log_file(log_file)
|
: Session_component(log_file)
|
||||||
{
|
{
|
||||||
snprintf(_label, sizeof(_label), "[%s] ", label);
|
snprintf(_label, sizeof(_label), "[%s] ", label);
|
||||||
_label_len = strlen(_label);
|
_label_len = strlen(_label);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user