Filip Niksic

dblp:125/2180 · DBLP profile ↗
← Back
13ranked-venue papers
0as first author
3since 2021 · last 2022
—ORCID · none

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 9 · 1 since 2021Theory of computation · 4Systems, architecture and hardware · 2 · 1 since 2021Databases, data management, data science and information retrieval · 1 · 1 since 2021

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
9 papers
Software testing · 42% Concurrent programming · 23% Programming languages and type systems · 12%
Computer architecture, parallel and distributed computing, and storage systems
6 papers
Distributed systems · 56% Parallel and multicore computing · 30% Electronic design automation · 14%
Databases, data mining, and information retrieval
3 papers
Data stream processing · 100%
Theoretical computer science
2 papers
Automata and formal languages · 65% Automated reasoning and model checking · 35%

Topics — the 25 heaviest of 27, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Software testing › system testing
distributed system testing
0.822020
Testing consensus implementations using communication closure · Proc. ACM Program. Lang. 2020
Randomized testing of distributed systems with probabilistic guarantees · Proc. ACM Program. Lang. 2018
Distributed systems
distributed system testing
0.722018
Randomized testing of distributed systems with probabilistic guarantees · Proc. ACM Program. Lang. 2018
Why is random testing effective for partition tolerance bugs? · Proc. ACM Program. Lang. 2018
Data stream processing › stream processing systems
stateful stream processing
0.612022
Stream processing with dependency-guided synchronization · PPoPP 2022
Parallel and multicore computing
parallel programming models
0.612022
Stream processing with dependency-guided synchronization · PPoPP 2022
Debugging and program repair
fault localization
0.512021
Reducing Time-To-Fix For Fuzzer Bugs · ASE 2021
Software testing
fuzzing
0.512021
Reducing Time-To-Fix For Fuzzer Bugs · ASE 2021
Software testing
differential testing
0.412020
DiffStream: differential output testing for stream processing programs · Proc. ACM Program. Lang. 2020
Distributed systems
consensus
0.412020
Testing consensus implementations using communication closure · Proc. ACM Program. Lang. 2020
Software testing
test coverage
0.422018
Why is random testing effective for partition tolerance bugs? · Proc. ACM Program. Lang. 2018
Hitting Families of Schedules for Asynchronous Programs · CAV (2) 2016
Concurrent programming
concurrent data structures
0.412019
Checking linearizability using hitting families · PPoPP 2019
Concurrent programming › atomicity
linearizability
0.412019
Checking linearizability using hitting families · PPoPP 2019
Program verification › concurrent program verification
linearizability verification
0.412019
Checking linearizability using hitting families · PPoPP 2019
Automata and formal languages › petri nets
coverability
0.422014
An SMT-Based Approach to Coverability Analysis · CAV 2014
Incremental, Inductive Coverability · CAV 2013
Concurrent programming
concurrency bug detection
0.312018
Randomized testing of distributed systems with probabilistic guarantees · Proc. ACM Program. Lang. 2018
Software testing
random testing
0.312018
Randomized testing of distributed systems with probabilistic guarantees · Proc. ACM Program. Lang. 2018
Electronic design automation › hardware verification and test
random testing
0.312018
Why is random testing effective for partition tolerance bugs? · Proc. ACM Program. Lang. 2018
Concurrent programming › concurrency models › asynchronous programming
asynchronous programs
0.212016
Hitting Families of Schedules for Asynchronous Programs · CAV (2) 2016
Programming languages and type systems › programming environment
live programming
0.212015
StriSynth: Synthesis for Live Programming · ICSE (2) 2015
Program synthesis and code generation
programming by example
0.212015
StriSynth: Synthesis for Live Programming · ICSE (2) 2015
Program synthesis and code generation › programming by example
string transformation synthesis
0.212015
StriSynth: Synthesis for Live Programming · ICSE (2) 2015
Automated reasoning and model checking
satisfiability modulo theories
0.212014
An SMT-Based Approach to Coverability Analysis · CAV 2014
Parallel and multicore computing › parallel computing
parallel implementation
0.112021
Synchronization Schemas · PODS 2021
Distributed systems
stream processing
0.112020
DiffStream: differential output testing for stream processing programs · Proc. ACM Program. Lang. 2020
Distributed systems
fault tolerance
0.112018
Why is random testing effective for partition tolerance bugs? · Proc. ACM Program. Lang. 2018
Empirical software engineering
end-user programming
0.112015
StriSynth: Synthesis for Live Programming · ICSE (2) 2015

Methods — techniques the papers use, named apart from their topics

series-parallel stream transformers · 1.5domain-specific language · 1.5combinatorial analysis · 1.3online equivalence checking · 1.3synchronization plans · 1.1partial order · 1.1randomized testing · 0.9lossy synchronous execution · 0.9failure bounds · 0.9fuzzing · 0.5automated bisection · 0.5combinatorial search · 0.4empirical study · 0.3SMT solving · 0.2inductive reasoning · 0.2
YearPublicationVenuePosition
2022 Stream processing with dependency-guided synchronization
abstract
Real-time data processing applications with low latency requirements have led to the increasing popularity of stream processing systems. While such systems offer convenient APIs that can be used to achieve data parallelism automatically, they offer limited support for computations that require synchronization between parallel nodes. In this paper, we propose dependency-guided synchronization (DGS), an alternative programming model for stateful streaming computations with complex synchronization requirements. In the proposed model, the input is viewed as partially ordered, and the program consists of a set of parallelization constructs which are applied to decompose the partial order and process events independently. Our programming model maps to an execution model called synchronization plans which supports synchronization between parallel nodes. Our evaluation shows that APIs offered by two widely used systems---Flink and Timely Dataflow---cannot suitably expose parallelism in some representative applications. In contrast, DGS enables implementations with scalable performance, the resulting synchronization plans offer throughput improvements when implemented manually in existing systems, and the programming overhead is small compared to writing sequential code.
Konstantinos Kallas, Filip Niksic, Caleb Stanford, Rajeev Alur
PPoPP2
2021 Reducing Time-To-Fix For Fuzzer Bugs
abstract
At Google, fuzzing C/C++ libraries has discovered tens of thousands of security and robustness bugs. However, these bugs are often reported much after they were introduced. Developers are provided only with fault-inducing test inputs and replication instructions that highlight a crash, but additional debugging information may be needed to localize the cause of the bug. Hence, developers need to spend substantial time debugging the code and identifying commits that introduced the bug. In this paper, we discuss our experience with automating a fuzzing-enabled bisection that pinpoints the commit in which the crash first manifests itself. This ultimately reduces the time critical bugs stay open in our code base. We report on our experience over the past year, which shows that developers fix bugs on average 2.23 times faster when aided by this automated analysis.
Rui Abreu 0001, Franjo Ivancic, Filip Niksic, Hadi Ravanbakhsh, Ramesh Viswanathan
ASE3
2021 Synchronization Schemas
abstract
We present a type-theoretic framework for data stream processing for real-time decision making, where the desired computation involves a mix of sequential computation, such as smoothing and detection of peaks and surges, and naturally parallel computation, such as relational operations, key-based partitioning, and map-reduce. Our framework unifies sequential (ordered) and relational (unordered) data models. In particular, we define synchronization schemas as types, and series-parallel streams (SPS) as objects of these types. A synchronization schema imposes a hierarchical structure over relational types that succinctly captures ordering and synchronization requirements among different kinds of data items. Series-parallel streams naturally model objects such as relations, sequences, sequences of relations, sets of streams indexed by key values, time-based and event-based windows, and more complex structures obtained by nesting of these. We introduce series-parallel stream transformers (SPST) as a domain-specific language for modular specification of deterministic transformations over such streams. SPSTs provably specify only monotonic transformations allowing streamability, have a modular structure that can be exploited for correct parallel implementation, and are composable allowing specification of complex queries as a pipeline of transformations.
Rajeev Alur, Phillip Hilliard, Zachary G. Ives, Konstantinos Kallas, Konstantinos Mamouras, Filip Niksic, Caleb Stanford, Val Tannen, Anton Xue
PODS6
2020 Testing consensus implementations using communication closure
abstract
Large scale production distributed systems are difficult to design and test. Correctness must be ensured when processes run asynchronously, at arbitrary rates relative to each other, and in the presence of failures, e.g., process crashes or message losses. These conditions create a huge space of executions that is difficult to explore in a principled way. Current testing techniques focus on systematic or randomized exploration of all executions of an implementation while treating the implemented algorithms as black boxes. On the other hand, proofs of correctness of many of the underlying algorithms often exploit semantic properties that reduce reasoning about correctness to a subset of behaviors. For example, the communication-closure property, used in many proofs of distributed consensus algorithms, shows that every asynchronous execution of the algorithm is equivalent to a lossy synchronous execution, thus reducing the burden of proof to only that subset. In a lossy synchronous execution, processes execute in lock-step rounds, and messages are either received in the same round or lost forever—such executions form a small subset of all asynchronous ones. We formulate the communication-closure hypothesis , which states that bugs in implementations of distributed consensus algorithms will already manifest in lossy synchronous executions and present a testing algorithm based on this hypothesis. We prioritize the search space based on a bound on the number of failures in the execution and the rate at which these failures are recovered. We show that a random testing algorithm based on sampling lossy synchronous executions can empirically find a number of bugs—including previously unknown ones—in production distributed systems such as Zookeeper, Cassandra, and Ratis, and also produce more understandable bug traces.
Cezara Dragoi, Constantin Enea, Burcu Kulahcioglu Ozkan, Rupak Majumdar, Filip Niksic
Proc. ACM Program. Lang.5
2020 DiffStream: differential output testing for stream processing programs
abstract
High performance architectures for processing distributed data streams, such as Flink, Spark Streaming, and Storm, are increasingly deployed in emerging data-driven computing systems. Exploiting the parallelism afforded by such platforms, while preserving the semantics of the desired computation, is prone to errors, and motivates the development of tools for specification, testing, and verification. We focus on the problem of differential output testing for distributed stream processing systems, that is, checking whether two implementations produce equivalent output streams in response to a given input stream. The notion of equivalence allows reordering of logically independent data items, and the main technical contribution of the paper is an optimal online algorithm for checking this equivalence. Our testing framework is implemented as a library called DiffStream in Flink. We present four case studies to illustrate how our framework can be used to (1) correctly identify bugs in a set of benchmark MapReduce programs, (2) facilitate the development of difficult-to-parallelize high performance applications, and (3) monitor an application for a long period of time with minimal performance overhead.
Konstantinos Kallas, Filip Niksic, Caleb Stanford, Rajeev Alur
Proc. ACM Program. Lang.2
2019 Checking linearizability using hitting families
abstract
Linearizability is a key correctness property for concurrent data types. Linearizability requires that the behavior of concurrently invoked operations of the data type be equivalent to the behavior in an execution where each operation takes effect at an instantaneous point of time between its invocation and return. Given an execution trace of operations, the problem of verifying its linearizability is NP-complete, and current exhaustive search tools scale poorly.
Burcu Kulahcioglu Ozkan, Rupak Majumdar, Filip Niksic
PPoPP3
2018 Why is random testing effective for partition tolerance bugs?
abstract
Random testing has proven to be an effective way to catch bugs in distributed systems in the presence of network partition faults. This is surprising, as the space of potentially faulty executions is enormous, and the bugs depend on a subtle interplay between sequences of operations and faults. We provide a theoretical justification of the effectiveness of random testing in this context. First, we show a general construction, using the probabilistic method from combinatorics, that shows that whenever a random test covers a fixed coverage goal with sufficiently high probability, a small randomly-chosen set of tests achieves full coverage with high probability. In particular, we show that our construction can give test sets exponentially smaller than systematic enumeration. Second, based on an empirical study of many bugs found by random testing in production distributed systems, we introduce notions of test coverage relating to network partition faults which are effective in finding bugs. Finally, we show using combinatorial arguments that for these notions of test coverage we introduce, we can find a lower bound on the probability that a random test covers a given goal. Our general construction then explains why random testing tools achieve good coverage---and hence, find bugs---quickly. While we formulate our results in terms of network partition faults, our construction provides a step towards rigorous analysis of random testing algorithms, and can be applicable in other scenarios.
Rupak Majumdar, Filip Niksic
Proc. ACM Program. Lang.2
2018 Randomized testing of distributed systems with probabilistic guarantees
abstract
Several recently proposed randomized testing tools for concurrent and distributed systems come with theoretical guarantees on their success. The key to these guarantees is a notion of bug depth—the minimum length of a sequence of events sufficient to expose the bug—and a characterization of d -hitting families of schedules—a set of schedules guaranteed to cover every bug of given depth d . Previous results show that in certain cases the size of a d -hitting family can be significantly smaller than the total number of possible schedules. However, these results either assume shared-memory multithreading, or that the underlying partial ordering of events is known statically and has special structure. These assumptions are not met by distributed message-passing applications. In this paper, we present a randomized scheduling algorithm for testing distributed systems. In contrast to previous approaches, our algorithm works for arbitrary partially ordered sets of events revealed online as the program is being executed. We show that for partial orders of width at most w and size at most n (both statically unknown), our algorithm is guaranteed to sample from at most w 2 n d −1 schedules, for every fixed bug depth d . Thus, our algorithm discovers a bug of depth d with probability at least 1 / ( w 2 n d −1 ). As a special case, our algorithm recovers a previous randomized testing algorithm for multithreaded programs. Our algorithm is simple to implement, but the correctness arguments depend on difficult combinatorial results about online dimension and online chain partitioning of partially ordered sets. We have implemented our algorithm in a randomized testing tool for distributed message-passing programs. We show that our algorithm can find bugs in distributed systems such as Zookeeper and Cassandra, and empirically outperforms naive random exploration while providing theoretical guarantees.
Burcu Kulahcioglu Ozkan, Rupak Majumdar, Filip Niksic, Mitra Tabaei Befrouei, Georg Weissenbacher
Proc. ACM Program. Lang.3
2016 Hitting Families of Schedules for Asynchronous Programs
Dmitry Chistikov 0001, Rupak Majumdar, Filip Niksic
CAV (2)3
2015 Rely/Guarantee Reasoning for Asynchronous Programs
abstract
Asynchronous programming has become ubiquitous in smartphone and web application development, as well as in the development of server-side and system applications. Many of the uses of asynchrony can be modeled by extending programming languages with asynchronous procedure calls - procedures not executed immediately, but stored and selected for execution at a later point by a non-deterministic scheduler. Asynchronous calls induce a flow of control that is difficult to reason about, which in turn makes formal verification of asynchronous programs challenging. In response, we take a rely/guarantee approach: Each asynchronous procedure is verified separately with respect to its rely and guarantee predicates; the correctness of the whole program then follows from the natural conditions the rely/guarantee predicates have to satisfy. In this way, the verification of asynchronous programs is modularly decomposed into the more usual verification of sequential programs with synchronous calls. For the sequential program verification we use Hoare-style deductive reasoning, which we demonstrate on several simplified examples. These examples were inspired from programs written in C using the popular Libevent library; they are manually annotated and verified within the state-of-the-art Frama-C platform.
Ivan Gavran, Filip Niksic, Aditya Kanade 0001, Rupak Majumdar, Viktor Vafeiadis
CONCUR2
2015 StriSynth: Synthesis for Live Programming
abstract
Motivated by applications in automating repetitive file manipulations, we present a tool called StriSynth, which allows end-users to perform transformations over data using examples. Based on provided examples, our tool automaticallygenerates scripts for non-trivial file manipulations. Although the current focus of StriSynth are file manipulations, it implements a more general string transformation framework. This framework builds on and further extends the functionality of Flash Fill -- a Microsoft Excel extension for string transformations. An accompanying video to this paper is available at the following website http://youtu.be/kkDZphqIdFM.
Sumit Gulwani, Mikaël Mayer, Filip Niksic, Ruzica Piskac
ICSE (2)3
2014 An SMT-Based Approach to Coverability Analysis
Javier Esparza, Ruslán Ledesma-Garza, Rupak Majumdar, Klara J. Meyer, Filip Niksic
CAV5
2013 Incremental, Inductive Coverability
Johannes Kloos, Rupak Majumdar, Filip Niksic, Ruzica Piskac
CAV3