| 817 | } |
| 818 | |
| 819 | void ChangeLog::bgArchiver() |
| 820 | { |
| 821 | try |
| 822 | { |
| 823 | // Signal about our startup |
| 824 | m_startupSemaphore.release(); |
| 825 | |
| 826 | while (!m_shutdown) |
| 827 | { |
| 828 | LockGuard guard(this); |
| 829 | |
| 830 | const auto state = m_sharedMemory->getHeader(); |
| 831 | |
| 832 | for (const auto segment : m_segments) |
| 833 | { |
| 834 | if (segment->getState() == SEGMENT_STATE_USED) |
| 835 | { |
| 836 | if (segment->hasData() && m_config->archiveTimeout) |
| 837 | { |
| 838 | const auto delta_timestamp = time(NULL) - state->timestamp; |
| 839 | |
| 840 | if (delta_timestamp > m_config->archiveTimeout) |
| 841 | { |
| 842 | segment->setState(SEGMENT_STATE_FULL); |
| 843 | state->flushMark++; |
| 844 | } |
| 845 | } |
| 846 | |
| 847 | break; |
| 848 | } |
| 849 | } |
| 850 | |
| 851 | Segment* lastSegment = nullptr; |
| 852 | |
| 853 | while (!m_shutdown) |
| 854 | { |
| 855 | bool restart = false; |
| 856 | |
| 857 | for (const auto segment : m_segments) |
| 858 | { |
| 859 | if (segment != lastSegment && |
| 860 | segment->getState() == SEGMENT_STATE_FULL) |
| 861 | { |
| 862 | lastSegment = segment; |
| 863 | archiveSegment(segment); |
| 864 | restart = true; |
| 865 | break; |
| 866 | } |
| 867 | } |
| 868 | |
| 869 | if (!restart) |
| 870 | break; |
| 871 | } |
| 872 | |
| 873 | guard.release(); |
| 874 | |
| 875 | m_workingSemaphore.tryEnter(1); |
| 876 | } |
no test coverage detected