View | Details | Raw Unified | Return to bug 54777
Collapse All | Expand All

(-)src/core/org/apache/jmeter/save/WritebackPrintWriter.java (+71 lines)
Line 0 Link Here
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 * contributor license agreements.  See the NOTICE file distributed with
4
 * this work for additional information regarding copyright ownership.
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 * (the "License"); you may not use this file except in compliance with
7
 * the License.  You may obtain a copy of the License at
8
 *
9
 *   http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 * 
17
 */
18
19
package org.apache.jmeter.save;
20
21
import java.io.PrintWriter;
22
import java.io.Writer;
23
import java.util.concurrent.atomic.AtomicLong;
24
25
import org.apache.jmeter.util.JMeterUtils;
26
27
/**
28
 * Decorator of PrintWriter
29
 * Simple goal is decreasing flush rate for high-throughput println() method
30
 */
31
public class WritebackPrintWriter extends PrintWriter{
32
    private static final long flush_period_in_bytes = JMeterUtils.getPropDefault("reporters.writeback.flush_period_in_bytes", 10240); // flush size bytes (every 10Kb)
33
    private static final long flush_period_in_ms = JMeterUtils.getPropDefault("reporters.writeback.flush_period_in_ms", 1000); //flush period in ms (every second)
34
    
35
    private AtomicLong last_flush_bytes = new AtomicLong(0);
36
    private AtomicLong last_flush_time = new AtomicLong(0);
37
38
    public WritebackPrintWriter(Writer bufferedWriter) { 
39
        super(bufferedWriter, false);
40
    }    
41
    
42
    @Override
43
    public void write(char buf[], int off, int len) {
44
        synchronized(this) {
45
            super.write(buf, off, len);
46
            last_flush_bytes.addAndGet(len-off);
47
        }
48
    }
49
    
50
    public void write(char c) {
51
        synchronized(this) {
52
            super.write(c);
53
            last_flush_bytes.addAndGet(1);
54
        }
55
    }
56
    
57
    @Override
58
    public void flush() {
59
        if(System.currentTimeMillis() - last_flush_time.get() > flush_period_in_ms
60
                || last_flush_bytes.get() > flush_period_in_bytes) {
61
            synchronized(this) {
62
                long time = System.currentTimeMillis();
63
                super.flush();
64
                last_flush_bytes.getAndSet(0);
65
                last_flush_time.getAndSet(time);
66
            }
67
        } else {
68
            //it's not your time
69
        }
70
    }
71
}
(-)src/core/org/apache/jmeter/reporters/ResultCollector.java (-2 / +3 lines)
Lines 46-51 Link Here
46
import org.apache.jmeter.save.CSVSaveService;
46
import org.apache.jmeter.save.CSVSaveService;
47
import org.apache.jmeter.save.OldSaveService;
47
import org.apache.jmeter.save.OldSaveService;
48
import org.apache.jmeter.save.SaveService;
48
import org.apache.jmeter.save.SaveService;
49
import org.apache.jmeter.save.WritebackPrintWriter;
49
import org.apache.jmeter.services.FileServer;
50
import org.apache.jmeter.services.FileServer;
50
import org.apache.jmeter.testelement.TestElement;
51
import org.apache.jmeter.testelement.TestElement;
51
import org.apache.jmeter.testelement.TestStateListener;
52
import org.apache.jmeter.testelement.TestStateListener;
Lines 419-426 Link Here
419
                    log.warn("Error creating directories for "+pdir.toString());
420
                    log.warn("Error creating directories for "+pdir.toString());
420
                }
421
                }
421
            }
422
            }
422
            writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filename,
423
            writer = new WritebackPrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filename,
423
                    trimmed)), SaveService.getFileEncoding("UTF-8")), true); // $NON-NLS-1$
424
                    trimmed)), SaveService.getFileEncoding("UTF-8"))); // $NON-NLS-1$
424
            log.debug("Opened file: "+filename);
425
            log.debug("Opened file: "+filename);
425
            files.put(filename, new FileEntry(writer, saveConfig));
426
            files.put(filename, new FileEntry(writer, saveConfig));
426
        } else {
427
        } else {

Return to bug 54777