From 526e9ac7eca1dd9887b1e913b0c04175347b1660 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Fri, 24 Apr 2026 13:36:50 -0700 Subject: [PATCH 1/5] BP-69 base: add slog dependency and LICENSE entries Minimal scaffolding commit for the BP-69 slog migration series: - Add `io.github.merlimat.slog:slog:0.9.7` to the root pom.xml dependencyManagement and to the global compile classpath alongside the existing SLF4J API (which stays as the rendering backend). - Add lombok.config at the repo root so `@CustomLog` generates a slog `Logger` instead of an SLF4J one. - Register the slog jar in LICENSE-all.bin.txt, LICENSE-server.bin.txt and LICENSE-bkctl.bin.txt so the CI check-binary-license script finds it accounted for in the bundled-jars list. No actual Java file is converted in this commit. Individual module migrations stack on top of this one. --- .../src/main/resources/LICENSE-all.bin.txt | 2 ++ .../src/main/resources/LICENSE-bkctl.bin.txt | 2 ++ .../src/main/resources/LICENSE-server.bin.txt | 2 ++ lombok.config | 24 +++++++++++++++++++ pom.xml | 10 ++++++++ 5 files changed, 40 insertions(+) create mode 100644 lombok.config diff --git a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt index e23b4fe4b09..868168e9335 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.7.jar [64] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -422,6 +423,7 @@ Apache Software License, Version 2. [61] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [62] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [63] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[64] Source available at https://github.com/merlimat/slog/tree/v0.9.7 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt index 6982f75955d..dd0d123b0ae 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.7.jar [59] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-common-4.2.12.Final.jar [11] @@ -355,6 +356,7 @@ Apache Software License, Version 2. [56] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [57] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [58] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[59] Source available at https://github.com/merlimat/slog/tree/v0.9.7 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt index b4b7a8f44e0..b2e9d676dc0 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.7.jar [63] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -417,6 +418,7 @@ Apache Software License, Version 2. [60] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [61] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [62] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[63] Source available at https://github.com/merlimat/slog/tree/v0.9.7 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/lombok.config b/lombok.config new file mode 100644 index 00000000000..bc68b26eebd --- /dev/null +++ b/lombok.config @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# this is the top level Lombok configuration file +# see https://projectlombok.org/features/configuration for reference + +config.stopBubbling = true +lombok.log.custom.declaration = io.github.merlimat.slog.Logger io.github.merlimat.slog.Logger.get(TYPE) diff --git a/pom.xml b/pom.xml index 29d3d24be86..3de84676b52 100644 --- a/pom.xml +++ b/pom.xml @@ -192,6 +192,7 @@ 9.9.3 3.3.0 2.0.12 + 0.9.7 2.0 4.6.0 2.43.0 @@ -273,6 +274,11 @@ + + io.github.merlimat.slog + slog + ${slog.version} + org.slf4j slf4j-bom @@ -882,6 +888,10 @@ + + io.github.merlimat.slog + slog + org.slf4j slf4j-api From 3d7deddd3860947805489ff1e8d03de7c33d8cdf Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Fri, 24 Apr 2026 14:20:52 -0700 Subject: [PATCH 2/5] BP-69: Convert bookkeeper-server from SLF4J to slog --- .../bookie/BookieCriticalThread.java | 12 +- .../apache/bookkeeper/bookie/BookieImpl.java | 156 ++++++----- .../bookkeeper/bookie/BookieResources.java | 7 +- .../apache/bookkeeper/bookie/BookieShell.java | 63 +++-- .../bookkeeper/bookie/BookieStateManager.java | 30 +- .../bookkeeper/bookie/BookieStatus.java | 36 +-- .../bookkeeper/bookie/BookieThread.java | 12 +- .../org/apache/bookkeeper/bookie/Cookie.java | 7 +- .../bookkeeper/bookie/DefaultEntryLogger.java | 137 +++++---- .../bookkeeper/bookie/EntryLogCompactor.java | 15 +- .../bookie/EntryLogManagerBase.java | 21 +- .../EntryLogManagerForEntryLogPerLedger.java | 46 +++- .../EntryLogManagerForSingleEntryLog.java | 6 +- .../bookie/EntryLoggerAllocator.java | 15 +- .../bookkeeper/bookie/EntryMemTable.java | 9 +- .../EntryMemTableWithParallelFlusher.java | 12 +- .../apache/bookkeeper/bookie/FileInfo.java | 48 ++-- .../bookie/FileInfoBackingCache.java | 11 +- .../bookkeeper/bookie/FileSystemUpgrade.java | 65 +++-- .../bookie/GarbageCollectorThread.java | 217 +++++++++------ .../bookkeeper/bookie/IndexInMemPageMgr.java | 30 +- .../bookie/IndexPersistenceMgr.java | 43 +-- .../bookie/InterleavedLedgerStorage.java | 70 +++-- .../InterleavedStorageRegenerateIndexOp.java | 48 ++-- .../org/apache/bookkeeper/bookie/Journal.java | 96 ++++--- .../bookkeeper/bookie/JournalChannel.java | 25 +- .../bookkeeper/bookie/LedgerCacheImpl.java | 9 +- .../bookie/LedgerDescriptorImpl.java | 19 +- .../bookkeeper/bookie/LedgerDirsManager.java | 19 +- .../bookkeeper/bookie/LedgerDirsMonitor.java | 41 +-- .../bookkeeper/bookie/LedgerEntryPage.java | 20 +- .../bookie/LegacyCookieValidation.java | 28 +- .../LocalBookieEnsemblePlacementPolicy.java | 8 +- .../bookkeeper/bookie/ReadOnlyBookie.java | 10 +- .../ScanAndCompareGarbageCollector.java | 70 +++-- .../bookie/SortedLedgerStorage.java | 17 +- .../apache/bookkeeper/bookie/SyncThread.java | 26 +- .../TransactionalEntryLogCompactor.java | 78 ++++-- .../bookie/UncleanShutdownDetectionImpl.java | 43 +-- .../DataIntegrityCookieValidation.java | 23 +- .../bookie/datainteg/WriteSets.java | 3 - .../storage/ldb/EntryLocationIndex.java | 53 ++-- .../storage/ldb/KeyValueStorageRocksDB.java | 33 ++- .../storage/ldb/LedgerMetadataIndex.java | 67 ++--- .../storage/ldb/LedgersIndexCheckOp.java | 40 +-- .../storage/ldb/LedgersIndexRebuildOp.java | 59 ++-- .../storage/ldb/LocationsIndexRebuildOp.java | 33 +-- .../bookie/storage/ldb/ReadCache.java | 10 +- .../ldb/SingleDirectoryDbLedgerStorage.java | 181 ++++++------ .../bookie/storage/ldb/WriteCache.java | 23 +- .../bookkeeper/client/BatchedReadOp.java | 31 ++- .../apache/bookkeeper/client/BookKeeper.java | 50 ++-- .../bookkeeper/client/BookKeeperAdmin.java | 205 +++++++++----- .../client/BookieAddressResolverDisabled.java | 4 +- .../bookkeeper/client/BookieInfoReader.java | 113 ++++---- .../bookkeeper/client/BookieWatcherImpl.java | 57 ++-- .../client/DefaultBookieAddressResolver.java | 23 +- .../DefaultEnsemblePlacementPolicy.java | 5 +- ...aultSpeculativeRequestExecutionPolicy.java | 29 +- .../DynamicWeightedRandomSelectionImpl.java | 5 +- .../bookkeeper/client/EnsembleUtils.java | 29 +- .../client/ExplicitLacFlushPolicy.java | 47 ++-- .../bookkeeper/client/ForceLedgerOp.java | 30 +- .../bookkeeper/client/LedgerChecker.java | 39 ++- .../bookkeeper/client/LedgerCreateOp.java | 71 +++-- .../bookkeeper/client/LedgerDeleteOp.java | 8 +- .../client/LedgerFragmentReplicator.java | 101 ++++--- .../bookkeeper/client/LedgerHandle.java | 259 +++++++++++------- .../bookkeeper/client/LedgerHandleAdv.java | 15 +- .../bookkeeper/client/LedgerMetadataImpl.java | 5 +- .../client/LedgerMetadataUtils.java | 5 +- .../bookkeeper/client/LedgerOpenOp.java | 29 +- .../bookkeeper/client/LedgerRecoveryOp.java | 34 ++- .../client/ListenerBasedPendingReadOp.java | 4 +- .../bookkeeper/client/MetadataUpdateLoop.java | 56 ++-- .../bookkeeper/client/PendingAddOp.java | 90 ++++-- .../bookkeeper/client/PendingReadLacOp.java | 27 +- .../bookkeeper/client/PendingReadOp.java | 43 ++- .../bookkeeper/client/PendingWriteLacOp.java | 10 +- .../RackawareEnsemblePlacementPolicyImpl.java | 170 +++++++----- .../client/ReadLastConfirmedAndEntryOp.java | 97 ++++--- .../client/ReadLastConfirmedOp.java | 29 +- .../client/ReadOnlyLedgerHandle.java | 58 ++-- .../apache/bookkeeper/client/ReadOpBase.java | 42 +-- .../RegionAwareEnsemblePlacementPolicy.java | 93 ++++--- .../RoundRobinDistributionSchedule.java | 15 +- .../bookkeeper/client/SyncCallbackUtils.java | 10 +- .../TopologyAwareEnsemblePlacementPolicy.java | 100 ++++--- .../client/TryReadLastConfirmedOp.java | 37 ++- .../bookkeeper/client/UpdateLedgerOp.java | 33 ++- .../client/WeightedRandomSelectionImpl.java | 37 ++- .../ZoneawareEnsemblePlacementPolicyImpl.java | 138 ++++++---- .../client/impl/OpenBuilderBase.java | 7 +- .../AbstractHierarchicalLedgerManager.java | 23 +- .../meta/AbstractZkLedgerManager.java | 196 +++++++------ .../bookkeeper/meta/FlatLedgerManager.java | 5 +- .../meta/HierarchicalLedgerManager.java | 5 +- .../bookkeeper/meta/LedgerMetadataSerDe.java | 39 ++- .../meta/LegacyHierarchicalLedgerManager.java | 15 +- .../meta/LongHierarchicalLedgerManager.java | 17 +- .../meta/LongZkLedgerIdGenerator.java | 44 ++- .../meta/MSLedgerManagerFactory.java | 135 +++++---- .../bookkeeper/meta/ZkLedgerIdGenerator.java | 24 +- .../meta/ZkLedgerUnderreplicationManager.java | 168 +++++------- .../bookkeeper/metastore/MetastoreUtils.java | 23 +- .../java/org/apache/bookkeeper/net/DNS.java | 27 +- .../bookkeeper/net/NetworkTopologyImpl.java | 29 +- .../bookkeeper/net/ScriptBasedMapping.java | 30 +- .../net/StabilizeNetworkTopology.java | 13 +- .../bookkeeper/proto/AddCompletion.java | 6 +- .../apache/bookkeeper/proto/AuthHandler.java | 52 ++-- .../org/apache/bookkeeper/proto/BKStats.java | 7 +- .../bookkeeper/proto/BookieClientImpl.java | 7 +- .../bookkeeper/proto/BookieNettyServer.java | 27 +- .../bookkeeper/proto/BookieProtoEncoding.java | 59 ++-- .../proto/BookieRequestHandler.java | 18 +- .../proto/BookieRequestProcessor.java | 89 +++--- .../apache/bookkeeper/proto/BookieServer.java | 29 +- .../proto/BookkeeperInternalCallbacks.java | 14 +- .../bookkeeper/proto/CompletionValue.java | 42 +-- .../DefaultPerChannelBookieClientPool.java | 6 +- .../proto/ForceLedgerCompletion.java | 4 +- .../proto/ForceLedgerProcessorV3.java | 10 +- .../proto/GetBookieInfoCompletion.java | 7 +- .../proto/GetBookieInfoProcessorV3.java | 18 +- .../GetListOfEntriesOfLedgerCompletion.java | 4 +- .../GetListOfEntriesOfLedgerProcessorV3.java | 19 +- .../proto/LongPollReadEntryProcessorV3.java | 74 ++--- .../bookkeeper/proto/PacketProcessorBase.java | 52 ++-- .../proto/PacketProcessorBaseV3.java | 14 +- .../proto/PerChannelBookieClient.java | 174 ++++++------ .../bookkeeper/proto/ReadCompletion.java | 7 +- .../bookkeeper/proto/ReadEntryProcessor.java | 86 +++--- .../proto/ReadEntryProcessorV3.java | 83 +++--- .../bookkeeper/proto/ReadLacCompletion.java | 4 +- .../bookkeeper/proto/ReadLacProcessorV3.java | 37 ++- .../bookkeeper/proto/StartTLSCompletion.java | 10 +- .../bookkeeper/proto/WriteEntryProcessor.java | 37 ++- .../proto/WriteEntryProcessorV3.java | 42 ++- .../bookkeeper/proto/WriteLacCompletion.java | 4 +- .../bookkeeper/proto/WriteLacProcessorV3.java | 42 ++- .../proto/checksum/CRC32CDigestManager.java | 4 +- .../proto/checksum/DigestManager.java | 53 ++-- .../proto/checksum/MacDigestManager.java | 7 +- .../bookkeeper/replication/Auditor.java | 152 +++++----- .../replication/AuditorBookieCheckTask.java | 30 +- .../AuditorCheckAllLedgersTask.java | 72 ++--- .../replication/AuditorElector.java | 26 +- .../AuditorPlacementPolicyCheckTask.java | 118 ++++---- .../replication/AuditorReplicasCheckTask.java | 164 ++++++----- .../bookkeeper/replication/AuditorTask.java | 12 +- .../replication/AutoRecoveryMain.java | 52 ++-- .../replication/BookieLedgerIndexer.java | 11 +- .../replication/ReplicationEnableCb.java | 14 +- .../replication/ReplicationWorker.java | 176 ++++++------ .../sasl/SASLBookieAuthProvider.java | 12 +- .../sasl/SASLBookieAuthProviderFactory.java | 20 +- .../sasl/SASLClientAuthProvider.java | 18 +- .../sasl/SASLClientProviderFactory.java | 13 +- .../bookkeeper/sasl/SaslClientState.java | 25 +- .../bookkeeper/sasl/SaslServerState.java | 51 ++-- .../bookkeeper/sasl/TGTRefreshThread.java | 106 +++---- .../http/service/BookieSanityService.java | 9 +- .../http/service/ClusterInfoService.java | 6 +- .../http/service/DecommissionService.java | 34 ++- .../http/service/DeleteLedgerService.java | 9 +- .../http/service/ExpandStorageService.java | 11 +- .../server/http/service/GCDetailsService.java | 9 +- .../http/service/GetLastLogMarkService.java | 20 +- .../http/service/GetLedgerMetaService.java | 9 +- .../http/service/ListBookieInfoService.java | 9 +- .../http/service/ListBookiesService.java | 12 +- .../http/service/ListDiskFilesService.java | 9 +- .../http/service/ListLedgerService.java | 9 +- .../ListUnderReplicatedLedgerService.java | 11 +- .../LostBookieRecoveryDelayService.java | 11 +- .../http/service/ReadLedgerEntryService.java | 9 +- .../http/service/RecoveryBookieService.java | 20 +- .../http/service/ResumeCompactionService.java | 9 +- .../service/SuspendCompactionService.java | 13 +- .../http/service/TriggerAuditService.java | 11 +- .../server/http/service/TriggerGCService.java | 19 +- .../TriggerLocationCompactService.java | 15 +- .../http/service/WhoIsAuditorService.java | 11 +- .../server/service/BookieService.java | 9 +- .../server/service/ScrubberService.java | 14 +- .../streaming/LedgerOutputStream.java | 16 +- .../bookkeeper/tls/BookieAuthZFactory.java | 36 ++- .../tls/FileModifiedTimeUpdater.java | 10 +- .../tls/SecurityProviderFactoryFactory.java | 12 +- .../bookkeeper/tls/TLSContextFactory.java | 56 ++-- .../ListUnderReplicatedCommand.java | 23 +- .../LostBookieRecoveryDelayCommand.java | 13 +- .../QueryAutoRecoveryStatusCommand.java | 27 +- .../commands/autorecovery/ToggleCommand.java | 17 +- .../autorecovery/WhoIsAuditorCommand.java | 9 +- .../bookie/CheckDBLedgersIndexCommand.java | 12 +- .../bookie/ConvertToDBStorageCommand.java | 23 +- .../ConvertToInterleavedStorageCommand.java | 17 +- .../commands/bookie/FlipBookieIdCommand.java | 25 +- .../cli/commands/bookie/FormatCommand.java | 4 - .../tools/cli/commands/bookie/FormatUtil.java | 49 ++-- .../cli/commands/bookie/LastMarkCommand.java | 14 +- .../cli/commands/bookie/LedgerCommand.java | 9 +- .../bookie/ListActiveLedgersCommand.java | 34 ++- .../bookie/ListFilesOnDiscCommand.java | 21 +- .../commands/bookie/ListLedgersCommand.java | 22 +- .../bookie/LocalConsistencyCheckCommand.java | 18 +- .../commands/bookie/ReadJournalCommand.java | 20 +- .../commands/bookie/ReadLedgerCommand.java | 33 ++- .../cli/commands/bookie/ReadLogCommand.java | 51 ++-- .../bookie/ReadLogMetadataCommand.java | 26 +- .../RebuildDBLedgerLocationsIndexCommand.java | 10 +- .../bookie/RebuildDBLedgersIndexCommand.java | 12 +- ...ateInterleavedStorageIndexFileCommand.java | 12 +- .../commands/bookie/SanityTestCommand.java | 38 ++- .../bookie/UpdateBookieInLedgerCommand.java | 25 +- .../commands/bookies/ClusterInfoCommand.java | 13 +- .../commands/bookies/DecommissionCommand.java | 24 +- .../commands/bookies/EndpointInfoCommand.java | 37 ++- .../cli/commands/bookies/InfoCommand.java | 28 +- .../commands/bookies/InstanceIdCommand.java | 12 +- .../commands/bookies/ListBookiesCommand.java | 17 +- .../bookies/NukeExistingClusterCommand.java | 8 +- .../cli/commands/bookies/RecoverCommand.java | 53 ++-- .../commands/client/DeleteLedgerCommand.java | 7 +- .../client/LedgerMetaDataCommand.java | 13 +- .../commands/client/SimpleTestCommand.java | 15 +- .../cli/commands/cookie/AdminCommand.java | 64 +++-- .../cli/commands/cookie/CookieCommand.java | 3 - .../commands/cookie/CreateCookieCommand.java | 2 - .../commands/cookie/DeleteCookieCommand.java | 2 - .../cookie/GenerateCookieCommand.java | 2 - .../cli/commands/cookie/GetCookieCommand.java | 2 - .../commands/cookie/UpdateCookieCommand.java | 2 - .../health/SwitchOfHealthCheckCommand.java | 20 +- .../apache/bookkeeper/util/DiskChecker.java | 20 +- .../bookkeeper/util/EntryFormatter.java | 12 +- .../apache/bookkeeper/util/EventLoopUtil.java | 12 +- .../org/apache/bookkeeper/util/HardLink.java | 9 +- .../org/apache/bookkeeper/util/IOUtils.java | 45 ++- .../bookkeeper/util/LedgerIdFormatter.java | 14 +- .../bookkeeper/util/LocalBookKeeper.java | 42 +-- .../util/OrderedGenericCallback.java | 10 +- .../apache/bookkeeper/util/PageCacheUtil.java | 13 +- .../apache/bookkeeper/util/SubTreeCache.java | 5 +- .../org/apache/bookkeeper/util/ZkUtils.java | 13 +- .../CustomZooKeeperHostProvider.java | 12 +- .../ExponentialBackOffWithDeadlinePolicy.java | 11 +- .../bookkeeper/zookeeper/ZooKeeperClient.java | 32 ++- .../zookeeper/ZooKeeperWatcherBase.java | 32 +-- .../bookkeeper/zookeeper/ZooWorker.java | 16 +- .../proto/TestBackwardCompatCMS42.java | 4 + 253 files changed, 5014 insertions(+), 4057 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieCriticalThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieCriticalThread.java index 31712a60d70..fd14bb5b02c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieCriticalThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieCriticalThread.java @@ -17,16 +17,14 @@ */ package org.apache.bookkeeper.bookie; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * Thread is marked as critical and will exit, when there is an uncaught * exception occurred in thread. */ +@CustomLog public class BookieCriticalThread extends BookieThread { - private static final Logger LOG = LoggerFactory - .getLogger(BookieCriticalThread.class); public BookieCriticalThread(String name) { super(name); @@ -38,8 +36,10 @@ public BookieCriticalThread(Runnable thread, String name) { @Override protected void handleException(Thread t, Throwable e) { - LOG.error("Uncaught exception in thread {} and is exiting!", - t.getName(), e); + log.error() + .exception(e) + .attr("threadName", t.getName()) + .log("Uncaught exception in thread and is exiting!"); Runtime.getRuntime().exit(ExitCode.BOOKIE_EXCEPTION); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieImpl.java index 111f5134e78..362a20129a1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieImpl.java @@ -54,6 +54,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException.DiskPartitionDuplicationException; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; import org.apache.bookkeeper.bookie.Journal.JournalScanner; @@ -80,16 +81,13 @@ import org.apache.bookkeeper.util.collections.ConcurrentLongHashMap; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.mutable.MutableBoolean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implements a bookie. */ +@CustomLog public class BookieImpl implements Bookie { - private static final Logger LOG = LoggerFactory.getLogger(Bookie.class); - final List journalDirectories; final ServerConfiguration conf; @@ -133,10 +131,12 @@ static class NopWriteCallback implements WriteCallback { @Override public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Object ctx) { - if (LOG.isDebugEnabled()) { - LOG.debug("Finished writing entry {} @ ledger {} for {} : {}", - entryId, ledgerId, addr, rc); - } + log.debug() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .attr("addr", addr) + .attr("rc", rc) + .log("Finished writing entry"); } } @@ -158,12 +158,12 @@ public boolean accept(File dir, String name) { }); if (preV3versionFile.exists() || oldDataExists.get()) { String err = "Directory layout version is less than 3, upgrade needed"; - LOG.error(err); + log.error(err); throw new IOException(err); } if (!dir.mkdirs()) { String err = "Unable to create directory " + dir; - LOG.error(err); + log.error(err); throw new IOException(err); } } @@ -214,7 +214,7 @@ private void checkIfDirsOnSameDiskPartition(List dirs) throws DiskPartitio try { fileStore = Files.getFileStore(dir.toPath()); } catch (IOException e) { - LOG.error("Got IOException while trying to FileStore of {}", dir); + log.error().attr("directory", dir).log("Got IOException while trying to get FileStore"); throw new BookieException.DiskPartitionDuplicationException(e); } if (fileStoreDirsMap.containsKey(fileStore)) { @@ -229,9 +229,15 @@ private void checkIfDirsOnSameDiskPartition(List dirs) throws DiskPartitio fileStoreDirsMap.forEach((fileStore, dirsList) -> { if (dirsList.size() > 1) { if (allowDiskPartitionDuplication) { - LOG.warn("Dirs: {} are in same DiskPartition/FileSystem: {}", dirsList, fileStore); + log.warn() + .attr("dirsList", dirsList) + .attr("fileStore", fileStore) + .log("Dirs are in same DiskPartition/FileSystem"); } else { - LOG.error("Dirs: {} are in same DiskPartition/FileSystem: {}", dirsList, fileStore); + log.error() + .attr("dirsList", dirsList) + .attr("fileStore", fileStore) + .log("Dirs are in same DiskPartition/FileSystem"); isDuplicationFoundAndNotAllowed.setValue(true); } } @@ -523,9 +529,9 @@ StateManager initializeStateManager() throws IOException { void readJournal() throws IOException, BookieException { if (!conf.getJournalWriteData()) { - LOG.warn("Journal disabled for add entry requests. Running BookKeeper this way can " - + "lead to data loss. It is recommended to use data integrity checking when " - + "running without the journal to minimize data loss risk"); + log.warn("Journal disabled for add entry requests. Running BookKeeper this way can lead to " + + "data loss. It is recommended to use data integrity checking when running without " + + "the journal to minimize data loss risk"); } long startTs = System.currentTimeMillis(); @@ -535,9 +541,10 @@ public void process(int journalVersion, long offset, ByteBuffer recBuff) throws long ledgerId = recBuff.getLong(); long entryId = recBuff.getLong(); try { - if (LOG.isDebugEnabled()) { - LOG.debug("Replay journal - ledger id : {}, entry id : {}.", ledgerId, entryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Replay journal"); if (entryId == METAENTRY_ID_LEDGER_KEY) { if (journalVersion >= JournalChannel.V3) { int masterKeyLen = recBuff.getInt(); @@ -593,8 +600,10 @@ public void process(int journalVersion, long offset, ByteBuffer recBuff) throws * special entry while replaying journal we should skip * (ignore) it. */ - LOG.warn("Read unrecognizable entryId: {} for ledger: {} while replaying Journal. Skipping it", - entryId, ledgerId); + log.warn() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Read unrecognizable entry while replaying Journal. Skipping it"); } else { byte[] key = masterKeyCache.get(ledgerId); if (key == null) { @@ -606,9 +615,9 @@ public void process(int journalVersion, long offset, ByteBuffer recBuff) throws handle.addEntry(Unpooled.wrappedBuffer(recBuff)); } } catch (NoLedgerException nsle) { - if (LOG.isDebugEnabled()) { - LOG.debug("Skip replaying entries of ledger {} since it was deleted.", ledgerId); - } + log.debug() + .attr("ledgerId", ledgerId) + .log("Skip replaying entries of ledger since it was deleted."); } catch (BookieException be) { throw new IOException(be); } @@ -619,7 +628,7 @@ public void process(int journalVersion, long offset, ByteBuffer recBuff) throws replay(journal, scanner); } long elapsedTs = System.currentTimeMillis() - startTs; - LOG.info("Finished replaying journal in {} ms.", elapsedTs); + log.info().attr("elapsedMs", elapsedTs).log("Finished replaying journal"); } /** @@ -650,7 +659,10 @@ private void replay(Journal journal, JournalScanner scanner) throws IOException if (id == markedLog.getLogFileId()) { logPosition = markedLog.getLogFileOffset(); } - LOG.info("Replaying journal {} from position {}", id, logPosition); + log.info() + .attr("journalId", id) + .attr("logPosition", logPosition) + .log("Replaying journal"); long scanOffset = journal.scanJournal(id, logPosition, scanner, conf.isSkipReplayJournalInvalidRecord()); // Update LastLogMark after completely replaying journal // scanOffset will point to EOF position @@ -665,10 +677,10 @@ public synchronized void start() { bookieThread.setDaemon(true); ThreadRegistry.register("BookieThread", true); - if (LOG.isDebugEnabled()) { - LOG.debug("I'm starting a bookie with journal directories {}", - journalDirectories.stream().map(File::getName).collect(Collectors.joining(", "))); - } + log.debug(e -> e + .attr("journals", journalDirectories.stream() + .map(File::getName).collect(Collectors.joining(", "))) + .log("I'm starting a bookie")); //Start DiskChecker thread dirsMonitor.start(); @@ -676,7 +688,7 @@ public synchronized void start() { try { readJournal(); } catch (IOException | BookieException ioe) { - LOG.error("Exception while replaying journals, shutting down", ioe); + log.error().exception(ioe).log("Exception while replaying journals, shutting down"); shutdown(ExitCode.BOOKIE_EXCEPTION); return; } @@ -685,36 +697,39 @@ public synchronized void start() { try { syncThread.requestFlush().get(); } catch (InterruptedException e) { - LOG.warn("Interrupting the fully flush after replaying journals : ", e); + log.warn().exception(e).log("Interrupting the fully flush after replaying journals"); Thread.currentThread().interrupt(); } catch (ExecutionException e) { - LOG.error("Error on executing a fully flush after replaying journals."); + log.error("Error on executing a fully flush after replaying journals."); shutdown(ExitCode.BOOKIE_EXCEPTION); return; } if (conf.isLocalConsistencyCheckOnStartup()) { - LOG.info("Running local consistency check on startup prior to accepting IO."); + log.info("Running local consistency check on startup prior to accepting IO."); List errors = null; try { errors = ledgerStorage.localConsistencyCheck(Optional.empty()); } catch (IOException e) { - LOG.error("Got a fatal exception while checking store", e); + log.error().exception(e).log("Got a fatal exception while checking store"); shutdown(ExitCode.BOOKIE_EXCEPTION); return; } if (errors != null && errors.size() > 0) { - LOG.error("Bookie failed local consistency check:"); + log.error("Bookie failed local consistency check:"); for (LedgerStorage.DetectedInconsistency error : errors) { - LOG.error("Ledger {}, entry {}: ", error.getLedgerId(), error.getEntryId(), error.getException()); + log.error() + .exception(error.getException()) + .attr("ledgerId", error.getLedgerId()) + .attr("entryId", error.getEntryId()) + .log("Consistency check"); } shutdown(ExitCode.BOOKIE_EXCEPTION); return; } } - LOG.info("Finished reading journal, starting bookie"); - + log.info("Finished reading journal, starting bookie"); /* * start sync thread first, so during replaying journals, we could do @@ -743,7 +758,7 @@ public synchronized void start() { try { stateManager.registerBookie(true).get(); } catch (Exception e) { - LOG.error("Couldn't register bookie with zookeeper, shutting down : ", e); + log.error().exception(e).log("Couldn't register bookie with metadata store, shutting down"); shutdown(ExitCode.ZK_REG_FAIL); } } @@ -784,7 +799,7 @@ public void allDisksFull(boolean highPriorityWritesAllowed) { @Override public void fatalError() { - LOG.error("Fatal error reported by ledgerDirsManager"); + log.error("Fatal error reported by ledgerDirsManager"); triggerBookieShutdown(ExitCode.BOOKIE_EXCEPTION); } @@ -860,8 +875,10 @@ void triggerBookieShutdown(final int exitCode) { if (!shutdownTriggered.compareAndSet(false, true)) { return; } - LOG.info("Triggering shutdown of Bookie-{} with exitCode {}", - conf.getBookiePort(), exitCode); + log.info() + .attr("bookiePort", conf.getBookiePort()) + .attr("exitCode", exitCode) + .log("Triggering shutdown of Bookie"); BookieThread th = new BookieThread("BookieShutdownTrigger") { @Override public void run() { @@ -884,8 +901,10 @@ int shutdown(int exitCode) { try { if (isRunning()) { // the exitCode only set when first shutdown usually due to exception found - LOG.info("Shutting down Bookie-{} with exitCode {}", - conf.getBookiePort(), exitCode); + log.info() + .attr("bookiePort", conf.getBookiePort()) + .attr("exitCode", exitCode) + .log("Shutting down Bookie"); if (this.exitCode == ExitCode.OK) { this.exitCode = exitCode; } @@ -893,7 +912,7 @@ int shutdown(int exitCode) { stateManager.forceToShuttingDown(); // turn bookie to read only during shutting down process - LOG.info("Turning bookie to read only during shut down"); + log.info("Turning bookie to read only during shut down"); stateManager.forceToReadOnly(); // Shutdown Sync thread @@ -912,9 +931,9 @@ int shutdown(int exitCode) { } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted during shutting down bookie : ", ie); + log.error().exception(ie).log("Interrupted during shutting down bookie"); } catch (Exception e) { - LOG.error("Got Exception while trying to shutdown Bookie", e); + log.error().exception(e).log("Got Exception while trying to shutdown Bookie"); throw e; } finally { lock.unlock(); @@ -989,10 +1008,10 @@ private void addEntryInternal(LedgerDescriptor handle, ByteBuf entry, } return; } - - if (LOG.isTraceEnabled()) { - LOG.trace("Adding {}@{}", entryId, ledgerId); - } + log.trace() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Adding entry"); getJournal(ledgerId).logAddEntry(entry, ackBeforeSync, cb, ctx); } @@ -1081,9 +1100,7 @@ public ByteBuf getExplicitLac(long ledgerId) throws IOException, Bookie.NoLedger */ public void forceLedger(long ledgerId, WriteCallback cb, Object ctx) { - if (LOG.isTraceEnabled()) { - LOG.trace("Forcing ledger {}", ledgerId); - } + log.trace().attr("ledgerId", ledgerId).log("Forcing ledger"); Journal journal = getJournal(ledgerId); journal.forceLedger(ledgerId, cb, ctx); bookieStats.getForceLedgerOps().inc(); @@ -1146,9 +1163,10 @@ public ByteBuf readEntry(long ledgerId, long entryId) int entrySize = 0; try { LedgerDescriptor handle = handles.getReadOnlyHandle(ledgerId); - if (LOG.isTraceEnabled()) { - LOG.trace("Reading {}@{}", entryId, ledgerId); - } + log.trace() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Reading entry"); ByteBuf entry = handle.readEntry(entryId); entrySize = entry.readableBytes(); bookieStats.getReadBytes().addCount(entrySize); @@ -1226,16 +1244,16 @@ public static boolean format(ServerConfiguration conf, } if (!confirm) { - LOG.error("Bookie format aborted!!"); + log.error("Bookie format aborted!!"); return false; } } catch (IOException e) { - LOG.error("Error during bookie format", e); + log.error().exception(e).log("Error during bookie format"); return false; } } if (!cleanDir(journalDir)) { - LOG.error("Formatting journal directory failed"); + log.error("Formatting journal directory failed"); return false; } } @@ -1243,7 +1261,7 @@ public static boolean format(ServerConfiguration conf, File[] ledgerDirs = conf.getLedgerDirs(); for (File dir : ledgerDirs) { if (!cleanDir(dir)) { - LOG.error("Formatting ledger directory " + dir + " failed"); + log.error().attr("directory", dir).log("Formatting ledger directory failed"); return false; } } @@ -1253,7 +1271,7 @@ public static boolean format(ServerConfiguration conf, if (null != indexDirs) { for (File dir : indexDirs) { if (!cleanDir(dir)) { - LOG.error("Formatting index directory " + dir + " failed"); + log.error().attr("directory", dir).log("Formatting index directory failed"); return false; } } @@ -1264,11 +1282,11 @@ public static boolean format(ServerConfiguration conf, if (!Strings.isNullOrEmpty(conf.getGcEntryLogMetadataCachePath())) { File metadataDir = new File(conf.getGcEntryLogMetadataCachePath()); if (!cleanDir(metadataDir)) { - LOG.error("Formatting ledger metadata directory {} failed", metadataDir); + log.error().attr("metadataDir", metadataDir).log("Formatting ledger metadata directory failed"); return false; } } - LOG.info("Bookie format completed successfully"); + log.info("Bookie format completed successfully"); return true; } @@ -1279,13 +1297,13 @@ private static boolean cleanDir(File dir) { for (File child : files) { boolean delete = FileUtils.deleteQuietly(child); if (!delete) { - LOG.error("Not able to delete " + child); + log.error().attr("file", child).log("Not able to delete file"); return false; } } } } else if (!dir.mkdirs()) { - LOG.error("Not able to create the directory " + dir); + log.error().attr("directory", dir).log("Not able to create the directory"); return false; } return true; @@ -1305,9 +1323,7 @@ public OfLong getListOfEntriesOfLedger(long ledgerId) throws IOException, NoLedg boolean success = false; try { LedgerDescriptor handle = handles.getReadOnlyHandle(ledgerId); - if (LOG.isTraceEnabled()) { - LOG.trace("GetEntriesOfLedger {}", ledgerId); - } + log.trace().attr("ledgerId", ledgerId).log("GetEntriesOfLedger"); OfLong entriesOfLedger = handle.getListOfEntriesOfLedger(ledgerId); success = true; return entriesOfLedger; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieResources.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieResources.java index d0cb05d43a0..919f95af6af 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieResources.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieResources.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import lombok.CustomLog; import org.apache.bookkeeper.common.allocator.ByteBufAllocatorBuilder; import org.apache.bookkeeper.common.allocator.ByteBufAllocatorWithOomHandler; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -33,14 +34,12 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.DiskChecker; import org.apache.commons.configuration2.ex.ConfigurationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Centralizes the creation of injected resources. */ +@CustomLog public class BookieResources { - private static final Logger log = LoggerFactory.getLogger(BookieResources.class); /** * Instantiate the metadata driver for the Bookie. @@ -102,7 +101,7 @@ public static LedgerStorage createLedgerStorage(ServerConfiguration conf, ByteBufAllocator allocator) throws IOException { // Instantiate the ledger storage implementation String ledgerStorageClass = conf.getLedgerStorageClass(); - log.info("Using ledger storage: {}", ledgerStorageClass); + log.info().attr("ledgerStorageClass", ledgerStorageClass).log("Using ledger storage"); LedgerStorage storage = LedgerStorageFactory.createLedgerStorage(ledgerStorageClass); storage.initialize(conf, ledgerManager, ledgerDirsManager, indexDirsManager, statsLogger, allocator); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java index d7d856a7de3..4a3ced37db2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.EntryLogger; import org.apache.bookkeeper.client.LedgerEntry; import org.apache.bookkeeper.client.api.LedgerMetadata; @@ -112,16 +113,13 @@ import org.apache.commons.configuration2.CompositeConfiguration; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Bookie Shell is to provide utilities for users to administer a bookkeeper cluster. */ +@CustomLog public class BookieShell implements Tool { - static final Logger LOG = LoggerFactory.getLogger(BookieShell.class); - static final String CONF_OPT = "conf"; static final String ENTRY_FORMATTER_OPT = "entryformat"; static final String LEDGERID_FORMATTER_OPT = "ledgeridformat"; @@ -253,7 +251,7 @@ public int runCmd(String[] args) throws Exception { } return runCmd(cmdLine); } catch (ParseException e) { - LOG.error("Error parsing command line arguments : ", e); + log.error().exception(e).log("Error parsing command line arguments"); printUsage(); return -1; } @@ -1184,7 +1182,7 @@ public int runCmd(CommandLine cmdLine) throws Exception { ReadLogMetadataCommand.ReadLogMetadataFlags flags = new ReadLogMetadataCommand.ReadLogMetadataFlags(); String[] leftArgs = cmdLine.getArgs(); if (leftArgs.length <= 0) { - LOG.error("ERROR: missing entry log id or entry log file name"); + log.error("ERROR: missing entry log id or entry log file name"); printUsage(); return -1; } @@ -1350,7 +1348,7 @@ public int runCmd(CommandLine cmdLine) throws Exception { } if (passedCommands != 1) { - LOG.error("One and only one of -readwrite, -readonly and -all must be specified"); + log.error("One and only one of -readwrite, -readonly and -all must be specified"); printUsage(); return 1; } @@ -1746,7 +1744,7 @@ int runCmd(CommandLine cmdLine) throws Exception { AdminCommand.AdminFlags flags = new AdminCommand.AdminFlags(); Option[] options = cmdLine.getOptions(); if (options.length != 1) { - LOG.error("Invalid command!"); + log.error("Invalid command!"); this.printUsage(); return -1; } @@ -1754,12 +1752,12 @@ int runCmd(CommandLine cmdLine) throws Exception { if (thisCommandOption.getLongOpt().equals(BOOKIEID)) { final String bookieId = cmdLine.getOptionValue(BOOKIEID); if (StringUtils.isBlank(bookieId)) { - LOG.error("Invalid argument list!"); + log.error("Invalid argument list!"); this.printUsage(); return -1; } if (!StringUtils.equals(bookieId, HOSTNAME) && !StringUtils.equals(bookieId, IP)) { - LOG.error("Invalid option value:" + bookieId); + log.error().attr("bookieId", bookieId).log("Invalid option value"); this.printUsage(); return -1; } @@ -1838,12 +1836,12 @@ int runCmd(CommandLine cmdLine) throws Exception { final String bookieId = cmdLine.getOptionValue("bookieId"); if (StringUtils.isBlank(bookieId)) { - LOG.error("Invalid argument list!"); + log.error("Invalid argument list!"); this.printUsage(); return -1; } if (!StringUtils.equals(bookieId, "hostname") && !StringUtils.equals(bookieId, "ip")) { - LOG.error("Invalid option value {} for bookieId, expected hostname/ip", bookieId); + log.error().attr("bookieId", bookieId).log("Invalid option value for bookieId, expected hostname/ip"); this.printUsage(); return -1; } @@ -1855,7 +1853,7 @@ int runCmd(CommandLine cmdLine) throws Exception { final long printprogress; if (!verbose) { if (cmdLine.hasOption("printprogress")) { - LOG.warn("Ignoring option 'printprogress', this is applicable when 'verbose' is true"); + log.warn("Ignoring option 'printprogress', this is applicable when 'verbose' is true"); } printprogress = Integer.MIN_VALUE; } else { @@ -1937,12 +1935,12 @@ int runCmd(CommandLine cmdLine) throws Exception { final String srcBookie = cmdLine.getOptionValue("srcBookie"); final String destBookie = cmdLine.getOptionValue("destBookie"); if (StringUtils.isBlank(srcBookie) || StringUtils.isBlank(destBookie)) { - LOG.error("Invalid argument list (srcBookie and destBookie must be provided)!"); + log.error("Invalid argument list (srcBookie and destBookie must be provided)!"); this.printUsage(); return -1; } if (StringUtils.equals(srcBookie, destBookie)) { - LOG.error("srcBookie and destBookie can't be the same."); + log.error("srcBookie and destBookie can't be the same."); return -1; } final int rate = getOptionIntValue(cmdLine, "updatespersec", 5); @@ -1952,7 +1950,7 @@ int runCmd(CommandLine cmdLine) throws Exception { final long printprogress; if (!verbose) { if (cmdLine.hasOption("printprogress")) { - LOG.warn("Ignoring option 'printprogress', this is applicable when 'verbose' is true"); + log.warn("Ignoring option 'printprogress', this is applicable when 'verbose' is true"); } printprogress = Integer.MIN_VALUE; } else { @@ -2141,26 +2139,26 @@ int runCmd(CommandLine cmdLine) throws Exception { // Arbitrary value of 21 days chosen since current freq of all checks is less than 21 days long time = System.currentTimeMillis() - (21 * 24 * 60 * 60 * 1000); if (checkAllLedgersCheck) { - LOG.info("Resetting CheckAllLedgersCTime to : " + new Timestamp(time)); + log.info().attr("time", new Timestamp(time)).log("Resetting CheckAllLedgersCTime"); underreplicationManager.setCheckAllLedgersCTime(time); } if (placementPolicyCheck) { - LOG.info("Resetting PlacementPolicyCheckCTime to : " + new Timestamp(time)); + log.info().attr("time", new Timestamp(time)).log("Resetting PlacementPolicyCheckCTime"); underreplicationManager.setPlacementPolicyCheckCTime(time); } if (replicasCheck) { - LOG.info("Resetting ReplicasCheckCTime to : " + new Timestamp(time)); + log.info().attr("time", new Timestamp(time)).log("Resetting ReplicasCheckCTime"); underreplicationManager.setReplicasCheckCTime(time); } } } catch (InterruptedException | ReplicationException e) { - LOG.error("Exception while trying to reset last run time ", e); + log.error().exception(e).log("Exception while trying to reset last run time "); return -1; } return 0; }); } else { - LOG.error("Command line args must contain atleast one type of check. This was a no-op."); + log.error("Command line args must contain atleast one type of check. This was a no-op."); return -1; } return 0; @@ -2249,7 +2247,7 @@ public int runCmd(CommandLine cmdLine) throws Exception { final String bookieId = cmdLine.getOptionValue("bookieid"); flags.bookie(bookieId); if (StringUtils.isBlank(bookieId)) { - LOG.error("Invalid argument list!"); + log.error("Invalid argument list!"); this.printUsage(); return -1; } @@ -2753,9 +2751,7 @@ public static void main(String[] argv) { } else { shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(shell.bkConf); } - if (LOG.isDebugEnabled()) { - LOG.debug("Using ledgerIdFormatter {}", shell.ledgerIdFormatter.getClass()); - } + log.debug().attr("class", shell.ledgerIdFormatter.getClass()).log("Using ledgerIdFormatter"); // entry format if (cmdLine.hasOption(ENTRY_FORMATTER_OPT)) { @@ -2764,13 +2760,11 @@ public static void main(String[] argv) { } else { shell.entryFormatter = EntryFormatter.newEntryFormatter(shell.bkConf); } - if (LOG.isDebugEnabled()) { - LOG.debug("Using entry formatter {}", shell.entryFormatter.getClass()); - } + log.debug().attr("class", shell.entryFormatter.getClass()).log("Using entry formatter"); res = shell.run(cmdLine.getArgs()); } catch (Throwable e) { - LOG.error("Got an exception", e); + log.error().exception(e).log("Got an exception"); } finally { System.exit(res); } @@ -2788,12 +2782,17 @@ private synchronized void initEntryLogger() throws IOException { /// protected void printEntryLogMetadata(long logId) throws IOException { - LOG.info("Print entryLogMetadata of entrylog {} ({}.log)", logId, Long.toHexString(logId)); + log.info() + .attr("logId", logId) + .attr("logFile", Long.toHexString(logId) + ".log") + .log("Print entryLogMetadata of entrylog"); initEntryLogger(); EntryLogMetadata entryLogMetadata = entryLogger.getEntryLogMetadata(logId); entryLogMetadata.getLedgersMap().forEach((ledgerId, size) -> { - LOG.info("--------- Lid={}, TotalSizeOfEntriesOfLedger={} ---------", - ledgerIdFormatter.formatLedgerId(ledgerId), size); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)) + .attr("size", size) + .log("--------- Size per ledger in the entrylog ---------"); }); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java index 790cc5f32a4..6b667b58986 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java @@ -41,7 +41,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.discover.BookieServiceInfo; import org.apache.bookkeeper.discover.RegistrationManager; @@ -52,21 +52,18 @@ import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.bookkeeper.tools.cli.commands.bookie.SanityTestCommand; import org.apache.bookkeeper.util.DiskChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * An implementation of StateManager. */ -@Slf4j +@CustomLog @StatsDoc( name = BOOKIE_SCOPE, category = CATEGORY_SERVER, help = "Bookie state manager related stats" ) public class BookieStateManager implements StateManager { - private static final Logger LOG = LoggerFactory.getLogger(BookieStateManager.class); private final ServerConfiguration conf; private final Supplier bookieServiceInfoProvider; private final List statusDirs; @@ -283,7 +280,7 @@ public Void call() throws IOException { if (throwException) { throw ioe; } else { - LOG.error("Couldn't register bookie with zookeeper, shutting down : ", ioe); + log.error().exception(ioe).log("Couldn't register bookie with zookeeper, shutting down"); shutdownHandler.shutdown(ExitCode.ZK_REG_FAIL); } } @@ -321,7 +318,7 @@ void doRegisterBookie() throws IOException { private void doRegisterBookie(boolean isReadOnly) throws IOException { if (isRegistrationManagerDisabled()) { // registration manager is null, means not register itself to metadata store. - LOG.info("null registration manager while do register"); + log.info("null registration manager while do register"); return; } @@ -344,7 +341,7 @@ public void doTransitionToWritableMode(boolean isManuallyModify) { return; } if (!isManuallyModify && bookieStatus.isInReadOnlyMode() && bookieStatus.isManuallyModifiedToReadOnly()) { - LOG.info("Skip to transition Bookie to Writable mode automatically because it is manually set to read-only" + log.info("Skip to transition Bookie to Writable mode automatically because it is manually set to read-only" + " mode, which can only be changed manually."); return; } @@ -353,7 +350,7 @@ public void doTransitionToWritableMode(boolean isManuallyModify) { // do nothing if already in writable mode return; } - LOG.info("Transitioning Bookie to Writable mode and will serve read/write requests."); + log.info("Transitioning Bookie to Writable mode and will serve read/write requests."); if (conf.isPersistBookieStatusEnabled()) { bookieStatus.writeToDirectories(statusDirs); } @@ -364,7 +361,7 @@ public void doTransitionToWritableMode(boolean isManuallyModify) { try { doRegisterBookie(false); } catch (IOException e) { - LOG.warn("Error in transitioning back to writable mode : ", e); + log.warn().exception(e).log("Error in transitioning back to writable mode"); transitionToReadOnlyMode(); return; } @@ -374,7 +371,7 @@ public void doTransitionToWritableMode(boolean isManuallyModify) { } catch (BookieException e) { // if we failed when deleting the readonly flag in zookeeper, it is OK since client would // already see the bookie in writable list. so just log the exception - LOG.warn("Failed to delete bookie readonly state in zookeeper : ", e); + log.warn().exception(e).log("Failed to delete bookie readonly state in zookeeper"); return; } } @@ -392,15 +389,13 @@ public void doTransitionToReadOnlyMode(boolean isManuallyModify) { return; } if (!conf.isReadOnlyModeEnabled()) { - LOG.warn("ReadOnly mode is not enabled. " - + "Can be enabled by configuring " - + "'readOnlyModeEnabled=true' in configuration." + log.warn("ReadOnly mode is not enabled." + + " Can be enabled by configuring 'readOnlyModeEnabled=true' in configuration." + " Shutting down bookie"); shutdownHandler.shutdown(ExitCode.BOOKIE_EXCEPTION); return; } - LOG.info("Transitioning Bookie to ReadOnly mode," - + " and will serve only read requests from clients!"); + log.info("Transitioning Bookie to ReadOnly mode, and will serve only read requests from clients!"); // persist the bookie status if we enable this if (conf.isPersistBookieStatusEnabled()) { this.bookieStatus.writeToDirectories(statusDirs); @@ -412,8 +407,7 @@ public void doTransitionToReadOnlyMode(boolean isManuallyModify) { try { rm.registerBookie(bookieIdSupplier.get(), true, bookieServiceInfoProvider.get()); } catch (BookieException e) { - LOG.error("Error in transition to ReadOnly Mode." - + " Shutting down", e); + log.error().exception(e).log("Error in transition to ReadOnly Mode. Shutting down"); shutdownHandler.shutdown(ExitCode.BOOKIE_EXCEPTION); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStatus.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStatus.java index ccbba36b532..988bcadb5b4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStatus.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStatus.java @@ -31,17 +31,15 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.List; +import lombok.CustomLog; import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * The status object represents the current status of a bookie instance. */ +@CustomLog public class BookieStatus { - private static final Logger LOG = LoggerFactory.getLogger(BookieStatus.class); - static final int CURRENT_STATUS_LAYOUT_VERSION = 1; enum BookieMode { @@ -109,14 +107,14 @@ synchronized void writeToDirectories(List directories) { writeToFile(statusFile, toString()); success = true; } catch (IOException e) { - LOG.warn("IOException while trying to write bookie status to directory {}." - + " This is fine if not all directories are failed.", dir); + log.warn().attr("directory", dir).log("IOException while trying to write bookie status to directory." + + " This is fine if not all directories are failed."); } } if (success) { - LOG.info("Successfully persist bookie status {}", this.bookieMode); + log.info().attr("bookieMode", this.bookieMode).log("Successfully persist bookie status"); } else { - LOG.warn("Failed to persist bookie status {}", this.bookieMode); + log.warn().attr("bookieMode", this.bookieMode).log("Failed to persist bookie status"); } } @@ -158,18 +156,18 @@ void readFromDirectories(List directories) { } } } catch (IOException e) { - LOG.warn("IOException while trying to read bookie status from directory {}." - + " This is fine if not all directories failed.", dir); + log.warn().attr("directory", dir).log("IOException while trying to read bookie status from directory." + + " This is fine if not all directories failed."); } catch (IllegalArgumentException e) { - LOG.warn("IllegalArgumentException while trying to read bookie status from directory {}." - + " This is fine if not all directories failed.", dir); + log.warn().attr("directory", dir).log("IllegalArgumentException while trying to read bookie status" + + " from directory. This is fine if not all directories failed."); } } if (success) { - LOG.info("Successfully retrieve bookie status {} from disks.", getBookieMode()); + log.info().attr("bookieMode", getBookieMode()).log("Successfully retrieve bookie status from disks."); } else { - LOG.warn("Failed to retrieve bookie status from disks." - + " Fall back to current or default bookie status: {}", getBookieMode()); + log.warn().attr("bookieMode", getBookieMode()).log("Failed to retrieve bookie status from disks." + + " Fall back to current or default bookie status"); } } @@ -205,16 +203,12 @@ public BookieStatus parse(BufferedReader reader) BookieStatus status = new BookieStatus(); String line = reader.readLine(); if (line == null || line.trim().isEmpty()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Empty line when parsing bookie status"); - } + log.debug("Empty line when parsing bookie status"); return null; } String[] parts = line.split(","); if (parts.length == 0) { - if (LOG.isDebugEnabled()) { - LOG.debug("Error in parsing bookie status: {}", line); - } + log.debug().attr("line", line).log("Error in parsing bookie status"); return null; } synchronized (status) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieThread.java index e35db7b68ed..5d21ddcf5c7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieThread.java @@ -18,20 +18,17 @@ package org.apache.bookkeeper.bookie; import io.netty.util.concurrent.FastThreadLocalThread; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * Wrapper that wraps bookie threads. * Any common handing that we require for all bookie threads * should be implemented here */ +@CustomLog public class BookieThread extends FastThreadLocalThread implements Thread.UncaughtExceptionHandler { - private static final Logger LOG = LoggerFactory - .getLogger(BookieThread.class); - @Override public void uncaughtException(Thread t, Throwable e) { handleException(t, e); @@ -51,6 +48,9 @@ public BookieThread(Runnable thread, String name) { * Handles uncaught exception occurred in thread. */ protected void handleException(Thread t, Throwable e) { - LOG.error("Uncaught exception in thread {}", t.getName(), e); + log.error() + .exception(e) + .attr("thread", t.getName()) + .log("Uncaught exception in thread"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Cookie.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Cookie.java index d7502a54b69..b6a8795a6a4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Cookie.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Cookie.java @@ -40,6 +40,7 @@ import java.net.UnknownHostException; import java.util.Objects; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException.InvalidCookieException; import org.apache.bookkeeper.bookie.BookieException.UnknownBookieIdException; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -51,8 +52,6 @@ import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * When a bookie starts for the first time it generates a cookie, and stores @@ -66,8 +65,8 @@ * but the bookie would be up, so the client would think that everything is ok * with the cluster. It's better to fail early and obviously. */ +@CustomLog public class Cookie { - private static final Logger LOG = LoggerFactory.getLogger(Cookie.class); static final int CURRENT_COOKIE_LAYOUT_VERSION = 5; private final int layoutVersion; @@ -153,7 +152,7 @@ private void verifyInternal(Cookie c, boolean checkIfSuperSet) throws BookieExce String errMsg; if (c.layoutVersion < 3 && c.layoutVersion != layoutVersion) { errMsg = "Cookie is of too old version " + c.layoutVersion; - LOG.error(errMsg); + log.error(errMsg); throw new BookieException.InvalidCookieException(errMsg); } else if (!(c.layoutVersion >= 3 && c.bookieId.equals(bookieId) && c.journalDirs.equals(journalDirs) && verifyLedgerDirs(c, checkIfSuperSet) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/DefaultEntryLogger.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/DefaultEntryLogger.java index 2696aee3c94..3bfc0d8d377 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/DefaultEntryLogger.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/DefaultEntryLogger.java @@ -57,6 +57,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.regex.Pattern; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.CompactionEntryLog; import org.apache.bookkeeper.bookie.storage.EntryLogScanner; import org.apache.bookkeeper.bookie.storage.EntryLogger; @@ -70,8 +71,6 @@ import org.apache.bookkeeper.util.collections.ConcurrentLongLongHashMap; import org.apache.bookkeeper.util.collections.ConcurrentLongLongHashMap.BiConsumerLong; import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class manages the writing of the bookkeeper entries. All the new @@ -80,8 +79,8 @@ * the actual ledger entry. The entry log files created by this class are * identified by a long. */ +@CustomLog public class DefaultEntryLogger implements EntryLogger { - private static final Logger LOG = LoggerFactory.getLogger(DefaultEntryLogger.class); @VisibleForTesting static final int UNINITIALIZED_LOG_ID = -0xDEAD; @@ -337,8 +336,10 @@ public DefaultEntryLogger(ServerConfiguration conf, long lastLogFileFromFile = getLastLogIdFromFile(dir); long lastLogIdInDir = getLastLogIdInDir(dir); if (lastLogFileFromFile < lastLogIdInDir) { - LOG.info("The lastLogFileFromFile is {}, the lastLogIdInDir is {}, " - + "use lastLogIdInDir as the lastLogId.", lastLogFileFromFile, lastLogIdInDir); + log.info() + .attr("lastLogFileFromFile", lastLogFileFromFile) + .attr("lastLogIdInDir", lastLogIdInDir) + .log("Using lastLogIdInDir as the lastLogId"); lastLogId = lastLogIdInDir; } else { lastLogId = lastLogFileFromFile; @@ -440,7 +441,7 @@ public void removeFromChannelsAndClose(long logId) { try { fileChannel.close(); } catch (IOException e) { - LOG.warn("Exception while closing channel for log file:" + logId); + log.warn().attr("logId", logId).log("Exception while closing channel for log file"); } } } @@ -523,12 +524,11 @@ public boolean removeEntryLog(long entryLogId) { try { entryLogFile = findFile(entryLogId); } catch (FileNotFoundException e) { - LOG.error("Trying to delete an entryLog file that could not be found: " - + entryLogId + ".log"); + log.error().attr("entryLogId", entryLogId).log("Trying to delete an entryLog file that could not be found"); return true; } if (!entryLogFile.delete()) { - LOG.warn("Could not delete entry log file {}", entryLogFile); + log.warn().attr("entryLogFile", entryLogFile).log("Could not delete entry log file"); return false; } return true; @@ -649,9 +649,10 @@ private void flushCompactionLog() throws IOException { if (compactionLogChannel != null) { compactionLogChannel.appendLedgersMap(); compactionLogChannel.flushAndForceWrite(false); - LOG.info("Flushed compaction log file {} with logId {}.", - compactionLogChannel.getLogFile(), - compactionLogChannel.getLogId()); + log.info() + .attr("logFile", compactionLogChannel.getLogFile()) + .attr("logId", compactionLogChannel.getLogId()) + .log("Flushed compaction log file"); // since this channel is only used for writing, after flushing the channel, // we had to close the underlying file channel. Otherwise, we might end up // leaking fds which cause the disk spaces could not be reclaimed. @@ -678,14 +679,18 @@ private void removeCurCompactionLog() { synchronized (compactionLogLock) { if (compactionLogChannel != null) { if (compactionLogChannel.getLogFile().exists() && !compactionLogChannel.getLogFile().delete()) { - LOG.warn("Could not delete compaction log file {}", compactionLogChannel.getLogFile()); + log.warn() + .attr("logFile", compactionLogChannel.getLogFile()) + .log("Could not delete compaction log file"); } try { compactionLogChannel.close(); } catch (IOException e) { - LOG.error("Failed to close file channel for compaction log {}", compactionLogChannel.getLogId(), - e); + log.error() + .exception(e) + .attr("logId", compactionLogChannel.getLogId()) + .log("Failed to close file channel for compaction log"); } compactionLogChannel = null; } @@ -696,12 +701,10 @@ static long logIdForOffset(long offset) { return offset >> 32L; } - static long posForOffset(long location) { return location & 0xffffffffL; } - /** * Exception type for representing lookup errors. Useful for disambiguating different error * conditions for reporting purposes. @@ -809,11 +812,14 @@ private void validateEntry(long ledgerId, long entryId, long entryLogId, long po // entrySize does not include the ledgerId if (entrySize > maxSaneEntrySize) { - LOG.warn("Sanity check failed for entry size of " + entrySize + " at location " + pos + " in " - + entryLogId); + log.warn() + .attr("entrySize", entrySize) + .attr("position", pos) + .attr("entryLogId", entryLogId) + .log("Sanity check failed for entry size"); } if (entrySize < MIN_SANE_ENTRY_SIZE) { - LOG.error("Read invalid entry length {}", entrySize); + log.error().attr("entrySize", entrySize).log("Read invalid entry length"); throw new EntryLookupException.InvalidEntryLengthException(ledgerId, entryId, entryLogId, pos); } @@ -836,13 +842,11 @@ public ByteBuf readEntry(long location) throws IOException, Bookie.NoEntryExcept return internalReadEntry(-1L, -1L, location, false /* validateEntry */); } - private ByteBuf internalReadEntry(long ledgerId, long entryId, long location, boolean validateEntry) throws IOException, Bookie.NoEntryException { long entryLogId = logIdForOffset(location); long pos = posForOffset(location); - BufferedReadChannel fc = null; int entrySize = -1; try { @@ -887,7 +891,10 @@ private Header getHeaderForLogId(long entryLogId) throws IOException { int headerVersion = headers.readInt(); if (headerVersion < HEADER_V0 || headerVersion > HEADER_CURRENT_VERSION) { - LOG.info("Unknown entry log header version for log {}: {}", entryLogId, headerVersion); + log.info() + .attr("entryLogId", entryLogId) + .attr("headerVersion", headerVersion) + .log("Unknown entry log header version"); } long ledgersMapOffset = headers.readLong(); @@ -993,7 +1000,7 @@ public void scanEntryLog(long entryLogId, EntryLogScanner scanner) throws IOExce try { bc = getChannelForLogId(entryLogId); } catch (IOException e) { - LOG.warn("Failed to get channel to scan entry log: " + entryLogId + ".log"); + log.warn().attr("entryLogId", entryLogId).log("Failed to get channel to scan entry log"); throw e; } // Start the read position in the current entry log file to be after @@ -1012,7 +1019,7 @@ public void scanEntryLog(long entryLogId, EntryLogScanner scanner) throws IOExce break; } if (readFromLogChannel(entryLogId, bc, headerBuffer, pos) != headerBuffer.capacity()) { - LOG.warn("Short read for entry size from entrylog {}", entryLogId); + log.warn().attr("entryLogId", entryLogId).log("Short read for entry size from entrylog"); return; } long offset = pos; @@ -1037,8 +1044,12 @@ public void scanEntryLog(long entryLogId, EntryLogScanner scanner) throws IOExce data.capacity(entrySize); int rc = readFromLogChannel(entryLogId, bc, data, pos); if (rc != entrySize) { - LOG.warn("Short read for ledger entry from entryLog {}@{} ({} != {})", - entryLogId, pos, rc, entrySize); + log.warn() + .attr("entryLogId", entryLogId) + .attr("pos", pos) + .attr("rc", rc) + .attr("entrySize", entrySize) + .log("Short read for ledger entry from entryLog"); return; } // process the entry @@ -1059,10 +1070,16 @@ public EntryLogMetadata getEntryLogMetadata(long entryLogId, AbstractLogCompacto try { return extractEntryLogMetadataFromIndex(entryLogId); } catch (FileNotFoundException fne) { - LOG.warn("Cannot find entry log file {}.log : {}", Long.toHexString(entryLogId), fne.getMessage()); + log.warn() + .attr("entryLog", Long.toHexString(entryLogId) + ".log") + .exceptionMessage(fne) + .log("Cannot find entry log file"); throw fne; } catch (Throwable e) { - LOG.info("Failed to get ledgers map index from: {}.log : {}", entryLogId, e.getMessage()); + log.info() + .attr("entryLogId", entryLogId) + .exceptionMessage(e) + .log("Failed to get ledgers map index"); // Fall-back to scanning return extractEntryLogMetadataByScanning(entryLogId, throttler); @@ -1080,10 +1097,10 @@ EntryLogMetadata extractEntryLogMetadataFromIndex(long entryLogId) throws IOExce // The index was not stored in the log file (possibly because the bookie crashed before flushing it) throw new IOException("No ledgers map index found on entryLogId " + entryLogId); } - - if (LOG.isDebugEnabled()) { - LOG.debug("Recovering ledgers maps for log {} at offset: {}", entryLogId, header.ledgersMapOffset); - } + log.debug() + .attr("entryLogId", entryLogId) + .attr("ledgersMapOffset", header.ledgersMapOffset) + .log("Recovering ledgers maps"); BufferedReadChannel bc = getChannelForLogId(entryLogId); @@ -1126,11 +1143,11 @@ EntryLogMetadata extractEntryLogMetadataFromIndex(long entryLogId) throws IOExce for (int i = 0; i < ledgersCount; i++) { long ledgerId = ledgersMap.readLong(); long size = ledgersMap.readLong(); - - if (LOG.isDebugEnabled()) { - LOG.debug("Recovering ledgers maps for log {} -- Found ledger: {} with size: {}", - entryLogId, ledgerId, size); - } + log.debug() + .attr("entryLogId", entryLogId) + .attr("ledgerId", ledgerId) + .attr("size", size) + .log("Recovering ledgers maps for log"); meta.addLedgerSize(ledgerId, size); } if (ledgersMap.isReadable()) { @@ -1179,10 +1196,10 @@ public boolean accept(long ledgerId) { return ledgerId >= 0; } }); - - if (LOG.isDebugEnabled()) { - LOG.debug("Retrieved entry log meta data entryLogId: {}, meta: {}", entryLogId, meta); - } + log.debug() + .attr("entryLogId", entryLogId) + .attr("meta", meta) + .log("Retrieved entry log meta data"); return meta; } @@ -1192,7 +1209,7 @@ public boolean accept(long ledgerId) { @Override public void close() { // since logChannel is buffered channel, do flush when shutting down - LOG.info("Stopping EntryLogger"); + log.info("Stopping EntryLogger"); try { flush(); for (FileChannel fc : logid2FileChannel.values()) { @@ -1209,15 +1226,17 @@ public void close() { } } catch (IOException ie) { // we have no idea how to avoid io exception during shutting down, so just ignore it - LOG.error("Error flush entry log during shutting down, which may cause entry log corrupted.", ie); + log.error() + .exception(ie) + .log("Error flush entry log during shutting down, which may cause entry log corrupted."); } finally { for (FileChannel fc : logid2FileChannel.values()) { - IOUtils.close(LOG, fc); + IOUtils.close(log, fc); } entryLogManager.forceClose(); synchronized (compactionLogLock) { - IOUtils.close(LOG, compactionLogChannel); + IOUtils.close(log, compactionLogChannel); } } // shutdown the pre-allocation thread @@ -1238,7 +1257,10 @@ static long fileName2LogId(String fileName) { try { return Long.parseLong(fileName, 16); } catch (Exception nfe) { - LOG.error("Invalid log file name {} found when trying to convert to logId.", fileName, nfe); + log.error() + .exception(nfe) + .attr("fileName", fileName) + .log("Invalid log file name found when trying to convert to logId."); } return INVALID_LID; } @@ -1340,7 +1362,7 @@ public void abort() { removeCurCompactionLog(); if (compactedLogFile.exists()) { if (!compactedLogFile.delete()) { - LOG.warn("Could not delete file: {}", compactedLogFile); + log.warn().attr("compactedLogFile", compactedLogFile).log("Could not delete file"); } } } @@ -1367,12 +1389,12 @@ public void makeAvailable() throws IOException { public void finalizeAndCleanup() { if (compactedLogFile.exists()) { if (!compactedLogFile.delete()) { - LOG.warn("Could not delete file: {}", compactedLogFile); + log.warn().attr("compactedLogFile", compactedLogFile).log("Could not delete file"); } } if (compactingLogFile.exists()) { if (!compactingLogFile.delete()) { - LOG.warn("Could not delete file: {}", compactingLogFile); + log.warn().attr("compactingLogFile", compactingLogFile).log("Could not delete file"); } } } @@ -1409,7 +1431,7 @@ public Collection incompleteCompactionLogs() { if (compactingPhaseFiles != null) { for (File file : compactingPhaseFiles) { if (file.delete()) { - LOG.info("Deleted failed compaction file {}", file); + log.info().attr("file", file).log("Deleted failed compaction file"); } } } @@ -1417,8 +1439,9 @@ public Collection incompleteCompactionLogs() { file -> file.getName().endsWith(TransactionalEntryLogCompactor.COMPACTED_SUFFIX)); if (compactedPhaseFiles != null) { for (File compactedFile : compactedPhaseFiles) { - LOG.info("Found compacted log file {} has partially flushed index, recovering index.", - compactedFile); + log.info() + .attr("compactedFile", compactedFile) + .log("Found compacted log file has partially flushed index, recovering index."); File compactingLogFile = new File(compactedFile.getParentFile(), "doesntexist"); long compactionLogId = -1L; @@ -1437,9 +1460,13 @@ public Collection incompleteCompactionLogs() { } if (!valid) { - LOG.info("Invalid compacted file found ({}), deleting", compactedFile); + log.info() + .attr("compactedFile", compactedFile) + .log("Invalid compacted file found (), deleting"); if (!compactedFile.delete()) { - LOG.warn("Couldn't delete invalid compacted file ({})", compactedFile); + log.warn() + .attr("compactedFile", compactedFile) + .log("Couldn't delete invalid compacted file"); } continue; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogCompactor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogCompactor.java index 81cd463761a..5063e0382f2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogCompactor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogCompactor.java @@ -25,19 +25,18 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.EntryLogScanner; import org.apache.bookkeeper.bookie.storage.EntryLogger; import org.apache.bookkeeper.conf.ServerConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the basic entry log compactor to compact entry logs. * The compaction is done by scanning the old entry log file, copy the active ledgers to the * current entry logger and remove the old entry log when the scan is over. */ +@CustomLog public class EntryLogCompactor extends AbstractLogCompactor { - private static final Logger LOG = LoggerFactory.getLogger(EntryLogCompactor.class); final CompactionScannerFactory scannerFactory = new CompactionScannerFactory(); final EntryLogger entryLogger; @@ -61,16 +60,16 @@ public boolean compact(EntryLogMetadata entryLogMeta) { entryLogger.scanEntryLog(entryLogMeta.getEntryLogId(), scannerFactory.newScanner(entryLogMeta)); scannerFactory.flush(); - LOG.info("Removing entry log {} after compaction", entryLogMeta.getEntryLogId()); + log.info().attr("entryLogId", entryLogMeta.getEntryLogId()).log("Removing entry log after compaction"); logRemovalListener.removeEntryLog(entryLogMeta.getEntryLogId()); } catch (LedgerDirsManager.NoWritableLedgerDirException nwlde) { - LOG.warn("No writable ledger directory available, aborting compaction", nwlde); + log.warn().exception(nwlde).log("No writable ledger directory available, aborting compaction"); return false; } catch (IOException ioe) { // if compact entry log throws IOException, we don't want to remove that // entry log. however, if some entries from that log have been re-added // to the entry log, and the offset updated, it's ok to flush that - LOG.error("Error compacting entry log. Log won't be deleted", ioe); + log.error().exception(ioe).log("Error compacting entry log. Log won't be deleted"); return false; } return true; @@ -108,9 +107,7 @@ public void process(final long ledgerId, long offset, ByteBuf entry) throws IOEx void flush() throws IOException { if (offsets.isEmpty()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Skipping entry log flushing, as there are no offset!"); - } + log.debug("Skipping entry log flushing, as there are no offset!"); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java index e997906c23c..9dc60f30146 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java @@ -30,13 +30,13 @@ import java.io.File; import java.io.IOException; import java.util.List; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.DefaultEntryLogger.BufferedLogChannel; import org.apache.bookkeeper.bookie.DefaultEntryLogger.EntryLogListener; import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException; import org.apache.bookkeeper.conf.ServerConfiguration; -@Slf4j +@CustomLog abstract class EntryLogManagerBase implements EntryLogManager { volatile List rotatedLogChannels; final EntryLoggerAllocator entryLoggerAllocator; @@ -126,9 +126,7 @@ public void flush() throws IOException { void flushLogChannel(BufferedLogChannel logChannel, boolean forceMetadata) throws IOException { if (logChannel != null) { logChannel.flushAndForceWrite(forceMetadata); - if (log.isDebugEnabled()) { - log.debug("Flush and sync current entry logger {}", logChannel.getLogId()); - } + log.debug().attr("logId", logChannel.getLogId()).log("Flush and sync current entry logger"); } } @@ -143,9 +141,12 @@ void createNewLog(long ledgerId) throws IOException { void createNewLog(long ledgerId, String reason) throws IOException { if (ledgerId != UNASSIGNED_LEDGERID) { - log.info("Creating a new entry log file for ledger '{}' {}", ledgerId, reason); + log.info() + .attr("ledgerId", ledgerId) + .attr("reason", reason) + .log("Creating a new entry log file for ledger"); } else { - log.info("Creating a new entry log file {}", reason); + log.info().attr("reason", reason).log("Creating a new entry log file"); } BufferedLogChannel logChannel = getCurrentLogForLedger(ledgerId); @@ -163,8 +164,10 @@ void createNewLog(long ledgerId, String reason) throws IOException { BufferedLogChannel newLogChannel = entryLoggerAllocator.createNewLog(selectDirForNextEntryLog()); entryLoggerAllocator.setWritingLogId(newLogChannel.getLogId()); setCurrentLogForLedgerAndAddToRotate(ledgerId, newLogChannel); - log.info("Flushing entry logger {} back to filesystem, pending for syncing entry loggers : {}.", - logChannel.getLogId(), rotatedLogChannels); + log.info() + .attr("logId", logChannel.getLogId()) + .attr("rotatedLogChannels", rotatedLogChannels) + .log("Flushing entry logger back to filesystem, pending for syncing entry loggers"); for (EntryLogListener listener : listeners) { listener.onRotateEntryLog(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java index ca6224ea83c..1b37b811f91 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java @@ -52,7 +52,7 @@ import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.DefaultEntryLogger.BufferedLogChannel; import org.apache.bookkeeper.bookie.LedgerDirsManager.LedgerDirsListener; import org.apache.bookkeeper.common.util.MathUtils; @@ -65,7 +65,7 @@ import org.apache.bookkeeper.util.collections.ConcurrentLongHashMap; import org.apache.commons.lang3.mutable.MutableInt; -@Slf4j +@CustomLog class EntryLogManagerForEntryLogPerLedger extends EntryLogManagerBase { static class BufferedLogChannelWithDirInfo { @@ -334,20 +334,23 @@ public void onRemoval( */ private void onCacheEntryRemoval(RemovalNotification removedLedgerEntryLogMapEntry) { Long ledgerId = removedLedgerEntryLogMapEntry.getKey(); - if (log.isDebugEnabled()) { - log.debug("LedgerId {} is being evicted from the cache map because of {}", ledgerId, - removedLedgerEntryLogMapEntry.getCause()); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("cause", removedLedgerEntryLogMapEntry.getCause()) + .log("LedgerId is being evicted from the cache map"); EntryLogAndLockTuple entryLogAndLockTuple = removedLedgerEntryLogMapEntry.getValue(); if (entryLogAndLockTuple == null) { - log.error("entryLogAndLockTuple is not supposed to be null in entry removal listener for ledger : {}", - ledgerId); + log.error() + .attr("ledgerId", ledgerId) + .log("entryLogAndLockTuple is not supposed to be null in entry removal listener for ledger"); return; } Lock lock = entryLogAndLockTuple.ledgerLock; BufferedLogChannelWithDirInfo logChannelWithDirInfo = entryLogAndLockTuple.getEntryLogWithDirInfo(); if (logChannelWithDirInfo == null) { - log.error("logChannel for ledger: {} is not supposed to be null in entry removal listener", ledgerId); + log.error() + .attr("ledgerId", ledgerId) + .log("logChannel for ledger: is not supposed to be null in entry removal listener"); return; } lock.lock(); @@ -357,7 +360,9 @@ private void onCacheEntryRemoval(RemovalNotification try { logChannel.appendLedgersMap(); } catch (Exception e) { - log.error("Got IOException while trying to appendLedgersMap in cacheEntryRemoval callback", e); + log.error() + .exception(e) + .log("Got IOException while trying to appendLedgersMap in cacheEntryRemoval callback"); } replicaOfCurrentLogChannels.remove(logChannel.getLogId()); rotatedLogChannels.add(logChannel); @@ -396,7 +401,10 @@ Lock getLock(long ledgerId) throws IOException { try { return ledgerIdEntryLogMap.get(ledgerId).getLedgerLock(); } catch (Exception e) { - log.error("Received unexpected exception while fetching lock to acquire for ledger: " + ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Received unexpected exception while fetching lock to acquire for ledger"); throw new IOException("Received unexpected exception while fetching lock to acquire", e); } } @@ -424,7 +432,10 @@ public void setCurrentLogForLedgerAndAddToRotate(long ledgerId, BufferedLogChann rotatedLogChannels.add(hasToRotateLogChannel); } } catch (Exception e) { - log.error("Received unexpected exception while fetching entry from map for ledger: " + ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Received unexpected exception while fetching entry from map"); throw new IOException("Received unexpected exception while fetching entry from map", e); } finally { lock.unlock(); @@ -448,7 +459,10 @@ public BufferedLogChannelWithDirInfo getCurrentLogWithDirInfoForLedger(long ledg EntryLogAndLockTuple entryLogAndLockTuple = ledgerIdEntryLogMap.get(ledgerId); return entryLogAndLockTuple.getEntryLogWithDirInfo(); } catch (Exception e) { - log.error("Received unexpected exception while fetching entry from map for ledger: " + ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Received unexpected exception while fetching entry from map"); throw new IOException("Received unexpected exception while fetching entry from map", e); } finally { lock.unlock(); @@ -512,7 +526,9 @@ public boolean commitEntryMemTableFlush() throws IOException { lock.lock(); try { if (reachEntryLogLimit(currentLog, 0L)) { - log.info("Rolling entry logger since it reached size limitation for ledger: {}", ledgerId); + log.info() + .attr("ledgerId", ledgerId) + .log("Rolling entry logger since it reached size limitation"); createNewLog(ledgerId, "after entry log file is rotated"); } } finally { @@ -690,7 +706,7 @@ public void flushRotatedLogs() throws IOException { channel.close(); recentlyCreatedEntryLogsStatus.flushRotatedEntryLog(channel.getLogId()); rotatedLogChannels.remove(channel); - log.info("Synced entry logger {} to disk.", channel.getLogId()); + log.info().attr("logId", channel.getLogId()).log("Synced entry logger to disk."); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForSingleEntryLog.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForSingleEntryLog.java index b7845118680..71f4f9d10ce 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForSingleEntryLog.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForSingleEntryLog.java @@ -32,13 +32,13 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.DefaultEntryLogger.BufferedLogChannel; import org.apache.bookkeeper.bookie.LedgerDirsManager.LedgerDirsListener; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.util.IOUtils; -@Slf4j +@CustomLog class EntryLogManagerForSingleEntryLog extends EntryLogManagerBase { private volatile BufferedLogChannel activeLogChannel; @@ -207,7 +207,7 @@ void flushRotatedLogs() throws IOException { // leaking fds which cause the disk spaces could not be reclaimed. channel.close(); recentlyCreatedEntryLogsStatus.flushRotatedEntryLog(channel.getLogId()); - log.info("Synced entry logger {} to disk.", channel.getLogId()); + log.info().attr("logId", channel.getLogId()).log("Synced entry logger to disk."); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java index fbabf59dff3..669d72e1094 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLoggerAllocator.java @@ -44,14 +44,14 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.DefaultEntryLogger.BufferedLogChannel; import org.apache.bookkeeper.conf.ServerConfiguration; /** * An allocator pre-allocates entry log files. */ -@Slf4j +@CustomLog class EntryLoggerAllocator { private long preallocatedLogId; @@ -174,8 +174,8 @@ private synchronized BufferedLogChannel allocateNewLog(File dirForNextEntryLog, for (File dir : ledgersDirs) { testLogFile = new File(dir, logFileName); if (testLogFile.exists()) { - log.warn("Found existed entry log " + testLogFile - + " when trying to create it as a new log."); + log.warn().attr("file", testLogFile) + .log("Found existing entry log when trying to create it as a new log."); testLogFile = null; break; } @@ -198,7 +198,10 @@ private synchronized BufferedLogChannel allocateNewLog(File dirForNextEntryLog, recentlyCreatedEntryLogsStatus.createdEntryLog(preallocatedLogId); } - log.info("Created new entry log file {} for logId {}.", newLogFile, preallocatedLogId); + log.info() + .attr("file", newLogFile) + .attr("logId", preallocatedLogId) + .log("Created new entry log file"); return logChannel; } @@ -237,7 +240,7 @@ void setLastLogId(File dir, long logId) throws IOException { try { bw.close(); } catch (IOException e) { - log.error("Could not close lastId file in {}", dir.getPath()); + log.error().attr("path", dir.getPath()).log("Could not close lastId file"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java index 197956b7540..444b78f9ada 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java @@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie.NoLedgerException; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; import org.apache.bookkeeper.bookie.stats.EntryMemTableStats; @@ -36,8 +37,6 @@ import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.IteratorUtility; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * The EntryMemTable holds in-memory representation to the entries not-yet flushed. @@ -45,8 +44,8 @@ * We continue to serve edits out of new EntrySkipList and backing snapshot until * flusher reports in that the flush succeeded. At that point we let the snapshot go. */ +@CustomLog public class EntryMemTable implements AutoCloseable{ - private static Logger logger = LoggerFactory.getLogger(EntryMemTable.class); /** * Entry skip list. */ @@ -144,10 +143,10 @@ public EntryMemTable(final ServerConfiguration conf, final CheckpointSource sour void dump() { for (EntryKey key: this.kvmap.keySet()) { - logger.info(key.toString()); + log.info(key.toString()); } for (EntryKey key: this.snapshot.keySet()) { - logger.info(key.toString()); + log.info(key.toString()); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTableWithParallelFlusher.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTableWithParallelFlusher.java index ed1a55735c2..a57c9a91226 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTableWithParallelFlusher.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTableWithParallelFlusher.java @@ -25,7 +25,7 @@ import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie.NoLedgerException; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; import org.apache.bookkeeper.common.util.OrderedExecutor; @@ -35,7 +35,7 @@ /** * EntryMemTableWithParallelFlusher. */ -@Slf4j +@CustomLog class EntryMemTableWithParallelFlusher extends EntryMemTable { final OrderedExecutor flushExecutor; @@ -101,7 +101,7 @@ long flushSnapshot(final SkipListFlusher flusher, Checkpoint checkpoint) throws } pendingNumOfLedgerFlushes.arriveAndDeregister(); } catch (Exception exc) { - log.error("Got Exception while trying to flush process entryies: ", exc); + log.error().exception(exc).log("Got Exception while trying to flush process entries"); exceptionWhileFlushingParallelly.set(exc); /* * if we get any unexpected exception while @@ -126,12 +126,12 @@ long flushSnapshot(final SkipListFlusher flusher, Checkpoint checkpoint) throws */ phaserTerminatedAbruptly = (pendingNumOfLedgerFlushes.arriveAndAwaitAdvance() < 0); } catch (IllegalStateException ise) { - log.error("Got IllegalStateException while awaiting on Phaser", ise); + log.error().exception(ise).log("Got IllegalStateException while awaiting on Phaser"); throw new IOException("Got IllegalStateException while awaiting on Phaser", ise); } if (phaserTerminatedAbruptly) { - log.error("Phaser is terminated while awaiting flushExecutor to complete the entry flushes", - exceptionWhileFlushingParallelly.get()); + log.error().exception(exceptionWhileFlushingParallelly.get()) + .log("Phaser is terminated while awaiting flushExecutor to complete the entry flushes"); throw new IOException("Failed to complete the flushSnapshotByParallelizing", exceptionWhileFlushingParallelly.get()); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java index 150697b822a..43fc68fbeaf 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java @@ -33,11 +33,10 @@ import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.Watchable; import org.apache.bookkeeper.common.util.Watcher; import org.apache.bookkeeper.proto.checksum.DigestManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the file handle for a ledger's index file that maps entry ids to location. @@ -59,8 +58,8 @@ * in entry loggers. *

*/ +@CustomLog class FileInfo extends Watchable { - private static final Logger LOG = LoggerFactory.getLogger(FileInfo.class); static final int NO_MASTER_KEY = -1; static final int STATE_FENCED_BIT = 0x1; @@ -127,9 +126,10 @@ long setLastAddConfirmed(long lac) { } lacToReturn = this.lac; } - if (LOG.isTraceEnabled()) { - LOG.trace("Updating LAC {} , {}", lacToReturn, lac); - } + log.trace() + .attr("currentLac", lacToReturn) + .attr("newLac", lac) + .log("Updating LAC"); if (changed) { notifyWatchers(LastAddConfirmedUpdateNotification.FUNC, lacToReturn); @@ -140,9 +140,10 @@ long setLastAddConfirmed(long lac) { synchronized boolean waitForLastAddConfirmedUpdate(long previousLAC, Watcher watcher) { if ((null != lac && lac > previousLAC) || isClosed) { - if (LOG.isTraceEnabled()) { - LOG.trace("Wait For LAC {} , {}", this.lac, previousLAC); - } + log.trace() + .attr("lac", this.lac) + .attr("previousLAC", previousLAC) + .log("Wait For LAC"); return false; } @@ -169,9 +170,7 @@ public long getSizeSinceLastWrite() { public ByteBuf getExplicitLac() { ByteBuf retLac = null; synchronized (this) { - if (LOG.isDebugEnabled()) { - LOG.debug("fileInfo:GetLac: {}", explicitLac); - } + log.debug().attr("explicitLac", explicitLac).log("fileInfo:GetLac"); if (explicitLac != null) { retLac = Unpooled.buffer(explicitLac.capacity()); explicitLac.rewind(); //copy from the beginning @@ -196,9 +195,7 @@ public void setExplicitLac(ByteBuf lac) { explicitLac.getLong(); explicitLacValue = explicitLac.getLong(); explicitLac.rewind(); - if (LOG.isDebugEnabled()) { - LOG.debug("fileInfo:SetLac: {}", explicitLac); - } + log.debug().attr("explicitLac", explicitLac).log("fileInfo:SetLac"); needFlushHeader = true; } setLastAddConfirmed(explicitLacValue); @@ -309,9 +306,12 @@ private synchronized void checkOpen(boolean create, boolean openBeforeClose) try { readHeader(); } catch (BufferUnderflowException buf) { - LOG.warn("Exception when reading header of {}.", lf, buf); + log.warn() + .exception(buf) + .attr("file", lf) + .log("Exception when reading header"); if (null != masterKey) { - LOG.warn("Attempting to write header of {} again.", lf); + log.warn().attr("file", lf).log("Attempting to write header again."); writeHeader(); } else { throw new IOException("Error reading header " + lf); @@ -356,9 +356,10 @@ public boolean setFenced() throws IOException { boolean changed = false; synchronized (this) { checkOpen(false); - if (LOG.isDebugEnabled()) { - LOG.debug("Try to set fenced state in file info {} : state bits {}.", lf, stateBits); - } + log.debug() + .attr("file", lf) + .attr("stateBits", stateBits) + .log("Try to set fenced state in file info"); if ((stateBits & STATE_FENCED_BIT) != STATE_FENCED_BIT) { // not fenced yet stateBits |= STATE_FENCED_BIT; @@ -538,13 +539,16 @@ public synchronized void moveToNewLocation(File newFile, long size) throws IOExc // delete old.idx fc.close(); if (!delete()) { - LOG.error("Failed to delete the previous index file " + lf); + log.error().attr("file", lf).log("Failed to delete the previous index file"); throw new IOException("Failed to delete the previous index file " + lf); } // rename new.idx.rloc to new.idx if (!rlocFile.renameTo(newFile)) { - LOG.error("Failed to rename " + rlocFile + " to " + newFile); + log.error() + .attr("source", rlocFile) + .attr("target", newFile) + .log("Failed to rename file"); throw new IOException("Failed to rename " + rlocFile + " to " + newFile); } fc = new RandomAccessFile(newFile, mode).getChannel(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfoBackingCache.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfoBackingCache.java index 266595b1587..38544c3bc78 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfoBackingCache.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfoBackingCache.java @@ -25,10 +25,10 @@ import java.io.UncheckedIOException; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.util.collections.ConcurrentLongHashMap; -@Slf4j +@CustomLog class FileInfoBackingCache { static final int DEAD_REF = -0xdead; @@ -104,8 +104,11 @@ private void releaseFileInfo(long ledgerId, CachedFileInfo fileInfo) { fileInfos.remove(ledgerId, fileInfo); } } catch (IOException ioe) { - log.error("Error evicting file info({}) for ledger {} from backing cache", - fileInfo, ledgerId, ioe); + log.error() + .exception(ioe) + .attr("fileInfo", fileInfo) + .attr("ledgerId", ledgerId) + .log("Error evicting file info from backing cache"); } finally { lock.writeLock().unlock(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java index 5e8c28556b8..7b1e0f78fd6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java @@ -40,6 +40,7 @@ import java.util.NoSuchElementException; import java.util.Scanner; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException.UpgradeException; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.discover.RegistrationManager; @@ -54,14 +55,12 @@ import org.apache.commons.cli.Options; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.io.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Application for upgrading the bookkeeper filesystem between versions. */ +@CustomLog public class FileSystemUpgrade { - private static final Logger LOG = LoggerFactory.getLogger(FileSystemUpgrade.class); static FilenameFilter bookieFilesFilter = new FilenameFilter() { private boolean containsIndexFiles(File dir, String name) { @@ -126,10 +125,16 @@ private static int detectPreviousVersion(File directory) throws IOException { try (Scanner s = new Scanner(v2versionFile, UTF_8.name())) { return s.nextInt(); } catch (NoSuchElementException nse) { - LOG.error("Couldn't parse version file " + v2versionFile, nse); + log.error() + .exception(nse) + .attr("versionFile", v2versionFile) + .log("Couldn't parse version file"); throw new IOException("Couldn't parse version file", nse); } catch (IllegalStateException ise) { - LOG.error("Error reading file " + v2versionFile, ise); + log.error() + .exception(ise) + .attr("versionFile", v2versionFile) + .log("Error reading version file"); throw new IOException("Error reading version file", ise); } } @@ -162,7 +167,7 @@ private static void linkIndexDirectories(File srcPath, File targetPath) throws I public static void upgrade(ServerConfiguration conf) throws BookieException.UpgradeException, InterruptedException { - LOG.info("Upgrading..."); + log.info("Upgrading..."); try { runFunctionWithRegistrationManager(conf, rm -> { @@ -179,7 +184,7 @@ public static void upgrade(ServerConfiguration conf) throw new UpgradeException(e.getCause()); } - LOG.info("Done"); + log.info("Done"); } private static void upgrade(ServerConfiguration conf, @@ -189,10 +194,10 @@ private static void upgrade(ServerConfiguration conf, Cookie.Builder cookieBuilder = Cookie.generateCookie(conf); Cookie c = cookieBuilder.build(); for (File d : getAllDirectories(conf)) { - LOG.info("Upgrading {}", d); + log.info().attr("directory", d).log("Upgrading"); int version = detectPreviousVersion(d); if (version == Cookie.CURRENT_COOKIE_LAYOUT_VERSION) { - LOG.info("Directory is current, no need to upgrade"); + log.info("Directory is current, no need to upgrade"); continue; } try { @@ -215,7 +220,7 @@ public boolean accept(File dir, String name) { linkIndexDirectories(d, tmpDir); } catch (IOException ioe) { - LOG.error("Error upgrading {}", d); + log.error().attr("directory", d).log("Error upgrading"); throw new BookieException.UpgradeException(ioe); } } @@ -226,7 +231,7 @@ public boolean accept(File dir, String name) { } catch (IOException ioe) { String err = String.format("Error moving upgraded directories into place %s -> %s ", e.getValue(), e.getKey()); - LOG.error(err, ioe); + log.error().exception(ioe).log(err); throw new BookieException.UpgradeException(ioe); } } @@ -238,7 +243,7 @@ public boolean accept(File dir, String name) { try { c.writeToRegistrationManager(rm, conf, Version.NEW); } catch (BookieException ke) { - LOG.error("Error writing cookie to registration manager"); + log.error("Error writing cookie to registration manager"); throw new BookieException.UpgradeException(ke); } } catch (IOException ioe) { @@ -248,10 +253,10 @@ public boolean accept(File dir, String name) { public static void finalizeUpgrade(ServerConfiguration conf) throws BookieException.UpgradeException, InterruptedException { - LOG.info("Finalizing upgrade..."); + log.info("Finalizing upgrade..."); // verify that upgrade is correct for (File d : getAllDirectories(conf)) { - LOG.info("Finalizing {}", d); + log.info().attr("directory", d).log("Finalizing"); try { int version = detectPreviousVersion(d); if (version < 3) { @@ -259,7 +264,7 @@ public static void finalizeUpgrade(ServerConfiguration conf) File v2versionFile = new File(d, BookKeeperConstants.VERSION_FILENAME); if (!v2versionFile.delete()) { - LOG.warn("Could not delete old version file {}", v2versionFile); + log.warn().attr("v2versionFile", v2versionFile).log("Could not delete old version file"); } } File[] files = d.listFiles(bookieFilesFilter); @@ -269,24 +274,24 @@ public static void finalizeUpgrade(ServerConfiguration conf) FileUtils.deleteDirectory(f); } else { if (!f.delete()) { - LOG.warn("Could not delete {}", f); + log.warn().attr("directory", f).log("Could not delete"); } } } } } } catch (IOException ioe) { - LOG.error("Error finalizing {}", d); + log.error().attr("directory", d).log("Error finalizing"); throw new BookieException.UpgradeException(ioe); } } // noop at the moment - LOG.info("Done"); + log.info("Done"); } public static void rollback(ServerConfiguration conf) throws BookieException.UpgradeException, InterruptedException { - LOG.info("Rolling back upgrade..."); + log.info("Rolling back upgrade..."); try { runFunctionWithRegistrationManager(conf, rm -> { @@ -303,14 +308,14 @@ public static void rollback(ServerConfiguration conf) throw new UpgradeException(e.getCause()); } - LOG.info("Done"); + log.info("Done"); } private static void rollback(ServerConfiguration conf, RegistrationManager rm) throws BookieException.UpgradeException { for (File d : getAllDirectories(conf)) { - LOG.info("Rolling back {}", d); + log.info().attr("directory", d).log("Rolling back"); try { // ensure there is a previous version before rollback int version = detectPreviousVersion(d); @@ -324,7 +329,7 @@ private static void rollback(ServerConfiguration conf, "Cannot rollback as previous data does not exist"); } } catch (IOException ioe) { - LOG.error("Error rolling back {}", d); + log.error().attr("directory", d).log("Error rolling back"); throw new BookieException.UpgradeException(ioe); } } @@ -332,7 +337,7 @@ private static void rollback(ServerConfiguration conf, Versioned cookie = Cookie.readFromRegistrationManager(rm, conf); cookie.getValue().deleteFromRegistrationManager(rm, conf, cookie.getVersion()); } catch (BookieException ke) { - LOG.error("Error deleting cookie from Registration Manager"); + log.error("Error deleting cookie from Registration Manager"); throw new BookieException.UpgradeException(ke); } } @@ -360,7 +365,7 @@ public static void main(String[] args) throws Exception { if (!cmdLine.hasOption("c")) { String err = "Cannot upgrade without configuration"; - LOG.error(err); + log.error(err); printHelp(opts); throw new IllegalArgumentException(err); } @@ -370,10 +375,16 @@ public static void main(String[] args) throws Exception { try { conf.loadConf(new File(confFile).toURI().toURL()); } catch (MalformedURLException mue) { - LOG.error("Could not open configuration file " + confFile, mue); + log.error() + .exception(mue) + .attr("confFile", confFile) + .log("Could not open configuration file"); throw new IllegalArgumentException(); } catch (ConfigurationException ce) { - LOG.error("Invalid configuration file " + confFile, ce); + log.error() + .exception(ce) + .attr("confFile", confFile) + .log("Invalid configuration file"); throw new IllegalArgumentException(); } @@ -385,7 +396,7 @@ public static void main(String[] args) throws Exception { finalizeUpgrade(conf); } else { String err = "Must specify -upgrade, -finalize or -rollback"; - LOG.error(err); + log.error(err); printHelp(opts); throw new IllegalArgumentException(err); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java index f0b9aaa6e25..4d834876d7e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java @@ -39,6 +39,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import lombok.CustomLog; import lombok.Getter; import org.apache.bookkeeper.bookie.BookieException.EntryLogMetadataMapException; import org.apache.bookkeeper.bookie.GarbageCollector.GarbageCleaner; @@ -51,15 +52,13 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableLong; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the garbage collector thread that runs in the background to * remove any entry log files that no longer contains any active ledger. */ +@CustomLog public class GarbageCollectorThread implements Runnable { - private static final Logger LOG = LoggerFactory.getLogger(GarbageCollectorThread.class); private static final int SECOND = 1000; private static final int ENTRY_LOG_USAGE_SEGMENT_COUNT = 10; private static final long MINUTE = TimeUnit.MINUTES.toMillis(1); @@ -198,13 +197,11 @@ public GarbageCollectorThread(ServerConfiguration conf, this.garbageCleaner = ledgerId -> { try { - if (LOG.isDebugEnabled()) { - LOG.debug("delete ledger : " + ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("delete ledger"); gcStats.getDeletedLedgerCounter().inc(); ledgerStorage.deleteLedger(ledgerId); } catch (IOException e) { - LOG.error("Exception when deleting the ledger index file on the Bookie: ", e); + log.error().exception(e).log("Exception when deleting the ledger index file on the Bookie"); } }; @@ -232,7 +229,10 @@ public void removeEntryLog(long logToRemove) { // Ignore and continue because ledger will not be cleaned up // from entry-logger in this pass and will be taken care in // next schedule task - LOG.warn("Failed to remove entry-log metadata {}", logToRemove, e); + log.warn() + .exception(e) + .attr("logToRemove", logToRemove) + .log("Failed to remove entry-log metadata"); } } }; @@ -293,12 +293,18 @@ public void removeEntryLog(long logToRemove) { } } - LOG.info("Minor Compaction : enabled=" + enableMinorCompaction + ", threshold=" - + minorCompactionThreshold + ", interval=" + minorCompactionInterval); - LOG.info("Major Compaction : enabled=" + enableMajorCompaction + ", threshold=" - + majorCompactionThreshold + ", interval=" + majorCompactionInterval); - LOG.info("Entry Location Compaction : interval=" + entryLocationCompactionInterval + ", randomCompactionDelay=" - + randomCompactionDelay); + log.info() + .attr("enabled", enableMinorCompaction) + .attr("threshold", minorCompactionThreshold) + .attr("interval", minorCompactionInterval).log("Minor Compaction"); + log.info() + .attr("enabled", enableMajorCompaction) + .attr("threshold", majorCompactionThreshold) + .attr("interval", majorCompactionInterval).log("Major Compaction"); + log.info() + .attr("interval", entryLocationCompactionInterval) + .attr("randomCompactionDelay", randomCompactionDelay) + .log("Entry Location Compaction"); lastMinorCompactionTime = lastMajorCompactionTime = lastEntryLocationCompactionTime = System.currentTimeMillis(); @@ -311,8 +317,10 @@ private EntryLogMetadataMap createEntryLogMetadataMap() throws IOException { try { return new PersistentEntryLogMetadataMap(baseDir, conf); } catch (IOException e) { - LOG.error("Failed to initialize persistent-metadata-map , clean up {}", - baseDir + "/" + METADATA_CACHE, e); + log.error() + .exception(e) + .attr("METADATA_CACHE", baseDir + "/" + METADATA_CACHE) + .log("Failed to initialize persistent-metadata-map, clean up"); throw e; } } else { @@ -322,7 +330,9 @@ private EntryLogMetadataMap createEntryLogMetadataMap() throws IOException { public void enableForceGC() { if (forceGarbageCollection.compareAndSet(false, true)) { - LOG.info("Forced garbage collection triggered by thread: {}", Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Forced garbage collection triggered by thread"); triggerGC(true, suspendMajorCompaction.get(), suspendMinorCompaction.get()); } @@ -330,16 +340,20 @@ public void enableForceGC() { public void enableForceGC(boolean forceMajor, boolean forceMinor) { if (forceGarbageCollection.compareAndSet(false, true)) { - LOG.info("Forced garbage collection triggered by thread: {}, forceMajor: {}, forceMinor: {}", - Thread.currentThread().getName(), forceMajor, forceMinor); + log.info() + .attr("thread", Thread.currentThread().getName()) + .attr("forceMajor", forceMajor) + .attr("forceMinor", forceMinor) + .log("Forced garbage collection triggered"); triggerGC(true, !forceMajor, !forceMinor); } } public void disableForceGC() { if (forceGarbageCollection.compareAndSet(true, false)) { - LOG.info("{} disabled force garbage collection since bookie has enough space now.", Thread - .currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("disabled force garbage collection since bookie has enough space now."); } } @@ -375,27 +389,33 @@ public boolean isMinorGcSuspend() { public void suspendMajorGC() { if (suspendMajorCompaction.compareAndSet(false, true)) { - LOG.info("Suspend Major Compaction triggered by thread: {}", Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Suspend Major Compaction"); } } public void resumeMajorGC() { if (suspendMajorCompaction.compareAndSet(true, false)) { - LOG.info("{} Major Compaction back to normal since bookie has enough space now.", - Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Major Compaction back to normal since bookie has enough space now."); } } public void suspendMinorGC() { if (suspendMinorCompaction.compareAndSet(false, true)) { - LOG.info("Suspend Minor Compaction triggered by thread: {}", Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Suspend Minor Compaction"); } } public void resumeMinorGC() { if (suspendMinorCompaction.compareAndSet(true, false)) { - LOG.info("{} Minor Compaction back to normal since bookie has enough space now.", - Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Minor Compaction back to normal since bookie has enough space now."); } } @@ -433,7 +453,7 @@ public void run() { public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMinor) { long threadStart = MathUtils.nowInNano(); if (force) { - LOG.info("Garbage collector thread forced to perform GC before expiry of wait time."); + log.info("Garbage collector thread forced to perform GC before expiry of wait time."); } // Recover and clean up previous state if using transactional compaction compactor.cleanUpAndRecover(); @@ -443,7 +463,6 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin // this is used in extractMetaFromEntryLogs to calculate the usage of entry log doGcLedgers(); - long extractMetaStart = MathUtils.nowInNano(); try { // Extract all of the ledger ID's that comprise all of the entry logs @@ -461,10 +480,10 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin } if (suspendMajor) { - LOG.info("Disk almost full, suspend major compaction to slow down filling disk."); + log.info("Disk almost full, suspend major compaction to slow down filling disk."); } if (suspendMinor) { - LOG.info("Disk full, suspend minor compaction to slow down filling disk."); + log.info("Disk full, suspend minor compaction to slow down filling disk."); } long curTime = System.currentTimeMillis(); @@ -473,8 +492,10 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin && (force || curTime - lastMajorCompactionTime > majorCompactionInterval))) && (!suspendMajor)) { // enter major compaction - LOG.info("Enter major compaction, suspendMajor {}, lastMajorCompactionTime {}", suspendMajor, - lastMajorCompactionTime); + log.info() + .attr("suspendMajor", suspendMajor) + .attr("lastMajorCompactionTime", lastMajorCompactionTime) + .log("Enter major compaction"); majorCompacting.set(true); try { doCompactEntryLogs(majorCompactionThreshold, majorCompactionMaxTimeMillis); @@ -494,8 +515,10 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin && (force || curTime - lastMinorCompactionTime > minorCompactionInterval))) && (!suspendMinor)) { // enter minor compaction - LOG.info("Enter minor compaction, suspendMinor {}, lastMinorCompactionTime {}", suspendMinor, - lastMinorCompactionTime); + log.info() + .attr("suspendMinor", suspendMinor) + .attr("lastMinorCompactionTime", lastMinorCompactionTime) + .log("Enter minor compaction"); minorCompacting.set(true); try { doCompactEntryLogs(minorCompactionThreshold, minorCompactionMaxTimeMillis); @@ -512,15 +535,17 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin if (entryLocationCompactionInterval > 0 && (curTime - lastEntryLocationCompactionTime > ( entryLocationCompactionInterval + randomCompactionDelay))) { // enter entry location compaction - LOG.info( - "Enter entry location compaction, entryLocationCompactionInterval {}, randomCompactionDelay " - + "{}, lastEntryLocationCompactionTime {}", - entryLocationCompactionInterval, randomCompactionDelay, lastEntryLocationCompactionTime); + log.info() + .attr("entryLocationCompactionInterval", entryLocationCompactionInterval) + .attr("randomCompactionDelay", randomCompactionDelay) + .attr("lastEntryLocationCompactionTime", lastEntryLocationCompactionTime) + .log("Enter entry location compaction"); ledgerStorage.entryLocationCompact(); lastEntryLocationCompactionTime = System.currentTimeMillis(); randomCompactionDelay = ThreadLocalRandom.current().nextLong(entryLocationCompactionInterval); - LOG.info("Next entry location compaction interval {}", - entryLocationCompactionInterval + randomCompactionDelay); + log.info() + .attr("randomCompactionDelay", entryLocationCompactionInterval + randomCompactionDelay) + .log("Next entry location compaction interval"); gcStats.getEntryLocationCompactionCounter().inc(); } gcStats.getCompactRuntime() @@ -528,17 +553,22 @@ public void runWithFlags(boolean force, boolean suspendMajor, boolean suspendMin gcStats.getGcThreadRuntime().registerSuccessfulEvent( MathUtils.nowInNano() - threadStart, TimeUnit.NANOSECONDS); } catch (EntryLogMetadataMapException e) { - LOG.error("Error in entryLog-metadatamap, Failed to complete GC/Compaction due to entry-log {}", - e.getMessage(), e); + log.error() + .exception(e) + .exceptionMessage(e) + .log("Error in entryLog-metadatamap, Failed to complete GC/Compaction due to entry-log"); gcStats.getGcThreadRuntime().registerFailedEvent(MathUtils.elapsedNanos(threadStart), TimeUnit.NANOSECONDS); } catch (Throwable e) { - LOG.error("Error in garbage collector thread, Failed to complete GC/Compaction due to {}", - e.getMessage(), e); + log.error() + .exception(e) + .exceptionMessage(e) + .log("Error in garbage collector thread, failed to complete GC/Compaction"); gcStats.getGcThreadRuntime().registerFailedEvent(MathUtils.elapsedNanos(threadStart), TimeUnit.NANOSECONDS); } finally { if (force && forceGarbageCollection.compareAndSet(true, false)) { - LOG.info("{} Set forceGarbageCollection to false after force GC to make it forceGC-able again.", - Thread.currentThread().getName()); + log.info() + .attr("thread", Thread.currentThread().getName()) + .log("Set forceGarbageCollection to false after force GC to make it forceGC-able again."); } } @@ -554,7 +584,7 @@ private void doGcLedgers() { gcStats.getGcLedgerRuntime() .registerSuccessfulEvent(MathUtils.elapsedNanos(gcLedgersStart), TimeUnit.NANOSECONDS); } catch (Throwable t) { - LOG.warn("Exception when doing gc ledger.", t); + log.warn().exception(t).log("Exception when doing gc ledger."); gcStats.getGcLedgerRuntime() .registerFailedEvent(MathUtils.elapsedNanos(gcLedgersStart), TimeUnit.NANOSECONDS); } @@ -576,7 +606,7 @@ private void doGcEntryLogs() throws EntryLogMetadataMapException { // This means the entry log is not associated with any active // ledgers anymore. // We can remove this entry log file now. - LOG.info("Deleting entryLogId {} as it has no active ledgers!", entryLogId); + log.info().attr("entryLogId", entryLogId).log("Deleting entryLogId as it has no active ledgers!"); if (removeEntryLog(entryLogId)) { gcStats.getReclaimedSpaceViaDeletes().addCount(meta.getTotalSize()); } else { @@ -590,7 +620,10 @@ private void doGcEntryLogs() throws EntryLogMetadataMapException { // Ignore and continue because ledger will not be cleaned up // from entry-logger in this pass and will be taken care in next // schedule task - LOG.warn("Failed to remove ledger from entry-log metadata {}", entryLogId, e); + log.warn() + .exception(e) + .attr("entryLogId", entryLogId) + .log("Failed to remove ledger from entry-log metadata"); } activeEntryLogSizeAcc.getAndAdd(meta.getRemainingSize()); totalEntryLogSizeAcc.getAndAdd(meta.getTotalSize()); @@ -611,7 +644,7 @@ private boolean removeIfLedgerNotExists(EntryLogMetadata meta) throws EntryLogMe } return !exist; } catch (IOException e) { - LOG.error("Error reading from ledger storage", e); + log.error().exception(e).log("Error reading from ledger storage"); return false; } }); @@ -630,7 +663,7 @@ private boolean removeIfLedgerNotExists(EntryLogMetadata meta) throws EntryLogMe */ @VisibleForTesting void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMetadataMapException { - LOG.info("Do compaction to compact those files lower than {}", threshold); + log.info().attr("threshold", threshold).log("Compacting files lower than threshold"); final int numBuckets = ENTRY_LOG_USAGE_SEGMENT_COUNT; int[] entryLogUsageBuckets = new int[numBuckets]; @@ -669,9 +702,10 @@ void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMet }); currentEntryLogUsageBuckets = entryLogUsageBuckets; gcStats.setEntryLogUsageBuckets(currentEntryLogUsageBuckets); - LOG.info( - "Compaction: entry log usage buckets before compaction [10% 20% 30% 40% 50% 60% 70% 80% 90% 100%] = {}", - entryLogUsageBuckets); + log.info() + .attr("entryLogUsageBuckets", entryLogUsageBuckets) + .log("Compaction: entry log usage buckets before compaction " + + "[10% 20% 30% 40% 50% 60% 70% 80% 90% 100%]"); final int maxBucket = calculateUsageIndex(numBuckets, threshold); int totalEntryLogIds = 0; @@ -700,20 +734,22 @@ void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMet final long logId = entryLogIds.remove(); if (System.currentTimeMillis() - lastPrintTimestamp >= MINUTE) { lastPrintTimestamp = System.currentTimeMillis(); - LOG.info("Compaction progress {} / {}, current compaction entryLogId: {}", - processedEntryLogCnt.get(), totalEntryLogIds, logId); + log.info() + .attr("processed", processedEntryLogCnt.get()) + .attr("totalEntryLogIds", totalEntryLogIds) + .attr("logId", logId) + .log("Compaction progress"); } entryLogMetaMap.forKey(logId, (entryLogId, meta) -> { if (meta == null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Metadata for entry log {} already deleted", logId); - } + log.debug().attr("logId", logId).log("Metadata for entry log already deleted"); return; } - if (LOG.isDebugEnabled()) { - LOG.debug("Compacting entry log {} with usage {} below threshold {}", - meta.getEntryLogId(), meta.getUsage(), threshold); - } + log.debug() + .attr("entryLogId", meta.getEntryLogId()) + .attr("usage", meta.getUsage()) + .attr("threshold", threshold) + .log("Compacting entry log with usage below threshold"); long priorRemainingSize = meta.getRemainingSize(); compactEntryLog(meta); @@ -724,19 +760,23 @@ void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMet } } - if (LOG.isDebugEnabled()) { - if (!running) { - LOG.debug("Compaction exited due to gc not running"); - } - if (maxTimeMillis > 0 && timeDiff.getValue() > maxTimeMillis) { - LOG.debug("Compaction ran for {}ms but was limited by {}ms", timeDiff, maxTimeMillis); - } + if (!running) { + log.debug("Compaction exited due to gc not running"); + } + if (maxTimeMillis > 0 && timeDiff.getValue() > maxTimeMillis) { + log.debug() + .attr("timeDiff", timeDiff) + .attr("maxTimeMillis", maxTimeMillis) + .log("Compaction ran for ms but was limited by ms"); } int totalEntryLogNum = Arrays.stream(entryLogUsageBuckets).sum(); int compactedEntryLogNum = Arrays.stream(compactedBuckets).sum(); this.entryLogCompactRatio = totalEntryLogNum == 0 ? 0 : (double) compactedEntryLogNum / totalEntryLogNum; - LOG.info("Compaction: entry log usage buckets[10% 20% 30% 40% 50% 60% 70% 80% 90% 100%] = {}, compacted {}, " - + "compacted entry log ratio {}", entryLogUsageBuckets, compactedBuckets, entryLogCompactRatio); + log.info() + .attr("entryLogUsageBuckets", entryLogUsageBuckets) + .attr("compactedBuckets", compactedBuckets) + .attr("entryLogCompactRatio", entryLogCompactRatio) + .log("Compaction: entry log usage buckets[10% 20% 30% 40% 50% 60% 70% 80% 90% 100%]"); } /** @@ -763,7 +803,7 @@ public synchronized void shutdown() throws InterruptedException { return; } this.running = false; - LOG.info("Shutting down GarbageCollectorThread"); + log.info("Shutting down GarbageCollectorThread"); throttler.cancelledAcquire(); compactor.throttler.cancelledAcquire(); @@ -777,7 +817,7 @@ public synchronized void shutdown() throws InterruptedException { try { entryLogMetaMap.close(); } catch (Exception e) { - LOG.warn("Failed to close entryLog metadata-map", e); + log.warn().exception(e).log("Failed to close entryLog metadata-map"); } } @@ -791,7 +831,7 @@ public synchronized void shutdown() throws InterruptedException { protected boolean removeEntryLog(long entryLogId) throws EntryLogMetadataMapException { // remove entry log file successfully if (entryLogger.removeEntryLog(entryLogId)) { - LOG.info("Removing entry log metadata for {}", entryLogId); + log.info().attr("entryLogId", entryLogId).log("Removing entry log metadata"); entryLogMetaMap.remove(entryLogId); return true; } @@ -820,7 +860,10 @@ protected void compactEntryLog(EntryLogMetadata entryLogMeta) { // Do the actual compaction compactor.compact(entryLogMeta); } catch (Exception e) { - LOG.error("Failed to compact entry log {} due to unexpected error", entryLogMeta.getEntryLogId(), e); + log.error() + .exception(e) + .attr("entryLogId", entryLogMeta.getEntryLogId()) + .log("Failed to compact entry log due to unexpected error"); } finally { // Mark compaction done compacting.set(false); @@ -846,18 +889,19 @@ protected void extractMetaFromEntryLogs() throws EntryLogMetadataMapException { continue; } - try { // Read through the entry log file and extract the entry log meta EntryLogMetadata entryLogMeta = entryLogger.getEntryLogMetadata(entryLogId, throttler); - LOG.info("Extracted entry log meta from entryLogId: {}, ledgers {}", - entryLogId, entryLogMeta.getLedgersMap().keys()); + log.info() + .attr("entryLogId", entryLogId) + .attr("ledgersMap", entryLogMeta.getLedgersMap().keys()) + .log("Extracted entry log meta"); removeIfLedgerNotExists(entryLogMeta); if (entryLogMeta.isEmpty()) { // This means the entry log is not associated with any active // ledgers anymore. // We can remove this entry log file now. - LOG.info("Deleting entryLogId {} as it has no active ledgers!", entryLogId); + log.info().attr("entryLogId", entryLogId).log("Deleting entryLogId as it has no active ledgers!"); if (removeEntryLog(entryLogId)) { gcStats.getReclaimedSpaceViaDeletes().addCount(entryLogMeta.getTotalSize()); } else { @@ -867,13 +911,18 @@ protected void extractMetaFromEntryLogs() throws EntryLogMetadataMapException { entryLogMetaMap.put(entryLogId, entryLogMeta); } } catch (IOException | RuntimeException e) { - LOG.warn("Premature exception when processing {} recovery will take care of the problem", - entryLogId, e); + log.warn() + .exception(e) + .attr("entryLogId", entryLogId) + .log("Premature exception when processing recovery will take care of the problem"); } catch (OutOfMemoryError oome) { // somewhat similar to https://github.com/apache/bookkeeper/pull/3901 // entrylog file can be corrupted but instead having a negative entry size // it ends up with very large value for the entry size causing OODME - LOG.warn("OutOfMemoryError when processing {} - skipping the entry log", entryLogId, oome); + log.warn() + .exception(oome) + .attr("entryLogId", entryLogId) + .log("OutOfMemoryError when processing - skipping the entry log"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexInMemPageMgr.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexInMemPageMgr.java index 063b428e923..20d2e904a64 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexInMemPageMgr.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexInMemPageMgr.java @@ -43,18 +43,17 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.stats.IndexInMemPageMgrStats; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.Counter; import org.apache.bookkeeper.stats.Gauge; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; // CHECKSTYLE.ON: IllegalImport +@CustomLog class IndexInMemPageMgr { - private static final Logger LOG = LoggerFactory.getLogger(IndexInMemPageMgr.class); private static final ConcurrentHashMap EMPTY_PAGE_MAP = new ConcurrentHashMap(); @@ -181,9 +180,7 @@ private LinkedList getFirstEntryListToBeFlushed(long ledgerId) { if (!lep.inUse()) { addToCleanPagesList(lep); } - if (LOG.isTraceEnabled()) { - LOG.trace("Page is clean " + lep); - } + log.trace().attr("page", lep).log("Page is clean"); } else { firstEntryList.add(lep.getFirstEntry()); } @@ -256,9 +253,7 @@ LedgerEntryPage grabCleanPage(long ledgerId, long firstEntry) { } if (null == lep) { - if (LOG.isDebugEnabled()) { - LOG.debug("Did not find eligible page in the first pass"); - } + log.debug("Did not find eligible page in the first pass"); return null; } } @@ -360,8 +355,11 @@ public IndexInMemPageMgr(int pageSize, } else { this.pageLimit = conf.getPageLimit(); } - LOG.info("maxDirectMemory = {}, pageSize = {}, pageLimit = {}", - maxDirectMemory, pageSize, pageLimit); + log.info() + .attr("maxDirectMemory", maxDirectMemory) + .attr("pageSize", pageSize) + .attr("pageLimit", pageLimit) + .log("Starting IndexInMemPageMgr"); // Expose Stats this.ledgerCacheHitCounter = statsLogger.getCounter(LEDGER_CACHE_HIT); this.ledgerCacheMissCounter = statsLogger.getCounter(LEDGER_CACHE_MISS); @@ -506,8 +504,10 @@ private LedgerEntryPage grabCleanPage(long ledger, long entry) throws IOExceptio if (null != lep) { return lep; } - LOG.info("Could not grab a clean page for ledger {}, entry {}, force flushing dirty ledgers.", - ledger, entry); + log.info() + .attr("ledgerId", ledger) + .attr("entryId", entry) + .log("Could not grab a clean page, force flushing dirty ledgers"); flushOneOrMoreLedgers(false); } } @@ -539,9 +539,7 @@ private void flushSpecificLedger(long ledger) throws IOException { indexPersistenceManager.flushLedgerHeader(ledger); if (null == firstEntryList || firstEntryList.size() == 0) { - if (LOG.isDebugEnabled()) { - LOG.debug("Nothing to flush for ledger {}.", ledger); - } + log.debug().attr("ledgerId", ledger).log("Nothing to flush for ledger"); // nothing to do return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java index 220f81eb8a3..6f995f67215 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java @@ -36,6 +36,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.FileInfoBackingCache.CachedFileInfo; import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException; import org.apache.bookkeeper.bookie.stats.IndexPersistenceMgrStats; @@ -43,14 +44,12 @@ import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.SnapshotMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A {@code IndexPersistenceMgr} is responsible for managing the persistence state for the index in a bookie. */ +@CustomLog public class IndexPersistenceMgr { - private static final Logger LOG = LoggerFactory.getLogger(IndexPersistenceMgr.class); private static final String IDX = ".idx"; static final String RLOC = ".rloc"; @@ -96,7 +95,7 @@ public IndexPersistenceMgr(int pageSize, this.ledgerDirsManager = ledgerDirsManager; this.pageSize = pageSize; this.entriesPerPage = entriesPerPage; - LOG.info("openFileLimit = {}", openFileLimit); + log.info().attr("openFileLimit", openFileLimit).log("openFileLimit"); // Retrieve all of the active ledgers. getActiveLedgers(); @@ -200,9 +199,11 @@ CachedFileInfo getFileInfo(final Long ledger, final byte[] masterKey) throws IOE boolean inWriteMap = writeFileInfoCache.asMap().remove(ledger, fi); boolean inReadMap = readFileInfoCache.asMap().remove(ledger, fi); if (inWriteMap || inReadMap) { - LOG.error("Dead fileinfo({}) forced out of cache (write:{}, read:{}). " - + "It must have been double-released somewhere.", - fi, inWriteMap, inReadMap); + log.error() + .attr("fileInfo", fi) + .attr("inWriteMap", inWriteMap) + .attr("inReadMap", inReadMap) + .log("Dead fileinfo forced out of cache. It must have been double-released somewhere."); } fi = null; } @@ -278,7 +279,7 @@ private void getActiveLedgers() throws IOException { if (index.getName().endsWith(RLOC)) { if (findIndexFile(ledgerId) != null) { if (!index.delete()) { - LOG.warn("Deleting the rloc file " + index + " failed"); + log.warn().attr("file", index).log("Deleting the rloc file failed"); } continue; } else { @@ -465,7 +466,7 @@ public ByteBuf getExplicitLac(long ledgerId) { fi = getFileInfo(ledgerId, null); return fi.getExplicitLac(); } catch (IOException e) { - LOG.error("Exception during getLastAddConfirmed", e); + log.error().exception(e).log("Exception during getLastAddConfirmed"); return null; } finally { if (null != fi) { @@ -526,7 +527,7 @@ void flushLedgerHeader(long ledger) throws IOException { relocateIndexFileAndFlushHeader(ledger, fi); } catch (Bookie.NoLedgerException nle) { // ledger has been deleted - LOG.info("No ledger {} found when flushing header.", ledger); + log.info().attr("ledgerId", ledger).log("No ledger found when flushing header."); return; } finally { if (null != fi) { @@ -549,7 +550,7 @@ public int compare(LedgerEntryPage o1, LedgerEntryPage o2) { fi = getFileInfo(l, null); } catch (Bookie.NoLedgerException nle) { // ledger has been deleted - LOG.info("No ledger {} found when flushing entries.", l); + log.info().attr("ledgerId", l).log("No ledger found when flushing entries."); return; } @@ -563,7 +564,7 @@ public int compare(LedgerEntryPage o1, LedgerEntryPage o2) { // send up a sequential list int count = i - start; if (count == 0) { - LOG.warn("Count cannot possibly be zero!"); + log.warn("Count cannot possibly be zero!"); } writeBuffers(l, entries, fi, start, count); start = i; @@ -571,16 +572,17 @@ public int compare(LedgerEntryPage o1, LedgerEntryPage o2) { lastOffset = entries.get(i).getFirstEntry(); } if (entries.size() - start == 0 && entries.size() != 0) { - LOG.warn("Nothing to write, but there were entries!"); + log.warn("Nothing to write, but there were entries!"); } writeBuffers(l, entries, fi, start, entries.size() - start); for (int i = 0; i < entries.size(); i++) { LedgerEntryPage lep = entries.get(i); lep.setClean(versions[i]); } - if (LOG.isDebugEnabled()) { - LOG.debug("Flushed ledger {} with {} pages.", l, entries.size()); - } + log.debug() + .attr("ledgerId", l) + .attr("size", entries.size()) + .log("Flushed ledger with pages."); } finally { if (fi != null) { fi.release(); @@ -591,9 +593,10 @@ public int compare(LedgerEntryPage o1, LedgerEntryPage o2) { private void writeBuffers(Long ledger, List entries, FileInfo fi, int start, int count) throws IOException, Bookie.NoLedgerException { - if (LOG.isTraceEnabled()) { - LOG.trace("Writing {} buffers of {}", count, Long.toHexString(ledger)); - } + log.trace() + .attr("count", count) + .attr("value", Long.toHexString(ledger)) + .log("Writing buffers"); if (count == 0) { return; } @@ -663,7 +666,7 @@ long getPersistEntryBeyondInMem(long ledgerId, long lastEntryInMem) throws IOExc // make sure the file size is aligned with index entry size // otherwise we may read incorrect data if (0 != size % LedgerEntryPage.getIndexEntrySize()) { - LOG.warn("Index file of ledger {} is not aligned with index entry size.", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Index file of ledger is not aligned with index entry size."); size = size - size % LedgerEntryPage.getIndexEntrySize(); } // we may not have the last entry in the cache diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java index 4c6b7a9ee4d..0fec664fd08 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java @@ -51,6 +51,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import lombok.Cleanup; +import lombok.CustomLog; import lombok.Getter; import org.apache.bookkeeper.bookie.Bookie.NoLedgerException; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; @@ -69,8 +70,6 @@ import org.apache.bookkeeper.util.SnapshotMap; import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableLong; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Interleave ledger storage. @@ -83,8 +82,8 @@ category = CATEGORY_SERVER, help = "Bookie related stats" ) +@CustomLog public class InterleavedLedgerStorage implements CompactableLedgerStorage, EntryLogListener { - private static final Logger LOG = LoggerFactory.getLogger(InterleavedLedgerStorage.class); DefaultEntryLogger entryLogger; @Getter @@ -302,17 +301,17 @@ public void start() { public void shutdown() throws InterruptedException { // shut down gc thread, which depends on zookeeper client // also compaction will write entries again to entry log file - LOG.info("Shutting down InterleavedLedgerStorage"); - LOG.info("Shutting down GC thread"); + log.info("Shutting down InterleavedLedgerStorage"); + log.info("Shutting down GC thread"); gcThread.shutdown(); - LOG.info("Shutting down entry logger"); + log.info("Shutting down entry logger"); entryLogger.close(); try { ledgerCache.close(); } catch (IOException e) { - LOG.error("Error while closing the ledger cache", e); + log.error().exception(e).log("Error while closing the ledger cache"); } - LOG.info("Complete shutting down Ledger Storage"); + log.info("Complete shutting down Ledger Storage"); } @Override @@ -455,13 +454,13 @@ private void flushOrCheckpoint(boolean isCheckpointFlush) } catch (LedgerDirsManager.NoWritableLedgerDirException e) { throw e; } catch (IOException ioe) { - LOG.error("Exception flushing Ledger cache", ioe); + log.error().exception(ioe).log("Exception flushing Ledger cache"); flushFailed = true; } try { // if it is just a checkpoint flush, we just flush rotated entry log files - // in entry logger. + // in entry log. if (isCheckpointFlush) { entryLogger.checkpoint(); } else { @@ -470,7 +469,7 @@ private void flushOrCheckpoint(boolean isCheckpointFlush) } catch (LedgerDirsManager.NoWritableLedgerDirException e) { throw e; } catch (IOException ioe) { - LOG.error("Exception flushing Ledger", ioe); + log.error().exception(ioe).log("Exception flushing Ledger"); flushFailed = true; } if (flushFailed) { @@ -521,9 +520,10 @@ public void updateEntriesLocations(Iterable locations) throws IOE ledgerCache.putEntryOffset(l.ledger, l.entry, l.location); } catch (NoLedgerException e) { // Ledger was already deleted, we can skip it in the compaction - if (LOG.isDebugEnabled()) { - LOG.debug("Compaction failed for deleted ledger ledger: {} entry: {}", l.ledger, l.entry); - } + log.debug() + .attr("ledgerId", l.ledger) + .attr("entryId", l.entry) + .log("Compaction failed for deleted ledger"); } } } @@ -599,7 +599,7 @@ public LedgerCache.LedgerIndexMetadata readLedgerIndexMetadata(long ledgerId) th @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") public List localConsistencyCheck(Optional rateLimiter) throws IOException { long checkStart = MathUtils.nowInNano(); - LOG.info("Starting localConsistencyCheck"); + log.info("Starting localConsistencyCheck"); long checkedLedgers = 0; long checkedPages = 0; final MutableLong checkedEntries = new MutableLong(0); @@ -627,22 +627,18 @@ public List localConsistencyCheck(Optional r if (version != lep.getVersion()) { pageRetries.increment(); if (lep.isDeleted()) { - if (LOG.isDebugEnabled()) { - LOG.debug("localConsistencyCheck: ledger {} deleted", - ledger); - } + log.debug() + .attr("ledgerId", ledger) + .log("localConsistencyCheck: ledger deleted"); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("localConsistencyCheck: " - + "concurrent modification, retrying"); - } + log.debug("localConsistencyCheck: concurrent modification, retrying"); retry.setValue(true); retryCounter.inc(); } return false; } else { errors.add(new DetectedInconsistency(ledger, entry, e)); - LOG.error("Got error: ", e); + log.error().exception(e).log("Got error"); } success.setValue(false); } @@ -661,25 +657,27 @@ public List localConsistencyCheck(Optional r } } catch (NoLedgerException | FileInfo.FileInfoDeletedException e) { if (activeLedgers.containsKey(ledger)) { - LOG.error("Cannot find ledger {}, should exist, exception is ", ledger, e); + log.error() + .exception(e) + .attr("ledgerId", ledger) + .log("Cannot find ledger that should exist"); errors.add(new DetectedInconsistency(ledger, -1, e)); - } else if (LOG.isDebugEnabled()){ - LOG.debug("ledger {} deleted since snapshot taken", ledger); + } else { + log.debug().attr("ledgerId", ledger).log("ledger deleted since snapshot taken"); } } catch (Exception e) { throw new IOException("Got other exception in localConsistencyCheck", e); } checkedLedgers++; } - LOG.info( - "Finished localConsistencyCheck, took {}s to scan {} ledgers, {} pages, " - + "{} entries with {} retries, {} errors", - TimeUnit.NANOSECONDS.toSeconds(MathUtils.elapsedNanos(checkStart)), - checkedLedgers, - checkedPages, - checkedEntries.longValue(), - pageRetries.longValue(), - errors.size()); + log.info() + .attr("value", TimeUnit.NANOSECONDS.toSeconds(MathUtils.elapsedNanos(checkStart))) + .attr("checkedLedgers", checkedLedgers) + .attr("checkedPages", checkedPages) + .attr("longValue", checkedEntries.longValue()) + .attr("longValue", pageRetries.longValue()) + .attr("size", errors.size()) + .log("Finished localConsistencyCheck, took s to scan ledgers, pages, entries with retries, errors"); return errors; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedStorageRegenerateIndexOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedStorageRegenerateIndexOp.java index 8e13d7b8cd0..8af6d3e2bc4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedStorageRegenerateIndexOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedStorageRegenerateIndexOp.java @@ -28,6 +28,7 @@ import java.util.PrimitiveIterator.OfLong; import java.util.Set; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.EntryLogScanner; import org.apache.bookkeeper.common.util.Watcher; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -36,14 +37,12 @@ import org.apache.bookkeeper.util.DiskChecker; import org.apache.bookkeeper.util.SnapshotMap; import org.apache.commons.lang3.time.DurationFormatUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Scan all entries in the entry log and rebuild the index file for one ledger. */ +@CustomLog public class InterleavedStorageRegenerateIndexOp { - private static final Logger LOG = LoggerFactory.getLogger(InterleavedStorageRegenerateIndexOp.class); private final ServerConfiguration conf; private final Set ledgerIds; @@ -85,7 +84,7 @@ long getLastEntry() { } public void initiate(boolean dryRun) throws IOException { - LOG.info("Starting index rebuilding"); + log.info("Starting index rebuilding"); DiskChecker diskChecker = BookieResources.createDiskChecker(conf); LedgerDirsManager ledgerDirsManager = BookieResources.createLedgerDirsManager( @@ -107,11 +106,11 @@ public void initiate(boolean dryRun) throws IOException { int completedEntryLogs = 0; long startTime = System.nanoTime(); - LOG.info("Scanning {} entry logs", totalEntryLogs); + log.info().attr("totalEntryLogs", totalEntryLogs).log("Scanning entry logs"); Map stats = new HashMap<>(); for (long entryLogId : entryLogs) { - LOG.info("Scanning {}", entryLogId); + log.info().attr("entryLogId", entryLogId).log("Scanning"); entryLogger.scanEntryLog(entryLogId, new EntryLogScanner() { @Override public void process(long ledgerId, long offset, ByteBuf entry) throws IOException { @@ -121,11 +120,12 @@ public void process(long ledgerId, long offset, ByteBuf entry) throws IOExceptio // Actual location indexed is pointing past the entry size long location = (entryLogId << 32L) | (offset + 4); - - if (LOG.isDebugEnabled()) { - LOG.debug("Rebuilding {}:{} at location {} / {}", ledgerId, entryId, location >> 32, - location & (Integer.MAX_VALUE - 1)); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("32", location >> 32) + .attr("value", location & (Integer.MAX_VALUE - 1)) + .log("Rebuilding entry"); if (!ledgerCache.ledgerExists(ledgerId)) { ledgerCache.setMasterKey(ledgerId, masterKey); @@ -143,25 +143,33 @@ public boolean accept(long ledgerId) { ledgerCache.flushLedger(true); ++completedEntryLogs; - LOG.info("Completed scanning of log {}.log -- {} / {}", Long.toHexString(entryLogId), completedEntryLogs, - totalEntryLogs); + log.info() + .attr("value", Long.toHexString(entryLogId)) + .attr("completedEntryLogs", completedEntryLogs) + .attr("totalEntryLogs", totalEntryLogs) + .log("Completed scanning of log .log -- /"); } - LOG.info("Rebuilding indices done"); + log.info("Rebuilding indices done"); for (long ledgerId : ledgerIds) { RecoveryStats ledgerStats = stats.get(ledgerId); if (ledgerStats == null || ledgerStats.getNumEntries() == 0) { - LOG.info(" {} - No entries found", ledgerId); + log.info().attr("ledgerId", ledgerId).log("- No entries found"); } else { - LOG.info(" {} - Found {} entries, from {} to {}", ledgerId, - ledgerStats.getNumEntries(), ledgerStats.getFirstEntry(), ledgerStats.getLastEntry()); + log.info() + .attr("ledgerId", ledgerId) + .attr("numEntries", ledgerStats.getNumEntries()) + .attr("firstEntry", ledgerStats.getFirstEntry()) + .attr("lastEntry", ledgerStats.getLastEntry()) + .log("Found entries"); } } - LOG.info("Total time: {}", DurationFormatUtils.formatDurationHMS( - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))); + log.info() + .attr("value", DurationFormatUtils.formatDurationHMS( + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))) + .log("Total time"); } - static class DryRunLedgerCache implements LedgerCache { @Override public void close() { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java index 2d68b8d2da8..a0f715c214f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException; import org.apache.bookkeeper.bookie.stats.JournalStats; import org.apache.bookkeeper.common.collections.BatchedArrayBlockingQueue; @@ -61,16 +62,13 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.stats.ThreadRegistry; import org.apache.bookkeeper.util.IOUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provide journal related management. */ +@CustomLog public class Journal implements CheckpointSource { - private static final Logger LOG = LoggerFactory.getLogger(Journal.class); - private static final RecyclableArrayList.Recycler entryListRecycler = new RecyclableArrayList.Recycler(); @@ -197,10 +195,7 @@ void rollLog(LastLogMark lastMark) throws NoWritableLedgerDirException { // which is safe since records before lastMark have been // persisted to disk (both index & entry logger) lastMark.getCurMark().writeLogMark(bb); - - if (LOG.isDebugEnabled()) { - LOG.debug("RollLog to persist last marked log : {}", lastMark.getCurMark()); - } + log.debug().attr("curMark", lastMark.getCurMark()).log("RollLog to persist last marked log"); List writableLedgerDirs = ledgerDirsManager .getWritableLedgerDirsForNewLog(); @@ -214,12 +209,15 @@ void rollLog(LastLogMark lastMark) throws NoWritableLedgerDirException { fos.close(); fos = null; } catch (IOException e) { - LOG.error("Problems writing to " + file, e); + log.error() + .attr("file", file) + .exception(e) + .log("Problems writing to file"); } finally { // if stream already closed in try block successfully, // stream might have nullified, in such case below // call will simply returns - IOUtils.close(LOG, fos); + IOUtils.close(log, fos); } } } @@ -249,8 +247,11 @@ public void readLog() { curMark.setLogMark(mark.getLogFileId(), mark.getLogFileOffset()); } } catch (IOException e) { - LOG.error("Problems reading from " + file + " (this is okay if it is the first time starting this " - + "bookie"); + log.error() + .exception(e) + .attr("file", file) + .log("Problems reading from file " + + "(this is okay if it is the first time starting this bookie)"); } } } @@ -327,9 +328,10 @@ static QueueEntry create(ByteBuf entry, boolean ackBeforeSync, long ledgerId, lo @Override public void run() { long startTime = System.nanoTime(); - if (LOG.isDebugEnabled()) { - LOG.debug("Acknowledge Ledger: {}, Entry: {}", ledgerId, entryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Acknowledge"); journalAddEntryStats.registerSuccessfulEvent(MathUtils.elapsedNanos(enqueueTime), TimeUnit.NANOSECONDS); cb.writeComplete(0, ledgerId, entryId, null, ctx); callbackTime.addLatency(MathUtils.elapsedNanos(startTime), TimeUnit.NANOSECONDS); @@ -411,7 +413,7 @@ public void closeFileIfNecessary() { // Call close only once shouldClose = false; } catch (IOException ioe) { - LOG.error("I/O exception while closing file", ioe); + log.error().exception(ioe).log("I/O exception while closing file"); } } } @@ -481,14 +483,17 @@ public ForceWriteThread(Consumer threadToNotifyOnEx, } @Override public void run() { - LOG.info("ForceWrite Thread started"); + log.info("ForceWrite Thread started"); ThreadRegistry.register(super.getName()); if (conf.isBusyWaitEnabled()) { try { CpuAffinity.acquireCore(); } catch (Exception e) { - LOG.warn("Unable to acquire CPU core for Journal ForceWrite thread: {}", e.getMessage(), e); + log.warn() + .exception(e) + .exceptionMessage(e) + .log("Unable to acquire CPU core for Journal ForceWrite thread"); } } @@ -523,11 +528,11 @@ public void run() { BookieRequestHandler::flushPendingResponse); writeHandlers.clear(); } catch (IOException ioe) { - LOG.error("I/O exception in ForceWrite thread", ioe); + log.error().exception(ioe).log("I/O exception in ForceWrite thread"); running = false; } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.info("ForceWrite thread interrupted"); + log.info("ForceWrite thread interrupted"); running = false; } } @@ -700,14 +705,14 @@ public Journal(int journalIndex, File journalDirectory, ServerConfiguration conf lastMarkFileName = LAST_MARK_DEFAULT_NAME + "." + journalIndex; } lastLogMark.readLog(); - if (LOG.isDebugEnabled()) { - LOG.debug("Last Log Mark : {}", lastLogMark.getCurMark()); - } + log.debug().attr("lastMark", lastLogMark.getCurMark()).log("Last Log Mark"); try { this.fileChannelProvider = FileChannelProvider.newProvider(conf.getJournalChannelProvider()); } catch (IOException e) { - LOG.error("Failed to initiate file channel provider: {}", conf.getJournalChannelProvider()); + log.error() + .attr("journalChannelProvider", conf.getJournalChannelProvider()) + .log("Failed to initiate file channel provider"); throw new RuntimeException(e); } @@ -789,9 +794,9 @@ public void checkpointComplete(Checkpoint checkpoint, boolean compact) throws IO if (id < mark.getCurMark().getLogFileId()) { File journalFile = new File(journalDirectory, Long.toHexString(id) + ".txn"); if (!journalFile.delete()) { - LOG.warn("Could not delete old journal file {}", journalFile); + log.warn().attr("journalFile", journalFile).log("Could not delete old journal file"); } - LOG.info("garbage collected journal " + journalFile.getName()); + log.info().attr("journalFile", journalFile.getName()).log("garbage collected journal"); } } } @@ -852,7 +857,7 @@ public long scanJournal(long journalId, long journalPos, JournalScanner scanner, } isPaddingRecord = true; } else { - LOG.error("Invalid record found with negative length: {}", len); + log.error().attr("len", len).log("Invalid record found with negative length"); throw new IOException("Invalid record found with negative length " + len); } } @@ -874,7 +879,7 @@ public long scanJournal(long journalId, long journalPos, JournalScanner scanner, return recLog.fc.position(); } catch (IOException e) { if (skipInvalidRecord) { - LOG.warn("Failed to parse journal file, and skipInvalidRecord is true, skip this journal file reply"); + log.warn("Failed to parse journal file, and skipInvalidRecord is true, skip this journal file reply"); } else { throw e; } @@ -954,14 +959,17 @@ journalFormatVersionToWrite, getBufferedChannelBuilder(), * @see org.apache.bookkeeper.bookie.SyncThread */ public void run() { - LOG.info("Starting journal on {}", journalDirectory); + log.info().attr("journalDirectory", journalDirectory).log("Starting journal"); ThreadRegistry.register(journalThreadName); if (conf.isBusyWaitEnabled()) { try { CpuAffinity.acquireCore(); } catch (Exception e) { - LOG.warn("Unable to acquire CPU core for Journal thread: {}", e.getMessage(), e); + log.warn() + .exception(e) + .exceptionMessage(e) + .log("Unable to acquire CPU core for Journal thread"); } } @@ -1115,12 +1123,12 @@ public void run() { journalFlushWatcher.stop().elapsed(TimeUnit.NANOSECONDS), TimeUnit.NANOSECONDS); // Trace the lifetime of entries through persistence - if (LOG.isDebugEnabled()) { - for (QueueEntry e : toFlush) { - if (e != null && LOG.isDebugEnabled()) { - LOG.debug("Written and queuing for flush Ledger: {} Entry: {}", - e.ledgerId, e.entryId); - } + for (QueueEntry e : toFlush) { + if (e != null) { + log.debug() + .attr("ledgerId", e.ledgerId) + .attr("entryId", e.entryId) + .log("Written and queuing for flush"); } } @@ -1161,7 +1169,7 @@ public void run() { } if (!running) { - LOG.info("Journal Manager is asked to shut down, quit."); + log.info("Journal Manager is asked to shut down, quit."); break; } @@ -1213,22 +1221,22 @@ public void run() { } } } catch (IOException ioe) { - LOG.error("I/O exception in Journal thread!", ioe); + log.error().exception(ioe).log("I/O exception in Journal thread!"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.info("Journal exits when shutting down"); + log.info("Journal exits when shutting down"); } finally { // There could be packets queued for forceWrite on this logFile // That is fine as this exception is going to anyway take down // the bookie. If we execute this as a part of graceful shutdown, // close will flush the file system cache making any previous // cached writes durable so this is fine as well. - IOUtils.close(LOG, bc); + IOUtils.close(log, bc); if (journalAliveListener != null) { journalAliveListener.onJournalExit(); } } - LOG.info("Journal exited loop!"); + log.info("Journal exited loop!"); } public BufferedChannelBuilder getBufferedChannelBuilder() { @@ -1243,7 +1251,7 @@ public synchronized void shutdown() { if (!running) { return; } - LOG.info("Shutting down Journal"); + log.info("Shutting down Journal"); if (fileChannelProvider != null) { fileChannelProvider.close(); } @@ -1253,10 +1261,10 @@ public synchronized void shutdown() { running = false; this.interruptThread(); this.joinThread(); - LOG.info("Finished Shutting down Journal thread"); + log.info("Finished Shutting down Journal thread"); } catch (IOException | InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.warn("Interrupted during shutting down journal : ", ie); + log.warn().exception(ie).log("Interrupted during shutting down journal"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java index b3759b68787..94e46ae495b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java @@ -29,18 +29,17 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Arrays; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.util.PageCacheUtil; import org.apache.bookkeeper.util.ZeroBuffer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Simple wrapper around FileChannel to add versioning * information to the file. */ +@CustomLog class JournalChannel implements Closeable { - private static final Logger LOG = LoggerFactory.getLogger(JournalChannel.class); static final long MB = 1024 * 1024L; final BookieFileChannel channel; @@ -175,11 +174,12 @@ private JournalChannel(File journalDirectory, long logId, throw new IOException("Invalid journal format to write : version = " + formatVersionToWrite); } - LOG.info("Opening journal {}", fn); + log.info().attr("journal", fn).log("Opening journal"); if (!channel.fileExists(fn)) { // create new journal file to write, write version if (!fn.createNewFile()) { - LOG.error("Journal file {}, that shouldn't exist, already exists. " - + " is there another bookie process running?", fn); + log.error().attr("journal", fn) + .log("Journal file, that shouldn't exist, already exists." + + " is there another bookie process running?"); throw new IOException("File " + fn + " suddenly appeared, is another bookie process running?"); } @@ -219,7 +219,7 @@ private JournalChannel(File journalDirectory, long logId, + " Expected between (%d) and (%d), got (%d)", MIN_COMPAT_JOURNAL_FORMAT_VERSION, CURRENT_JOURNAL_FORMAT_VERSION, formatVersion); - LOG.error(err); + log.error(err); throw new IOException(err); } @@ -236,7 +236,7 @@ private JournalChannel(File journalDirectory, long logId, fc.position(position); } } catch (IOException e) { - LOG.error("Bookie journal file can seek to position :", e); + log.error().exception(e).log("Bookie journal file can seek to position"); throw e; } } @@ -266,7 +266,10 @@ private void writeHeader(Journal.BufferedChannelBuilder bcBuilder, public static void renameJournalFile(File source, File target) throws IOException { if (source == null || target == null || !source.renameTo(target)) { - LOG.error("Failed to rename file {} to {}", source, target); + log.error() + .attr("source", source) + .attr("target", target) + .log("Failed to rename file"); throw new IOException("Failed to rename file " + source + " to " + target); } } @@ -305,9 +308,7 @@ public void close() throws IOException { } public void forceWrite(boolean forceMetadata) throws IOException { - if (LOG.isDebugEnabled()) { - LOG.debug("Journal ForceWrite"); - } + log.debug("Journal ForceWrite"); long newForceWritePosition = bc.forceWrite(forceMetadata); // // For POSIX_FADV_DONTNEED, we want to drop from the beginning diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerCacheImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerCacheImpl.java index d7b2ab4b563..28a62c19e1e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerCacheImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerCacheImpl.java @@ -27,20 +27,19 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.PrimitiveIterator.OfLong; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.Watcher; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.SnapshotMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implementation of LedgerCache interface. * This class serves two purposes. */ +@CustomLog public class LedgerCacheImpl implements LedgerCache { - private static final Logger LOG = LoggerFactory.getLogger(LedgerCacheImpl.class); private final IndexInMemPageMgr indexPageManager; private final IndexPersistenceMgr indexPersistenceManager; @@ -135,9 +134,7 @@ public long getLastEntry(long ledgerId) throws IOException { */ @Override public void deleteLedger(long ledgerId) throws IOException { - if (LOG.isDebugEnabled()) { - LOG.debug("Deleting ledgerId: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Deleting ledger"); indexPageManager.removePagesForLedger(ledgerId); indexPersistenceManager.removeLedger(ledgerId); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java index 00edfb6a9c2..425194336f1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java @@ -27,18 +27,17 @@ import java.util.PrimitiveIterator.OfLong; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.BKException; import org.apache.bookkeeper.common.concurrent.FutureUtils; import org.apache.bookkeeper.common.util.Watcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implements a ledger inside a bookie. In particular, it implements operations * to write entries to a ledger and read entries from a ledger. */ +@CustomLog public class LedgerDescriptorImpl extends LedgerDescriptor { - private static final Logger LOG = LoggerFactory.getLogger(LedgerDescriptorImpl.class); final LedgerStorage ledgerStorage; private final long ledgerId; final byte[] masterKey; @@ -57,8 +56,10 @@ public class LedgerDescriptorImpl extends LedgerDescriptor { @Override void checkAccess(byte[] masterKey) throws BookieException, IOException { if (!Arrays.equals(this.masterKey, masterKey)) { - LOG.error("[{}] Requested master key {} does not match the cached master key {}", - this.ledgerId, Arrays.toString(masterKey), Arrays.toString(this.masterKey)); + log.error().attr("ledgerId", this.ledgerId) + .attr("requestedMasterKey", Arrays.toString(masterKey)) + .attr("cachedMasterKey", Arrays.toString(this.masterKey)) + .log("Requested master key does not match the cached master key"); throw BookieException.create(BookieException.Code.UnauthorizedAccessException); } } @@ -127,10 +128,10 @@ private CompletableFuture logFenceEntryInJournal(Journal journal) { ByteBuf entry = createLedgerFenceEntry(ledgerId); try { journal.logAddEntry(entry, false /* ackBeforeSync */, (rc, ledgerId, entryId, addr, ctx) -> { - if (LOG.isDebugEnabled()) { - LOG.debug("Record fenced state for ledger {} in journal with rc {}", - ledgerId, BKException.codeLogger(rc)); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("rc", BKException.codeLogger(rc)) + .log("Record fenced state for ledger in journal"); if (rc == 0) { fenceEntryPersisted.compareAndSet(false, true); result.complete(true); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java index 056a07622a1..8faf50ebae5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java @@ -32,19 +32,18 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.Gauge; import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.DiskChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class manages ledger directories used by the bookie. */ +@CustomLog public class LedgerDirsManager { - private static final Logger LOG = LoggerFactory.getLogger(LedgerDirsManager.class); private volatile List filledDirs; private final List ledgerDirectories; @@ -210,8 +209,10 @@ List getDirsAboveUsableThresholdSize(long thresholdSize, boolean loggingNo if (!fullLedgerDirsToAccommodate.isEmpty()) { if (loggingNoWritable) { - LOG.info("No writable ledger dirs below diskUsageThreshold. " - + "But Dirs that can accommodate {} are: {}", thresholdSize, fullLedgerDirsToAccommodate); + log.info() + .attr("thresholdSize", thresholdSize) + .attr("fullLedgerDirsToAccommodate", fullLedgerDirsToAccommodate) + .log("No writable ledger dirs below diskUsageThreshold. But Dirs that can accommodate are"); } return fullLedgerDirsToAccommodate; } @@ -221,7 +222,7 @@ List getDirsAboveUsableThresholdSize(long thresholdSize, boolean loggingNo String errMsg = "All ledger directories are non writable and no reserved space (" + thresholdSize + ") left."; NoWritableLedgerDirException e = new NoWritableLedgerDirException(errMsg); if (loggingNoWritable) { - LOG.error(errMsg, e); + log.error().exception(e).log(errMsg); } throw e; } @@ -246,7 +247,9 @@ public boolean isDirFull(File dir) { @VisibleForTesting public void addToFilledDirs(File dir) { if (!filledDirs.contains(dir)) { - LOG.warn(dir + " is out of space. Adding it to filled dirs list"); + log.warn() + .attr("directory", dir) + .log("Directory is out of space. Adding it to filled dirs list"); // Update filled dirs list List updatedFilledDirs = new ArrayList(filledDirs); updatedFilledDirs.add(dir); @@ -271,7 +274,7 @@ public void addToWritableDirs(File dir, boolean underWarnThreshold) { if (writableLedgerDirectories.contains(dir)) { return; } - LOG.info("{} becomes writable. Adding it to writable dirs list.", dir); + log.info().attr("directory", dir).log("becomes writable. Adding it to writable dirs list."); // Update writable dirs list List updatedWritableDirs = new ArrayList(writableLedgerDirectories); updatedWritableDirs.add(dir); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java index 47c4e7e428a..ded05be9f6f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java @@ -32,6 +32,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.LedgerDirsManager.LedgerDirsListener; import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -39,14 +40,12 @@ import org.apache.bookkeeper.util.DiskChecker.DiskErrorException; import org.apache.bookkeeper.util.DiskChecker.DiskOutOfSpaceException; import org.apache.bookkeeper.util.DiskChecker.DiskWarnThresholdException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Thread to monitor the disk space periodically. */ +@CustomLog class LedgerDirsMonitor { - private static final Logger LOG = LoggerFactory.getLogger(LedgerDirsMonitor.class); private final int interval; private final ServerConfiguration conf; @@ -85,7 +84,10 @@ private void check(final LedgerDirsManager ldm) { try { diskUsages.put(dir, diskChecker.checkDir(dir)); } catch (DiskErrorException e) { - LOG.error("Ledger directory {} failed on disk checking : ", dir, e); + log.error() + .exception(e) + .attr("directory", dir) + .log("Ledger directory failed on disk checking"); // Notify disk failure to all listeners for (LedgerDirsListener listener : ldm.getListeners()) { listener.diskFailed(dir); @@ -93,7 +95,10 @@ private void check(final LedgerDirsManager ldm) { } catch (DiskWarnThresholdException e) { diskUsages.compute(dir, (d, prevUsage) -> { if (null == prevUsage || e.getUsage() != prevUsage) { - LOG.warn("Ledger directory {} is almost full : usage {}", dir, e.getUsage()); + log.warn() + .attr("directory", dir) + .attr("usage", e.getUsage()) + .log("Ledger directory is almost full"); } return e.getUsage(); }); @@ -103,7 +108,10 @@ private void check(final LedgerDirsManager ldm) { } catch (DiskOutOfSpaceException e) { diskUsages.compute(dir, (d, prevUsage) -> { if (null == prevUsage || e.getUsage() != prevUsage) { - LOG.error("Ledger directory {} is out-of-space : usage {}", dir, e.getUsage()); + log.error() + .attr("directory", dir) + .attr("usage", e.getUsage()) + .log("Ledger directory is out-of-space"); } return e.getUsage(); }); @@ -118,7 +126,7 @@ private void check(final LedgerDirsManager ldm) { // bookie cannot get writable dir but considered to be writable ldm.getWritableLedgerDirs(); } catch (NoWritableLedgerDirException e) { - LOG.warn("LedgerDirsMonitor check process: All ledger directories are non writable"); + log.warn("LedgerDirsMonitor check process: All ledger directories are non writable"); try { // disk check can be frequent, so disable 'loggingNoWritable' to avoid log flooding. ldm.getDirsAboveUsableThresholdSize(minUsableSizeForHighPriorityWrites, false); @@ -142,11 +150,12 @@ private void check(final LedgerDirsManager ldm) { float totalDiskUsage = diskChecker.getTotalDiskUsage(ldm.getAllLedgerDirs()); if (totalDiskUsage < conf.getDiskLowWaterMarkUsageThreshold()) { makeWritable = true; - } else if (LOG.isDebugEnabled()) { - LOG.debug( - "Current TotalDiskUsage: {} is greater than LWMThreshold: {}." - + " So not adding any filledDir to WritableDirsList", - totalDiskUsage, conf.getDiskLowWaterMarkUsageThreshold()); + } else { + log.debug() + .attr("totalDiskUsage", totalDiskUsage) + .attr("lwmThreshold", conf.getDiskLowWaterMarkUsageThreshold()) + .log("Current TotalDiskUsage is greater than LWMThreshold." + + " So not adding any filledDir to WritableDirsList"); } } // Update all full-filled disk space usage @@ -175,7 +184,7 @@ private void check(final LedgerDirsManager ldm) { } } } catch (IOException ioe) { - LOG.error("Got IOException while monitoring Dirs", ioe); + log.error().exception(ioe).log("Got IOException while monitoring Dirs"); for (LedgerDirsListener listener : ldm.getListeners()) { listener.fatalError(); } @@ -236,10 +245,10 @@ public void start() { // shutdown disk monitoring daemon public void shutdown() { - LOG.info("Shutting down LedgerDirsMonitor"); + log.info("Shutting down LedgerDirsMonitor"); if (null != checkTask) { - if (checkTask.cancel(true) && LOG.isDebugEnabled()) { - LOG.debug("Failed to cancel check task in LedgerDirsMonitor"); + if (checkTask.cancel(true)) { + log.debug("Failed to cancel check task in LedgerDirsMonitor"); } } if (null != executor) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerEntryPage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerEntryPage.java index 98ea9484155..149397e1377 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerEntryPage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerEntryPage.java @@ -26,19 +26,17 @@ import java.util.NoSuchElementException; import java.util.PrimitiveIterator.OfLong; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.proto.BookieProtocol; import org.apache.bookkeeper.util.ZeroBuffer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is a page in the LedgerCache. It holds the locations * (entrylogfile, offset) for entry ids. */ +@CustomLog public class LedgerEntryPage implements AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(LedgerEntryPage.class); - private static final int indexEntrySize = 8; private final int pageSize; private final int entriesPerPage; @@ -199,14 +197,20 @@ public void readPage(FileInfo fi) throws IOException { + " tried to get " + page.capacity() + " from position " + getFirstEntryPosition() + " still need " + page.remaining(), sre); } catch (IllegalArgumentException iae) { - LOG.error("IllegalArgumentException when trying to read ledger {} from position {}", - getLedger(), getFirstEntryPosition(), iae); + log.error() + .exception(iae) + .attr("ledgerId", getLedger()) + .attr("position", getFirstEntryPosition()) + .log("IllegalArgumentException when trying to read ledger from position"); throw iae; } // make sure we don't include partial index entry if (page.remaining() != 0) { - LOG.info("Short page read of ledger {} : tried to read {} bytes from position {}, but only {} bytes read.", - getLedger(), page.capacity(), getFirstEntryPosition(), page.position()); + log.info() + .attr("ledgerId", getLedger()) + .attr("capacity", page.capacity()) + .attr("position", getFirstEntryPosition()).attr("bytesRead", page.position()) + .log("Short page read of ledger"); if (page.position() % indexEntrySize != 0) { int partialIndexEntryStart = page.position() - page.position() % indexEntrySize; page.putLong(partialIndexEntryStart, 0L); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LegacyCookieValidation.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LegacyCookieValidation.java index 2f15f6b4cfa..d89be742f6f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LegacyCookieValidation.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LegacyCookieValidation.java @@ -28,20 +28,19 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.discover.RegistrationManager; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Legacy implementation of CookieValidation. */ +@CustomLog public class LegacyCookieValidation implements CookieValidation { - private static final Logger log = LoggerFactory.getLogger(LegacyCookieValidation.class); private final ServerConfiguration conf; private final RegistrationManager registrationManager; @@ -113,10 +112,10 @@ public void checkCookies(List directories) throws BookieException { } else { // 5.3 Cookie-less directories and // we can't do anything with them - log.error("There are directories without a cookie," - + " and this is neither a new environment," - + " nor is storage expansion enabled. " - + "Empty directories are {}", missedCookieDirs); + log.error() + .attr("emptyDirs", missedCookieDirs) + .log("There are directories without a cookie, and this is neither a new " + + "environment, nor is storage expansion enabled"); throw new BookieException.InvalidCookieException(); } } else { @@ -127,7 +126,7 @@ public void checkCookies(List directories) throws BookieException { } } } catch (IOException ioe) { - log.error("Error accessing cookie on disks", ioe); + log.error().exception(ioe).log("Error accessing cookie on disks"); throw new BookieException.InvalidCookieException(ioe); } } @@ -223,7 +222,7 @@ private static void verifyDirsForNewEnvironment(List missedCookieDirs) } } if (!nonEmptyDirs.isEmpty()) { - log.error("Not all the new directories are empty. New directories that are not empty are: " + nonEmptyDirs); + log.error().attr("nonEmptyDirs", nonEmptyDirs).log("Not all the new directories are empty"); throw new BookieException.InvalidCookieException(); } } @@ -235,7 +234,7 @@ private static void stampNewCookie(ServerConfiguration conf, List dirs) throws BookieException, IOException { // backfill all the directories that miss cookies (for storage expansion) - log.info("Stamping new cookies on all dirs {}", dirs); + log.info().attr("dirs", dirs).log("Stamping new cookies on all dirs"); for (File dir : dirs) { masterCookie.writeToDirectory(dir); } @@ -272,10 +271,11 @@ private static void verifyDirsForStorageExpansion( } } if (dirsMissingData.size() > 0 || nonEmptyDirs.size() > 0) { - log.error("Either not all local directories have cookies or directories being added " - + " newly are not empty. " - + "Directories missing cookie file are: " + dirsMissingData - + " New directories that are not empty are: " + nonEmptyDirs); + log.error() + .attr("dirsMissingCookie", dirsMissingData) + .attr("nonEmptyDirs", nonEmptyDirs) + .log("Either not all local directories have cookies or directories " + + "being added newly are not empty"); throw new BookieException.InvalidCookieException(); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LocalBookieEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LocalBookieEnsemblePlacementPolicy.java index 7c949cb3d4b..58209aa91cc 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LocalBookieEnsemblePlacementPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LocalBookieEnsemblePlacementPolicy.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; import org.apache.bookkeeper.client.BookiesHealthInfo; @@ -37,18 +38,15 @@ import org.apache.bookkeeper.net.DNSToSwitchMapping; import org.apache.bookkeeper.proto.BookieAddressResolver; import org.apache.bookkeeper.stats.StatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Special ensemble placement policy that always return local bookie. Only works with ledgers with ensemble=1. * * @see EnsemblePlacementPolicy */ +@CustomLog public class LocalBookieEnsemblePlacementPolicy implements EnsemblePlacementPolicy { - static final Logger LOG = LoggerFactory.getLogger(LocalBookieEnsemblePlacementPolicy.class); - private BookieId bookieAddress; @Override @@ -64,7 +62,7 @@ public EnsemblePlacementPolicy initialize(ClientConfiguration conf, try { bookieAddress = BookieImpl.getBookieId(serverConf); } catch (UnknownHostException e) { - LOG.warn("Unable to get bookie address", e); + log.warn().exception(e).log("Unable to get bookie address"); throw new RuntimeException(e); } return this; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ReadOnlyBookie.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ReadOnlyBookie.java index eb9f2ec7d8c..d5ee131a20d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ReadOnlyBookie.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ReadOnlyBookie.java @@ -24,14 +24,13 @@ import io.netty.buffer.ByteBufAllocator; import java.io.IOException; import java.util.function.Supplier; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.discover.BookieServiceInfo; import org.apache.bookkeeper.discover.RegistrationManager; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.DiskChecker; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implements a read only bookie. @@ -39,10 +38,9 @@ * ReadOnlyBookie is force started as readonly, and will not change to writable. *

*/ +@CustomLog public class ReadOnlyBookie extends BookieImpl { - private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyBookie.class); - public ReadOnlyBookie(ServerConfiguration conf, RegistrationManager registrationManager, LedgerStorage storage, @@ -58,9 +56,9 @@ public ReadOnlyBookie(ServerConfiguration conf, stateManager.forceToReadOnly(); } else { String err = "Try to init ReadOnly Bookie, while ReadOnly mode is not enabled"; - LOG.error(err); + log.error(err); throw new IOException(err); } - LOG.info("Running bookie in force readonly mode."); + log.info("Running bookie in force readonly mode."); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java index 4cdedb36b23..441627737a5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java @@ -38,6 +38,7 @@ import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import lombok.Cleanup; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -53,8 +54,6 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.configuration2.ex.ConfigurationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Garbage collector implementation using scan and compare. @@ -70,10 +69,9 @@ * *

*/ +@CustomLog public class ScanAndCompareGarbageCollector implements GarbageCollector { - static final Logger LOG = LoggerFactory.getLogger(ScanAndCompareGarbageCollector.class); - private final LedgerManager ledgerManager; private final CompactableLedgerStorage ledgerStorage; private final ServerConfiguration conf; @@ -101,8 +99,11 @@ public ScanAndCompareGarbageCollector(LedgerManager ledgerManager, CompactableLe this.enableGcOverReplicatedLedger = true; } this.maxConcurrentRequests = conf.getGcOverreplicatedLedgerMaxConcurrentRequests(); - LOG.info("Over Replicated Ledger Deletion : enabled={}, interval={}, maxConcurrentRequests={}", - enableGcOverReplicatedLedger, gcOverReplicatedLedgerIntervalMillis, maxConcurrentRequests); + log.info() + .attr("enableGcOverReplicatedLedger", enableGcOverReplicatedLedger) + .attr("gcOverReplicatedLedgerIntervalMillis", gcOverReplicatedLedgerIntervalMillis) + .attr("maxConcurrentRequests", maxConcurrentRequests) + .log("Over Replicated Ledger Deletion"); verifyMetadataOnGc = conf.getVerifyMetadataOnGC(); this.gcMetadataOpRateLimiter = RateLimiter.create(conf.getGcMetadataOpRateLimit()); @@ -132,14 +133,18 @@ public void gc(GarbageCleaner garbageCleaner) { boolean checkOverreplicatedLedgers = (enableGcOverReplicatedLedger && curTime - lastOverReplicatedLedgerGcTimeMillis > gcOverReplicatedLedgerIntervalMillis); if (checkOverreplicatedLedgers) { - LOG.info("Start removing over-replicated ledgers. activeLedgerCounter={}", activeLedgerCounter); + log.info() + .attr("activeLedgerCounter", activeLedgerCounter) + .log("Start removing over-replicated ledgers. activeLedgerCounter="); // remove all the overreplicated ledgers from the local bookie Set overReplicatedLedgers = removeOverReplicatedledgers(bkActiveLedgers, garbageCleaner); if (overReplicatedLedgers.isEmpty()) { - LOG.info("No over-replicated ledgers found."); + log.info("No over-replicated ledgers found."); } else { - LOG.info("Removed over-replicated ledgers: {}", overReplicatedLedgers); + log.info() + .attr("overReplicatedLedgers", overReplicatedLedgers) + .log("Removed over-replicated ledgers"); } lastOverReplicatedLedgerGcTimeMillis = System.currentTimeMillis(); } @@ -168,10 +173,10 @@ public void gc(GarbageCleaner garbageCleaner) { } Iterable subBkActiveLedgers = bkActiveLedgers.subSet(start, true, end, true); - - if (LOG.isDebugEnabled()) { - LOG.debug("Active in metadata {}, Active in bookie {}", ledgersInMetadata, subBkActiveLedgers); - } + log.debug() + .attr("ledgersInMetadata", ledgersInMetadata) + .attr("subBkActiveLedgers", subBkActiveLedgers) + .log("Active ledgers in metadata and bookie"); for (Long bkLid : subBkActiveLedgers) { if (!ledgersInMetadata.contains(bkLid)) { if (verifyMetadataOnGc) { @@ -186,8 +191,10 @@ public void gc(GarbageCleaner garbageCleaner) { if (e instanceof BKException) { rc = ((BKException) e).getCode(); } else { - LOG.warn("Time-out while fetching metadata for Ledger {} : {}.", bkLid, - e.getMessage()); + log.warn() + .attr("bkLid", bkLid) + .exceptionMessage(e) + .log("Time-out while fetching metadata for Ledger"); continue; } @@ -205,8 +212,11 @@ public void gc(GarbageCleaner garbageCleaner) { continue; } } else if (rc != BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { - LOG.warn("Ledger {} Missing in metadata list, but ledgerManager returned rc: {}.", - bkLid, rc); + log.warn() + .attr("bkLid", bkLid) + .attr("rc", rc) + .log("Ledger missing in metadata list, " + + "but ledgerManager returned unexpected rc"); continue; } } @@ -216,7 +226,7 @@ public void gc(GarbageCleaner garbageCleaner) { } } catch (Throwable t) { // ignore exception, collecting garbage next time - LOG.warn("Exception when iterating over the metadata", t); + log.warn().exception(t).log("Exception when iterating over the metadata"); } } @@ -249,8 +259,11 @@ private Set removeOverReplicatedledgers(Set bkActiveledgers, final G } } catch (Throwable t) { if (!(t.getCause() instanceof BKException.BKNoSuchLedgerExistsOnMetadataServerException)) { - LOG.warn("Failed to get metadata for ledger {}. {}: {}", - ledgerId, t.getClass().getName(), t.getMessage()); + log.warn() + .attr("ledgerId", ledgerId) + .attr("exceptionType", t.getClass().getName()) + .exceptionMessage(t) + .log("Failed to get metadata for ledger"); } latch.countDown(); continue; @@ -280,8 +293,11 @@ private Set removeOverReplicatedledgers(Set bkActiveledgers, final G } } else if (!(exception instanceof BKException.BKNoSuchLedgerExistsOnMetadataServerException)) { - LOG.warn("Failed to get metadata for ledger {}. {}: {}", - ledgerId, exception.getClass().getName(), exception.getMessage()); + log.warn() + .attr("ledgerId", ledgerId) + .attr("exceptionType", exception.getClass().getName()) + .exceptionMessage(exception) + .log("Failed to get metadata for ledger"); } } finally { semaphore.release(); @@ -289,13 +305,17 @@ private Set removeOverReplicatedledgers(Set bkActiveledgers, final G try { lum.releaseUnderreplicatedLedger(ledgerId); } catch (Throwable t) { - LOG.error("Exception when removing underreplicated lock for ledger {}", - ledgerId, t); + log.error() + .exception(t) + .attr("ledgerId", ledgerId) + .log("Exception when removing underreplicated lock for ledger"); } } }); } catch (Throwable t) { - LOG.error("Exception when iterating through the ledgers to check for over-replication", t); + log.error() + .exception(t) + .log("Exception when iterating through the ledgers to check for over-replication"); latch.countDown(); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SortedLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SortedLedgerStorage.java index 689668eb938..bc3d586008c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SortedLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SortedLedgerStorage.java @@ -33,6 +33,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; import org.apache.bookkeeper.common.util.Watcher; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -40,8 +41,6 @@ import org.apache.bookkeeper.proto.BookieProtocol; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.IteratorUtility; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A {@code SortedLedgerStorage} is an extension of {@link InterleavedLedgerStorage}. It @@ -49,10 +48,10 @@ * entries will be first added into a {@code MemTable}, and then be flushed back to the * {@code InterleavedLedgerStorage} when the {@code MemTable} becomes full. */ +@CustomLog public class SortedLedgerStorage implements LedgerStorage, CacheCallback, SkipListFlusher, CompactableLedgerStorage, DefaultEntryLogger.EntryLogListener { - private static final Logger LOG = LoggerFactory.getLogger(SortedLedgerStorage.class); EntryMemTable memTable; private ScheduledExecutorService scheduler; @@ -133,7 +132,7 @@ public void start() { try { flush(); } catch (IOException e) { - LOG.error("Exception thrown while flushing ledger cache.", e); + log.error().exception(e).log("Exception thrown while flushing ledger cache."); } interleavedLedgerStorage.start(); } @@ -148,7 +147,7 @@ public void shutdown() throws InterruptedException { try { memTable.close(); } catch (Exception e) { - LOG.error("Error while closing the memtable", e); + log.error().exception(e).log("Error while closing the memtable"); } interleavedLedgerStorage.shutdown(); } @@ -301,10 +300,10 @@ public void flush() throws IOException { // CacheCallback functions. @Override public void onSizeLimitReached(final Checkpoint cp) throws IOException { - LOG.info("Reached size {}", cp); + log.info().attr("checkpoint", cp).log("Reached size"); // when size limit reached, we get the previous checkpoint from snapshot mem-table. // at this point, we are safer to schedule a checkpoint, since the entries added before - // this checkpoint already written to entry logger. + // this checkpoint already written to entry log. // but it would be better not to let mem-table flush to different entry log files, // so we roll entry log files in SortedLedgerStorage itself. // After that, we could make the process writing data to entry logger file not bound with checkpoint. @@ -316,7 +315,7 @@ public void onSizeLimitReached(final Checkpoint cp) throws IOException { @Override public void run() { try { - LOG.info("Started flushing mem table."); + log.info("Started flushing mem table."); interleavedLedgerStorage.getEntryLogger().prepareEntryMemTableFlush(); memTable.flush(SortedLedgerStorage.this); if (interleavedLedgerStorage.getEntryLogger().commitEntryMemTableFlush()) { @@ -324,7 +323,7 @@ public void run() { } } catch (Exception e) { stateManager.transitionToReadOnlyMode(); - LOG.error("Exception thrown while flushing skip list cache.", e); + log.error().exception(e).log("Exception thrown while flushing skip list cache."); } } }); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java index 3b77cf45f10..f6a4b9def0c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/SyncThread.java @@ -29,8 +29,8 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import lombok.AccessLevel; +import lombok.CustomLog; import lombok.Getter; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint; import org.apache.bookkeeper.bookie.LedgerDirsManager.LedgerDirsListener; import org.apache.bookkeeper.bookie.LedgerDirsManager.NoWritableLedgerDirException; @@ -57,7 +57,7 @@ * for manual recovery in critical disaster. *

*/ -@Slf4j +@CustomLog class SyncThread implements Checkpointer { @Getter(AccessLevel.PACKAGE) @@ -117,7 +117,7 @@ protected void doCheckpoint(Checkpoint checkpoint) { checkpoint(checkpoint); } } catch (Throwable t) { - log.error("Exception in SyncThread", t); + log.error().exception(t).log("Exception in SyncThread"); dirsListener.fatalError(); } finally { syncExecutorTime.addLatency(MathUtils.elapsedNanos(startTime), TimeUnit.NANOSECONDS); @@ -131,7 +131,7 @@ public Future requestFlush() { try { flush(); } catch (Throwable t) { - log.error("Exception flushing ledgers ", t); + log.error().exception(t).log("Exception flushing ledgers"); } finally { syncExecutorTime.addLatency(MathUtils.elapsedNanos(startTime), TimeUnit.NANOSECONDS); } @@ -143,11 +143,11 @@ private void flush() { try { ledgerStorage.flush(); } catch (NoWritableLedgerDirException e) { - log.error("No writeable ledger directories", e); + log.error().exception(e).log("No writeable ledger directories"); dirsListener.allDisksFull(true); return; } catch (IOException e) { - log.error("Exception flushing ledgers", e); + log.error().exception(e).log("Exception flushing ledgers"); return; } @@ -155,11 +155,11 @@ private void flush() { return; } - log.info("Flush ledger storage at checkpoint {}.", checkpoint); + log.info().attr("checkpoint", checkpoint).log("Flush ledger storage at checkpoint"); try { checkpointSource.checkpointComplete(checkpoint, false); } catch (IOException e) { - log.error("Exception marking checkpoint as complete", e); + log.error().exception(e).log("Exception marking checkpoint as complete"); dirsListener.allDisksFull(true); } } @@ -174,18 +174,18 @@ public void checkpoint(Checkpoint checkpoint) { try { ledgerStorage.checkpoint(checkpoint); } catch (NoWritableLedgerDirException e) { - log.error("No writeable ledger directories", e); + log.error().exception(e).log("No writeable ledger directories"); dirsListener.allDisksFull(true); return; } catch (IOException e) { - log.error("Exception flushing ledgers", e); + log.error().exception(e).log("Exception flushing ledgers"); return; } try { checkpointSource.checkpointComplete(checkpoint, true); } catch (IOException e) { - log.error("Exception marking checkpoint as complete", e); + log.error().exception(e).log("Exception marking checkpoint as complete"); dirsListener.allDisksFull(true); } } @@ -230,8 +230,8 @@ void shutdown() throws InterruptedException { long start = System.currentTimeMillis(); while (!executor.awaitTermination(5, TimeUnit.MINUTES)) { long now = System.currentTimeMillis(); - log.info("SyncThread taking a long time to shutdown. Has taken {}" - + " milliseconds so far", now - start); + log.info().attr("elapsedMs", now - start) + .log("SyncThread taking a long time to shutdown"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/TransactionalEntryLogCompactor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/TransactionalEntryLogCompactor.java index 9a27bcccd89..2b0cde5387b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/TransactionalEntryLogCompactor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/TransactionalEntryLogCompactor.java @@ -25,12 +25,11 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.CompactionEntryLog; import org.apache.bookkeeper.bookie.storage.EntryLogScanner; import org.apache.bookkeeper.bookie.storage.EntryLogger; import org.apache.bookkeeper.conf.ServerConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class is used for compaction. Compaction is done in several transactional phases. @@ -39,10 +38,9 @@ * Phase 3: Flush ledger cache and .compacted file becomes .log file when this completes. Remove old * entry log file afterwards. */ +@CustomLog public class TransactionalEntryLogCompactor extends AbstractLogCompactor { - private static final Logger LOG = LoggerFactory.getLogger(TransactionalEntryLogCompactor.class); - final EntryLogger entryLogger; final CompactableLedgerStorage ledgerStorage; final List offsets = new ArrayList<>(); @@ -68,9 +66,11 @@ public TransactionalEntryLogCompactor( @Override public void cleanUpAndRecover() { // clean up compacting logs and recover index for already compacted logs - for (CompactionEntryLog log : entryLogger.incompleteCompactionLogs()) { - LOG.info("Found compacted log file {} has partially flushed index, recovering index.", log); - CompactionPhase updateIndex = new UpdateIndexPhase(log, true); + for (CompactionEntryLog compLog : entryLogger.incompleteCompactionLogs()) { + log.info() + .attr("compactionLog", compLog) + .log("Found compacted log file has partially flushed index, recovering index."); + CompactionPhase updateIndex = new UpdateIndexPhase(compLog, true); updateIndex.run(); } } @@ -78,33 +78,41 @@ public void cleanUpAndRecover() { @Override public boolean compact(EntryLogMetadata metadata) { if (metadata != null) { - LOG.info("Compacting entry log {} with usage {}.", - metadata.getEntryLogId(), metadata.getUsage()); + log.info() + .attr("entryLogId", metadata.getEntryLogId()) + .attr("usage", metadata.getUsage()) + .log("Compacting entry log"); CompactionEntryLog compactionLog; try { compactionLog = entryLogger.newCompactionLog(metadata.getEntryLogId()); } catch (IOException ioe) { - LOG.error("Exception creating new compaction entry log", ioe); + log.error().exception(ioe).log("Exception creating new compaction entry log"); return false; } CompactionPhase scanEntryLog = new ScanEntryLogPhase(metadata, compactionLog); if (!scanEntryLog.run()) { - LOG.info("Compaction for entry log {} end in ScanEntryLogPhase.", metadata.getEntryLogId()); + log.info() + .attr("entryLogId", metadata.getEntryLogId()) + .log("Compaction for entry log end in ScanEntryLogPhase."); return false; } CompactionPhase flushCompactionLog = new FlushCompactionLogPhase(compactionLog); if (!flushCompactionLog.run()) { - LOG.info("Compaction for entry log {} end in FlushCompactionLogPhase.", metadata.getEntryLogId()); + log.info() + .attr("entryLogId", metadata.getEntryLogId()) + .log("Compaction for entry log end in FlushCompactionLogPhase."); return false; } CompactionPhase updateIndex = new UpdateIndexPhase(compactionLog); if (!updateIndex.run()) { - LOG.info("Compaction for entry log {} end in UpdateIndexPhase.", metadata.getEntryLogId()); + log.info() + .attr("entryLogId", metadata.getEntryLogId()) + .log("Compaction for entry log end in UpdateIndexPhase."); return false; } - LOG.info("Compacted entry log : {}.", metadata.getEntryLogId()); + log.info().attr("entryLogId", metadata.getEntryLogId()).log("Compacted entry log"); return true; } return false; @@ -125,7 +133,10 @@ boolean run() { start(); return complete(); } catch (IOException e) { - LOG.error("Encounter exception in compaction phase {}. Abort current compaction.", phaseName, e); + log.error() + .exception(e) + .attr("phaseName", phaseName) + .log("Encountered exception in compaction phase, aborting current compaction"); abort(); } return false; @@ -175,18 +186,21 @@ public void process(long ledgerId, long offset, ByteBuf entry) throws IOExceptio long lid = entry.getLong(entry.readerIndex()); long entryId = entry.getLong(entry.readerIndex() + 8); if (lid != ledgerId || entryId < -1) { - LOG.warn("Scanning expected ledgerId {}, but found invalid entry " - + "with ledgerId {} entryId {} at offset {}", - ledgerId, lid, entryId, offset); + log.warn() + .attr("expectedLedgerId", ledgerId) + .attr("ledgerId", lid) + .attr("entryId", entryId) + .attr("offset", offset) + .log("Scanning expected ledger, but found invalid entry"); throw new IOException("Invalid entry found @ offset " + offset); } long newOffset = compactionLog.addEntry(ledgerId, entry); offsets.add(new EntryLocation(ledgerId, entryId, newOffset)); - - if (LOG.isDebugEnabled()) { - LOG.debug("Compact add entry : lid = {}, eid = {}, offset = {}", - ledgerId, entryId, newOffset); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("newOffset", newOffset) + .log("Compact add entry"); } } }); @@ -196,7 +210,7 @@ public void process(long ledgerId, long offset, ByteBuf entry) throws IOExceptio boolean complete() { if (offsets.isEmpty()) { // no valid entries is compacted, delete entry log file - LOG.info("No valid entry is found in entry log after scan, removing entry log now."); + log.info("No valid entry is found in entry log after scan, removing entry log now."); logRemovalListener.removeEntryLog(metadata.getEntryLogId()); compactionLog.abort(); compactingLogWriteDone(); @@ -247,7 +261,7 @@ boolean complete() throws IOException { compactionLog.markCompacted(); return true; } catch (IOException ioe) { - LOG.warn("Error marking compaction as done", ioe); + log.warn().exception(ioe).log("Error marking compaction as done"); return false; } finally { compactingLogWriteDone(); @@ -330,16 +344,22 @@ public void process(long ledgerId, long offset, ByteBuf entry) throws IOExceptio long lid = entry.getLong(entry.readerIndex()); long entryId = entry.getLong(entry.readerIndex() + 8); if (lid != ledgerId || entryId < -1) { - LOG.warn("Scanning expected ledgerId {}, but found invalid entry " - + "with ledgerId {} entryId {} at offset {}", - ledgerId, lid, entryId, offset); + log.warn() + .attr("expectedLedgerId", ledgerId) + .attr("ledgerId", lid) + .attr("entryId", entryId) + .attr("offset", offset) + .log("Scanning expected ledger, but found invalid entry"); throw new IOException("Invalid entry found @ offset " + offset); } long location = (compactionLog.getDstLogId() << 32L) | (offset + 4); offsets.add(new EntryLocation(lid, entryId, location)); } }); - LOG.info("Recovered {} entry locations from compacted log {}", offsets.size(), compactionLog.getDstLogId()); + log.info() + .attr("size", offsets.size()) + .attr("dstLogId", compactionLog.getDstLogId()) + .log("Recovered entry locations from compacted log"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/UncleanShutdownDetectionImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/UncleanShutdownDetectionImpl.java index 33192c3092b..96f4e9716df 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/UncleanShutdownDetectionImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/UncleanShutdownDetectionImpl.java @@ -23,8 +23,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * Used to determine if the prior shutdown was unclean or not. It does so @@ -34,8 +33,8 @@ * and so on the subsequent boot-up, the presence of any of these files will * indicate an unclean shutdown. */ +@CustomLog public class UncleanShutdownDetectionImpl implements UncleanShutdownDetection { - private static final Logger LOG = LoggerFactory.getLogger(UncleanShutdownDetectionImpl.class); private final LedgerDirsManager ledgerDirsManager; static final String DIRTY_FILENAME = "DIRTY"; @@ -49,15 +48,18 @@ public void registerStartUp() throws IOException { try { File dirtyFile = new File(ledgerDir, DIRTY_FILENAME); if (dirtyFile.createNewFile()) { - LOG.info("Created dirty file in ledger dir: {}", ledgerDir.getAbsolutePath()); + log.info().attr("ledgerDir", ledgerDir.getAbsolutePath()).log("Created dirty file in ledger dir"); } else { - LOG.info("Dirty file already exists in ledger dir: {}", ledgerDir.getAbsolutePath()); + log.info().attr("ledgerDir", ledgerDir.getAbsolutePath()) + .log("Dirty file already exists in ledger dir"); } } catch (IOException e) { - LOG.error("Unable to register start-up (so an unclean shutdown cannot" - + " be detected). Dirty file of ledger dir {} could not be created.", - ledgerDir.getAbsolutePath(), e); + log.error() + .exception(e) + .attr("ledgerDir", ledgerDir.getAbsolutePath()) + .log("Unable to register start-up (so an unclean shutdown cannot" + + " be detected). Dirty file of ledger dir could not be created."); throw e; } } @@ -72,19 +74,20 @@ public void registerCleanShutdown() { boolean deleted = dirtyFile.delete(); if (!deleted) { - LOG.error("Unable to register a clean shutdown. The dirty file of " - + " ledger dir {} could not be deleted.", - ledgerDir.getAbsolutePath()); + log.error().attr("ledgerDir", ledgerDir.getAbsolutePath()) + .log("Unable to register a clean shutdown. The dirty file of" + + " ledger dir could not be deleted."); } } else { - LOG.error("Unable to register a clean shutdown. The dirty file of " - + " ledger dir {} does not exist.", - ledgerDir.getAbsolutePath()); + log.error().attr("ledgerDir", ledgerDir.getAbsolutePath()) + .log("Unable to register a clean shutdown. The dirty file of ledger dir does not exist."); } } catch (Throwable t) { - LOG.error("Unable to register a clean shutdown. An error occurred while deleting " - + " the dirty file of ledger dir {}.", - ledgerDir.getAbsolutePath(), t); + log.error() + .exception(t) + .attr("ledgerDir", ledgerDir.getAbsolutePath()) + .log("Unable to register a clean shutdown. An error occurred while deleting" + + " the dirty file of ledger dir."); } } } @@ -102,13 +105,13 @@ public boolean lastShutdownWasUnclean() { } } } catch (Throwable t) { - LOG.error("Unable to determine if last shutdown was unclean (defaults to unclean)", t); + log.error().exception(t).log("Unable to determine if last shutdown was unclean (defaults to unclean)"); unclean = true; } if (!dirtyFiles.isEmpty()) { - LOG.info("Dirty files exist on boot-up indicating an unclean shutdown. Dirty files: {}", - String.join(",", dirtyFiles)); + log.info().attr("dirtyFiles", String.join(",", dirtyFiles)) + .log("Dirty files exist on boot-up indicating an unclean shutdown"); } return unclean; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/DataIntegrityCookieValidation.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/DataIntegrityCookieValidation.java index a861d38e604..3e9da084d20 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/DataIntegrityCookieValidation.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/DataIntegrityCookieValidation.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.Cookie; @@ -37,8 +38,6 @@ import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * An implementation of the CookieValidation interface that allows for auto-stamping @@ -46,8 +45,8 @@ * Because the data integrity service can heal a bookie with lost data due to a disk * failure, a bookie can auto stamp new cookies as part of the healing process. */ +@CustomLog public class DataIntegrityCookieValidation implements CookieValidation { - private static final Logger log = LoggerFactory.getLogger(DataIntegrityCookieValidation.class); private final ServerConfiguration conf; private final BookieId bookieId; private final RegistrationManager registrationManager; @@ -93,10 +92,10 @@ private void stampCookie(Cookie masterCookie, Version expectedVersion, List directories) } else if (!regManagerCookie.get().getValue().equals(masterCookie) || !directoryCookies.stream().allMatch(c -> c.map(masterCookie::equals).orElse(false))) { if (conf.isDataIntegrityStampMissingCookiesEnabled()) { - log.warn("ZK cookie({}) or directory cookies({}) do not match master cookie ({}), running check", - regManagerCookie, directoryCookies, masterCookie); + log.warn() + .attr("zkCookie", regManagerCookie) + .attr("directoryCookies", directoryCookies) + .attr("masterCookie", masterCookie) + .log("ZK cookie or directory cookies do not match master cookie, running check"); try { dataIntegCheck.runPreBootCheck("INVALID_COOKIE").get(); } catch (ExecutionException ee) { @@ -156,7 +158,12 @@ public void checkCookies(List directories) "ZK cookie({0}) or directory cookies({1}) do not match master cookie ({2})" + " and missing cookie stamping is disabled.", regManagerCookie, directoryCookies, masterCookie); - log.error(errorMsg); + log.error() + .attr("zkCookie", regManagerCookie) + .attr("directoryCookies", directoryCookies) + .attr("masterCookie", masterCookie) + .log("ZK cookie or directory cookies do not match master cookie" + + " and missing cookie stamping is disabled"); throw new BookieException.InvalidCookieException(errorMsg); } } // else all cookies match the masterCookie, meaning nothing has changed in the configuration diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/WriteSets.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/WriteSets.java index ff9274d982e..be4027da8c4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/WriteSets.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/datainteg/WriteSets.java @@ -25,14 +25,11 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Pregenerate the write sets. RoundRobinDistributionSchedule should really be doing this also. */ class WriteSets { - private static final Logger log = LoggerFactory.getLogger(WriteSets.class); private final int ensembleSize; private final ImmutableList> sets; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/EntryLocationIndex.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/EntryLocationIndex.java index a353b7cf7ee..bdc1bf94649 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/EntryLocationIndex.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/EntryLocationIndex.java @@ -26,6 +26,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.EntryLocation; import org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorage.Batch; @@ -34,8 +35,6 @@ import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.collections.ConcurrentLongHashSet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Maintains an index of the entry locations in the EntryLogger. @@ -43,6 +42,7 @@ *

For each ledger multiple entries are stored in the same "record", represented * by the {@link LedgerIndexPage} class. */ +@CustomLog public class EntryLocationIndex implements Closeable { private final KeyValueStorage locationsDb; @@ -78,9 +78,10 @@ public long getLocation(long ledgerId, long entryId) throws IOException { boolean operationSuccess = false; try { if (locationsDb.get(key.array, value.array) < 0) { - if (log.isDebugEnabled()) { - log.debug("Entry not found {}@{} in db index", ledgerId, entryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Entry not found in db index"); return 0; } operationSuccess = true; @@ -101,9 +102,7 @@ public long getLocation(long ledgerId, long entryId) throws IOException { public long getLastEntryInLedger(long ledgerId) throws IOException { if (deletedLedgers.contains(ledgerId)) { // Ledger already deleted - if (log.isDebugEnabled()) { - log.debug("Ledger {} already deleted in db", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ledger already deleted in db"); /** * when Ledger already deleted, * throw Bookie.NoEntryException same like the method @@ -136,9 +135,10 @@ private long getLastEntryInLedgerInternal(long ledgerId) throws IOException { long lastEntryId = ArrayUtil.getLong(entry.getKey(), 8); if (foundLedgerId == ledgerId) { - if (log.isDebugEnabled()) { - log.debug("Found last page in storage db for ledger {} - last entry: {}", ledgerId, lastEntryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("lastEntryId", lastEntryId) + .log("Found last page in storage db for ledger"); return lastEntryId; } else { throw new Bookie.NoEntryException(ledgerId, -1); @@ -161,9 +161,11 @@ public void addLocation(Batch batch, long ledgerId, long entryId, long location) LongPairWrapper key = LongPairWrapper.get(ledgerId, entryId); LongWrapper value = LongWrapper.get(location); - if (log.isDebugEnabled()) { - log.debug("Add location - ledger: {} -- entry: {} -- location: {}", ledgerId, entryId, location); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("location", location) + .log("Add location"); try { batch.put(key.array, value.array); @@ -174,16 +176,15 @@ public void addLocation(Batch batch, long ledgerId, long entryId, long location) } public void updateLocations(Iterable newLocations) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Update locations -- {}", Iterables.size(newLocations)); - } + log.debug(e -> e.attr("count", Iterables.size(newLocations)).log("Update locations")); try (Batch batch = newBatch()) { // Update all the ledger index pages with the new locations for (EntryLocation e : newLocations) { - if (log.isDebugEnabled()) { - log.debug("Update location - ledger: {} -- entry: {}", e.ledger, e.entry); - } + log.debug() + .attr("ledgerId", e.ledger) + .attr("entryId", e.entry) + .log("Update location"); addLocation(batch, e.ledger, e.entry, e.location); } @@ -224,14 +225,12 @@ public void removeOffsetFromDeletedLedgers() throws IOException { LongPairWrapper firstKeyWrapper = LongPairWrapper.get(-1, -1); LongPairWrapper lastKeyWrapper = LongPairWrapper.get(-1, -1); - log.info("Deleting indexes for ledgers: {}", ledgersToDelete); + log.info().attr("ledgers", ledgersToDelete).log("Deleting indexes for ledgers"); long startTime = System.nanoTime(); try (Batch batch = locationsDb.newBatch()) { for (long ledgerId : ledgersToDelete) { - if (log.isDebugEnabled()) { - log.debug("Deleting indexes from ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Deleting indexes from ledger"); firstKeyWrapper.set(ledgerId, 0); lastKeyWrapper.set(ledgerId, Long.MAX_VALUE); @@ -248,9 +247,9 @@ public void removeOffsetFromDeletedLedgers() throws IOException { lastKeyWrapper.recycle(); } - log.info("Deleted indexes from {} ledgers in {} seconds", ledgersToDelete.size(), - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) / 1000.0); + log.info().attr("count", ledgersToDelete.size()) + .attr("durationSeconds", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) / 1000.0) + .log("Deleted indexes from ledgers"); } - private static final Logger log = LoggerFactory.getLogger(EntryLocationIndex.class); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java index 1caea81be2c..97ce8d02df0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java @@ -39,6 +39,7 @@ import java.util.Map.Entry; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageFactory.DbConfigType; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.commons.lang3.StringUtils; @@ -65,12 +66,11 @@ import org.rocksdb.Slice; import org.rocksdb.WriteBatch; import org.rocksdb.WriteOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * RocksDB based implementation of the KeyValueStorage. */ +@CustomLog public class KeyValueStorageRocksDB implements KeyValueStorage { static KeyValueStorageFactory factory = (defaultBasePath, subPath, dbConfigType, conf) -> @@ -135,7 +135,7 @@ public KeyValueStorageRocksDB(String basePath, String subPath, DbConfigType dbCo } else { dbFilePath = conf.getDefaultRocksDBConf(); } - log.info("Searching for a RocksDB configuration file in {}", dbFilePath); + log.info().attr("path", dbFilePath).log("Searching for a RocksDB configuration file"); if (StringUtils.isNotBlank(dbFilePath) && Paths.get(dbFilePath).toFile().exists()) { log.info("Found a RocksDB configuration file and using it to initialize the RocksDB"); db = initializeRocksDBWithConfFile(basePath, subPath, dbConfigType, conf, readOnly, dbFilePath); @@ -169,7 +169,10 @@ private RocksDB initializeRocksDBWithConfFile(String basePath, String subPath, D if (!logPath.isEmpty()) { Path logPathSetting = FileSystems.getDefault().getPath(logPath, subPath); Files.createDirectories(logPathSetting); - log.info("RocksDB<{}> log path: {}", subPath, logPathSetting); + log.info() + .attr("subPath", subPath) + .attr("logPath", logPathSetting) + .log("RocksDB log path"); dbOptions.setDbLogDir(logPathSetting.toString()); } this.dbPath = FileSystems.getDefault().getPath(basePath, subPath).toFile().toString(); @@ -253,7 +256,10 @@ private RocksDB initializeRocksDBWithBookieConf(String basePath, String subPath, if (!logPath.isEmpty()) { Path logPathSetting = FileSystems.getDefault().getPath(logPath, subPath); Files.createDirectories(logPathSetting); - log.info("RocksDB<{}> log path: {}", subPath, logPathSetting); + log.info() + .attr("subPath", subPath) + .attr("logPath", logPathSetting) + .log("RocksDB log path"); options.setDbLogDir(logPathSetting.toString()); } this.dbPath = FileSystems.getDefault().getPath(basePath, subPath).toFile().toString(); @@ -274,7 +280,7 @@ private RocksDB initializeRocksDBWithBookieConf(String basePath, String subPath, options.setInfoLogLevel(InfoLogLevel.ERROR_LEVEL); break; default: - log.warn("Unrecognized RockDB log level: {}", logLevel); + log.warn().attr("logLevel", logLevel).log("Unrecognized RockDB log level"); } // Keep log files for 1month @@ -406,16 +412,22 @@ public void compact() throws IOException { final long start = System.currentTimeMillis(); final int oriRocksDBFileCount = db.getLiveFilesMetaData().size(); final long oriRocksDBSize = getRocksDBSize(); - log.info("Starting RocksDB {} compact, current RocksDB hold {} files and {} Bytes.", - db.getName(), oriRocksDBFileCount, oriRocksDBSize); + log.info() + .attr("dbName", db.getName()) + .attr("fileCount", oriRocksDBFileCount) + .attr("sizeBytes", oriRocksDBSize).log("Starting RocksDB compact"); db.compactRange(); final long end = System.currentTimeMillis(); final int rocksDBFileCount = db.getLiveFilesMetaData().size(); final long rocksDBSize = getRocksDBSize(); - log.info("RocksDB {} compact finished {} ms, space reduced {} Bytes, current hold {} files and {} Bytes.", - db.getName(), end - start, oriRocksDBSize - rocksDBSize, rocksDBFileCount, rocksDBSize); + log.info() + .attr("dbName", db.getName()) + .attr("durationMs", end - start) + .attr("spaceReducedBytes", oriRocksDBSize - rocksDBSize) + .attr("fileCount", rocksDBFileCount).attr("sizeBytes", rocksDBSize) + .log("RocksDB compact finished"); } catch (RocksDBException e) { throw new IOException("Error in RocksDB compact", e); } @@ -665,5 +677,4 @@ RocksObject getOptions() { return options; } - private static final Logger log = LoggerFactory.getLogger(KeyValueStorageRocksDB.class); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgerMetadataIndex.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgerMetadataIndex.java index 5ca9f1ffd3e..7162c0c6c23 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgerMetadataIndex.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgerMetadataIndex.java @@ -34,6 +34,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorageDataFormats.LedgerData; @@ -42,14 +43,13 @@ import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.collections.ConcurrentLongHashMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Maintains an index for the ledgers metadata. * *

The key is the ledgerId and the value is the {@link LedgerData} content. */ +@CustomLog public class LedgerMetadataIndex implements Closeable { // Non-ledger data should have negative ID private static final long STORAGE_FLAGS = -0xeefd; @@ -111,9 +111,7 @@ public void close() throws IOException { public LedgerData get(long ledgerId) throws IOException { LedgerData ledgerData = ledgers.get(ledgerId); if (ledgerData == null) { - if (log.isDebugEnabled()) { - log.debug("Ledger not found {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ledger not found"); throw new Bookie.NoLedgerException(ledgerId); } @@ -127,9 +125,7 @@ public void set(long ledgerId, LedgerData ledgerData) throws IOException { lock.lock(); try { if (ledgers.put(ledgerId, ledgerData) == null) { - if (log.isDebugEnabled()) { - log.debug("Added new ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Added new ledger"); ledgersCount.incrementAndGet(); } @@ -145,9 +141,7 @@ public void delete(long ledgerId) throws IOException { lock.lock(); try { if (ledgers.remove(ledgerId) != null) { - if (log.isDebugEnabled()) { - log.debug("Removed ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Removed ledger"); ledgersCount.decrementAndGet(); } @@ -184,12 +178,10 @@ public boolean setFenced(long ledgerId) throws IOException { if (ledgers.put(ledgerId, newLedgerData) == null) { // Ledger had been deleted - if (log.isDebugEnabled()) { - log.debug("Re-inserted fenced ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Re-inserted fenced ledger"); ledgersCount.incrementAndGet(); - } else if (log.isDebugEnabled()) { - log.debug("Set fenced ledger {}", ledgerId); + } else { + log.debug().attr("ledgerId", ledgerId).log("Set fenced ledger"); } pendingLedgersUpdates.add(new SimpleEntry(ledgerId, newLedgerData)); @@ -213,12 +205,10 @@ public boolean setLimbo(long ledgerId) throws IOException { if (ledgers.put(ledgerId, newLedgerData) == null) { // Ledger had been deleted - if (log.isDebugEnabled()) { - log.debug("Re-inserted limbo ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Re-inserted limbo ledger"); ledgersCount.incrementAndGet(); - } else if (log.isDebugEnabled()) { - log.debug("Set limbo ledger {}", ledgerId); + } else { + log.debug().attr("ledgerId", ledgerId).log("Set limbo ledger"); } pendingLedgersUpdates.add(new SimpleEntry(ledgerId, newLedgerData)); @@ -242,12 +232,10 @@ public boolean clearLimbo(long ledgerId) throws IOException { if (ledgers.put(ledgerId, newLedgerData) == null) { // Ledger had been deleted - if (log.isDebugEnabled()) { - log.debug("Re-inserted limbo ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Re-inserted limbo ledger"); ledgersCount.incrementAndGet(); - } else if (log.isDebugEnabled()) { - log.debug("Set limbo ledger {}", ledgerId); + } else { + log.debug().attr("ledgerId", ledgerId).log("Set limbo ledger"); } pendingLedgersUpdates.add(new SimpleEntry(ledgerId, newLedgerData)); @@ -268,19 +256,18 @@ public void setMasterKey(long ledgerId, byte[] masterKey) throws IOException { // New ledger inserted ledgerData = LedgerData.newBuilder().setExists(true).setFenced(false) .setMasterKey(ByteString.copyFrom(masterKey)).build(); - if (log.isDebugEnabled()) { - log.debug("Inserting new ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Inserting new ledger"); } else { byte[] storedMasterKey = ledgerData.getMasterKey().toByteArray(); if (ArrayUtil.isArrayAllZeros(storedMasterKey)) { // update master key of the ledger ledgerData = LedgerData.newBuilder(ledgerData).setMasterKey(ByteString.copyFrom(masterKey)).build(); - if (log.isDebugEnabled()) { - log.debug("Replace old master key {} with new master key {}", storedMasterKey, masterKey); - } + log.debug() + .attr("storedMasterKey", storedMasterKey) + .attr("newMasterKey", masterKey) + .log("Replace old master key with new master key"); } else if (!Arrays.equals(storedMasterKey, masterKey) && !ArrayUtil.isArrayAllZeros(masterKey)) { - log.warn("Ledger {} masterKey in db can only be set once.", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Ledger masterKey in db can only be set once"); throw new IOException(BookieException.create(BookieException.Code.IllegalOpException)); } } @@ -316,9 +303,7 @@ public void flush() throws IOException { ++updatedLedgers; } - if (log.isDebugEnabled()) { - log.debug("Persisting updates to {} ledgers", updatedLedgers); - } + log.debug().attr("updatedLedgers", updatedLedgers).log("Persisting updates to ledgers"); ledgersDb.sync(); } finally { @@ -342,9 +327,7 @@ public void removeDeletedLedgers() throws IOException { pendingDeletedLedgers.remove(ledgerId); } - if (log.isDebugEnabled()) { - log.debug("Persisting deletes of ledgers {}", deletedLedgers); - } + log.debug().attr("deletedLedgers", deletedLedgers).log("Persisting deletes of ledgers"); ledgersDb.sync(); } finally { @@ -402,8 +385,6 @@ boolean setStorageStateFlags(int expected, int newFlags) throws IOException { return false; } - private static final Logger log = LoggerFactory.getLogger(LedgerMetadataIndex.class); - void setExplicitLac(long ledgerId, ByteBuf lac) throws IOException { LedgerData ledgerData = ledgers.get(ledgerId); if (ledgerData != null) { @@ -414,8 +395,8 @@ void setExplicitLac(long ledgerId, ByteBuf lac) throws IOException { // Ledger had been deleted ledgersCount.incrementAndGet(); return; - } else if (log.isDebugEnabled()) { - log.debug("Set explicitLac on ledger {}", ledgerId); + } else { + log.debug().attr("ledgerId", ledgerId).log("Set explicitLac on ledger"); } pendingLedgersUpdates.add(new SimpleEntry(ledgerId, newLedgerData)); } else { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexCheckOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexCheckOp.java index 0160f11f577..8a7df8f5652 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexCheckOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexCheckOp.java @@ -27,18 +27,17 @@ import java.util.Base64; import java.util.Map; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageFactory.DbConfigType; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.commons.lang3.time.DurationFormatUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Scan the ledgers index to make sure it is readable. */ +@CustomLog public class LedgersIndexCheckOp { - private static final Logger LOG = LoggerFactory.getLogger(LedgersIndexCheckOp.class); private final ServerConfiguration conf; private final boolean verbose; @@ -64,8 +63,8 @@ public boolean initiate() throws IOException { String iBasePath = BookieImpl.getCurrentDirectory(indexDir).toString(); Path indexCurrentPath = FileSystems.getDefault().getPath(iBasePath, LedgersSubPath); - LOG.info("Loading ledgers index from {}", indexCurrentPath); - LOG.info("Starting index scan"); + log.info().attr("indexPath", indexCurrentPath).log("Loading ledgers index"); + log.info("Starting index scan"); try { KeyValueStorage index = new KeyValueStorageRocksDB(iBasePath, LedgersSubPath, @@ -81,33 +80,34 @@ public boolean initiate() throws IOException { DbLedgerStorageDataFormats.LedgerData ledgerData = DbLedgerStorageDataFormats.LedgerData.parseFrom(entry.getValue()); if (verbose) { - LOG.info( - "Scanned: {}, ledger: {}, exists: {}, isFenced: {}, masterKey: {}, explicitLAC: {}", - ctr, - ledgerId, - (ledgerData.hasExists() ? ledgerData.getExists() : "-"), - (ledgerData.hasFenced() ? ledgerData.getFenced() : "-"), - (ledgerData.hasMasterKey() + log.info() + .attr("scanned", ctr) + .attr("ledgerId", ledgerId) + .attr("exists", (ledgerData.hasExists() ? ledgerData.getExists() : "-")) + .attr("isFenced", (ledgerData.hasFenced() ? ledgerData.getFenced() : "-")) + .attr("masterKey", (ledgerData.hasMasterKey() ? Base64.getEncoder() .encodeToString(ledgerData.getMasterKey().toByteArray()) - : "-"), - (ledgerData.hasExplicitLac() ? ledgerData.getExplicitLac() : "-")); + : "-")) + .attr("explicitLAC", (ledgerData.hasExplicitLac() + ? ledgerData.getExplicitLac() : "-")) + .log("Scanned ledger"); } else if (ctr % 100 == 0) { - LOG.info("Scanned {} ledgers", ctr); + log.info().attr("count", ctr).log("Scanned ledgers"); } } } finally { iterator.close(); } - LOG.info("Scanned {} ledgers", ctr); + log.info().attr("count", ctr).log("Scanned ledgers"); } catch (Throwable t) { - LOG.error("Index scan has failed with error", t); + log.error().exception(t).log("Index scan has failed with error"); return false; } } - LOG.info("Index scan has completed successfully. Total time: {}", - DurationFormatUtils.formatDurationHMS( - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))); + log.info().attr("totalTime", DurationFormatUtils.formatDurationHMS( + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))) + .log("Index scan has completed successfully"); return true; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexRebuildOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexRebuildOp.java index 2725897e804..fc9f94559a8 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexRebuildOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LedgersIndexRebuildOp.java @@ -36,6 +36,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.DefaultEntryLogger; import org.apache.bookkeeper.bookie.Journal; @@ -45,8 +46,6 @@ import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.util.BookKeeperConstants; import org.apache.bookkeeper.util.DiskChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Scan all entries in the journal and entry log files then rebuilds the ledgers index. @@ -59,8 +58,8 @@ * are overwritten and we cannot use the password from metadata, and cannot know 100% * for sure how a digest for the password was generated. */ +@CustomLog public class LedgersIndexRebuildOp { - private static final Logger LOG = LoggerFactory.getLogger(LedgersIndexRebuildOp.class); private final ServerConfiguration conf; private final boolean verbose; @@ -73,13 +72,13 @@ public LedgersIndexRebuildOp(ServerConfiguration conf, boolean verbose) { @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") public boolean initiate() { - LOG.info("Starting ledger index rebuilding"); + log.info("Starting ledger index rebuilding"); File[] indexDirs = conf.getIndexDirs(); if (indexDirs == null) { indexDirs = conf.getLedgerDirs(); } if (indexDirs.length != conf.getLedgerDirs().length) { - LOG.error("ledger and index dirs size not matched"); + log.error("ledger and index dirs size not matched"); return false; } @@ -93,7 +92,7 @@ public boolean initiate() { Path indexTempPath = FileSystems.getDefault().getPath(indexBasePath, tempLedgersSubPath); Path indexCurrentPath = FileSystems.getDefault().getPath(indexBasePath, LedgersSubPath); - LOG.info("Starting scan phase (scans journal and entry log files)"); + log.info("Starting scan phase (scans journal and entry log files)"); try { Set ledgers = new HashSet<>(); @@ -102,12 +101,12 @@ public boolean initiate() { lDirs[0] = ledgerDir; scanEntryLogFiles(ledgers, lDirs); - LOG.info("Scan complete, found {} ledgers. " - + "Starting to build a new ledgers index", ledgers.size()); + log.info().attr("count", ledgers.size()) + .log("Scan complete. Starting to build a new ledgers index"); try (KeyValueStorage newIndex = KeyValueStorageRocksDB.factory.newKeyValueStorage( indexBasePath, tempLedgersSubPath, DbConfigType.Default, conf)) { - LOG.info("Created ledgers index at temp location {}", indexTempPath); + log.info().attr("tempPath", indexTempPath).log("Created ledgers index at temp location"); for (Long ledgerId : ledgers) { DbLedgerStorageDataFormats.LedgerData ledgerData = @@ -124,7 +123,7 @@ public boolean initiate() { newIndex.sync(); } } catch (Throwable t) { - LOG.error("Error during rebuild, the original index remains unchanged", t); + log.error().exception(t).log("Error during rebuild, the original index remains unchanged"); delete(indexTempPath); return false; } @@ -133,16 +132,21 @@ public boolean initiate() { try { Path prevPath = FileSystems.getDefault().getPath(indexBasePath, LedgersSubPath + ".PREV-" + timestamp); - LOG.info("Moving original index from original location: {} up to back-up location: {}", - indexCurrentPath, prevPath); + log.info() + .attr("from", indexCurrentPath) + .attr("to", prevPath) + .log("Moving original index to back-up location"); Files.move(indexCurrentPath, prevPath); - LOG.info("Moving rebuilt index from: {} to: {}", indexTempPath, indexCurrentPath); + log.info() + .attr("from", indexTempPath) + .attr("to", indexCurrentPath) + .log("Moving rebuilt index"); Files.move(indexTempPath, indexCurrentPath); - LOG.info("Original index has been replaced with the new index. " - + "The original index has been moved to {}", prevPath); + log.info().attr("backupPath", prevPath) + .log("Original index has been replaced with the new index"); } catch (IOException e) { - LOG.error("Could not replace original index with rebuilt index. " - + "To return to the original state, ensure the original index is in its original location", e); + log.error().exception(e).log("Could not replace original index with rebuilt index. " + + "To return to the original state, ensure the original index is in its original location"); return false; } } @@ -157,7 +161,7 @@ private void scanEntryLogFiles(Set ledgers, File[] lDirs) throws IOExcepti int totalEntryLogs = entryLogs.size(); int completedEntryLogs = 0; - LOG.info("Scanning {} entry logs", totalEntryLogs); + log.info().attr("count", totalEntryLogs).log("Scanning entry logs"); for (long entryLogId : entryLogs) { entryLogger.scanEntryLog(entryLogId, new EntryLogScanner() { @@ -165,7 +169,7 @@ private void scanEntryLogFiles(Set ledgers, File[] lDirs) throws IOExcepti public void process(long ledgerId, long offset, ByteBuf entry) throws IOException { if (ledgers.add(ledgerId)) { if (verbose) { - LOG.info("Found ledger {} in entry log", ledgerId); + log.info().attr("ledgerId", ledgerId).log("Found ledger in entry log"); } } } @@ -177,8 +181,9 @@ public boolean accept(long ledgerId) { }); ++completedEntryLogs; - LOG.info("Completed scanning of log {}.log -- {} / {}", Long.toHexString(entryLogId), completedEntryLogs, - totalEntryLogs); + log.info().attr("entryLogId", Long.toHexString(entryLogId)) + .attr("completed", completedEntryLogs).attr("total", totalEntryLogs) + .log("Completed scanning of entry log"); } } @@ -211,7 +216,10 @@ private List getJournals(ServerConfiguration conf) throws IOException { } private void scanJournal(Journal journal, long journalId, Set ledgers) throws IOException { - LOG.info("Scanning journal " + journalId + " (" + Long.toHexString(journalId) + ".txn)"); + log.info() + .attr("journalId", journalId) + .attr("journalFile", Long.toHexString(journalId) + ".txn") + .log("Scanning journal"); journal.scanJournal(journalId, 0L, new Journal.JournalScanner() { @Override public void process(int journalVersion, long offset, ByteBuffer entry) { @@ -219,7 +227,7 @@ public void process(int journalVersion, long offset, ByteBuffer entry) { long ledgerId = buf.readLong(); if (ledgers.add(ledgerId) && verbose) { - LOG.info("Found ledger {} in journal", ledgerId); + log.info().attr("ledgerId", ledgerId).log("Found ledger in journal"); } } }, false); @@ -229,7 +237,10 @@ private void delete(Path path) { try { Files.delete(path); } catch (IOException e) { - LOG.warn("Unable to delete {}", path.toAbsolutePath(), e); + log.warn() + .attr("path", path.toAbsolutePath()) + .exception(e) + .log("Unable to delete"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LocationsIndexRebuildOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LocationsIndexRebuildOp.java index 06afd9a823f..c0aa3161376 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LocationsIndexRebuildOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/LocationsIndexRebuildOp.java @@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.DefaultEntryLogger; import org.apache.bookkeeper.bookie.LedgerDirsManager; @@ -42,12 +43,11 @@ import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.util.DiskChecker; import org.apache.commons.lang3.time.DurationFormatUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Scan all entries in the entry log and rebuild the locations index. */ +@CustomLog public class LocationsIndexRebuildOp { private final ServerConfiguration conf; @@ -58,7 +58,7 @@ public LocationsIndexRebuildOp(ServerConfiguration conf) { private static final int BATCH_COMMIT_SIZE = 10_000; public void initiate() throws IOException { - LOG.info("Starting locations index rebuilding"); + log.info("Starting locations index rebuilding"); File[] indexDirs = conf.getIndexDirs(); if (indexDirs == null) { indexDirs = conf.getLedgerDirs(); @@ -77,7 +77,7 @@ public void initiate() throws IOException { Path backupPath = FileSystems.getDefault().getPath(iBasePath, "locations.BACKUP-" + timestamp); Files.move(indexCurrentPath, backupPath); - LOG.info("Created locations index backup at {}", backupPath); + log.info().attr("backupPath", backupPath).log("Created locations index backup"); File[] lDirs = new File[1]; lDirs[0] = ledgerDir; @@ -86,14 +86,14 @@ public void initiate() throws IOException { Set entryLogs = entryLogger.getEntryLogsSet(); Set activeLedgers = getActiveLedgers(conf, KeyValueStorageRocksDB.factory, iBasePath); - LOG.info("Found {} active ledgers in ledger manager", activeLedgers.size()); + log.info().attr("count", activeLedgers.size()).log("Found active ledgers in ledger manager"); KeyValueStorage newIndex = KeyValueStorageRocksDB.factory.newKeyValueStorage(iBasePath, "locations", DbConfigType.Default, conf); int totalEntryLogs = entryLogs.size(); int completedEntryLogs = 0; - LOG.info("Scanning {} entry logs", totalEntryLogs); + log.info().attr("totalEntryLogs", totalEntryLogs).log("Scanning entry logs"); AtomicReference batch = new AtomicReference<>(newIndex.newBatch()); AtomicInteger count = new AtomicInteger(); @@ -106,10 +106,11 @@ public void process(long ledgerId, long offset, ByteBuf entry) throws IOExceptio // Actual location indexed is pointing past the entry size long location = (entryLogId << 32L) | (offset + 4); - if (LOG.isDebugEnabled()) { - LOG.debug("Rebuilding {}:{} at location {} / {}", ledgerId, entryId, location >> 32, - location & (Integer.MAX_VALUE - 1)); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("logId", location >> 32).attr("offset", location & (Integer.MAX_VALUE - 1)) + .log("Rebuilding entry location"); // Update the ledger index page LongPairWrapper key = LongPairWrapper.get(ledgerId, entryId); @@ -138,8 +139,9 @@ public boolean accept(long ledgerId) { }); ++completedEntryLogs; - LOG.info("Completed scanning of log {}.log -- {} / {}", Long.toHexString(entryLogId), - completedEntryLogs, totalEntryLogs); + log.info().attr("entryLogId", Long.toHexString(entryLogId)) + .attr("completed", completedEntryLogs).attr("total", totalEntryLogs) + .log("Completed scanning of entry log"); } batch.get().flush(); @@ -148,9 +150,9 @@ public boolean accept(long ledgerId) { newIndex.sync(); newIndex.close(); } - LOG.info("Rebuilding index is done. Total time: {}", - DurationFormatUtils.formatDurationHMS( - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))); + log.info().attr("totalTime", DurationFormatUtils.formatDurationHMS( + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime))) + .log("Rebuilding index is done"); } private Set getActiveLedgers(ServerConfiguration conf, KeyValueStorageFactory storageFactory, String basePath) @@ -165,5 +167,4 @@ private Set getActiveLedgers(ServerConfiguration conf, KeyValueStorageFact return activeLedgers; } - private static final Logger LOG = LoggerFactory.getLogger(LocationsIndexRebuildOp.class); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/ReadCache.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/ReadCache.java index 1d850c456c6..94b608ef137 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/ReadCache.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/ReadCache.java @@ -31,10 +31,9 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.util.collections.ConcurrentLongLongPairHashMap; import org.apache.bookkeeper.util.collections.ConcurrentLongLongPairHashMap.LongPair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Read cache implementation. @@ -46,8 +45,8 @@ * is cleared and rotated to make space for new entries to be added to * the read cache. */ +@CustomLog public class ReadCache implements Closeable { - private static final Logger log = LoggerFactory.getLogger(ReadCache.class); private static final int DEFAULT_MAX_SEGMENT_SIZE = 1 * 1024 * 1024 * 1024; @@ -97,7 +96,10 @@ public void put(long ledgerId, long entryId, ByteBuf entry) { try { if (entrySize > segmentSize) { - log.warn("entrySize {} > segmentSize {}, skip update read cache!", entrySize, segmentSize); + log.warn() + .attr("entrySize", entrySize) + .attr("segmentSize", segmentSize) + .log("entrySize > segmentSize, skip update read cache!"); return; } int offset = currentSegmentOffset.getAndAdd(alignedSize); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java index 774d10c158f..118d9692ddf 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java @@ -49,6 +49,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.StampedLock; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.Bookie.NoEntryException; import org.apache.bookkeeper.bookie.BookieException; @@ -81,8 +82,6 @@ import org.apache.bookkeeper.util.collections.ConcurrentLongHashMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.mutable.MutableLong; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Single directory implementation of LedgerStorage that uses RocksDB to keep the indexes for entries stored in @@ -90,6 +89,7 @@ * *

This is meant only to be used from {@link DbLedgerStorage}. */ +@CustomLog public class SingleDirectoryDbLedgerStorage implements CompactableLedgerStorage { private final EntryLogger entryLogger; @@ -166,13 +166,13 @@ public SingleDirectoryDbLedgerStorage(ServerConfiguration conf, LedgerManager le String indexBaseDir = ledgerBaseDir; if (CollectionUtils.isEmpty(indexDirsManager.getAllLedgerDirs()) || ledgerBaseDir.equals(indexDirsManager.getAllLedgerDirs().get(0).getPath())) { - log.info("indexDir is equals ledgerBaseDir, creating single directory db ledger storage on {}", - indexBaseDir); + log.info().attr("indexBaseDir", indexBaseDir) + .log("indexDir is equals ledgerBaseDir, creating single directory db ledger storage"); } else { // if indexDir is specified, set new value indexBaseDir = indexDirsManager.getAllLedgerDirs().get(0).getPath(); - log.info("indexDir is specified a separate dir, creating single directory db ledger storage on {}", - indexBaseDir); + log.info().attr("indexBaseDir", indexBaseDir) + .log("indexDir is specified a separate dir, creating single directory db ledger storage"); } this.indexBaseDir = indexBaseDir; @@ -316,8 +316,8 @@ public boolean isMinorGcSuspended() { public void entryLocationCompact() { if (entryLocationIndex.isCompacting()) { // RocksDB already running compact. - log.info("Compacting directory {}, skipping this entryLocationCompaction this time.", - entryLocationIndex.getEntryLocationDBPath()); + log.info().attr("directory", entryLocationIndex.getEntryLocationDBPath()) + .log("Compacting directory, skipping this entryLocationCompaction this time"); return; } cleanupExecutor.execute(() -> { @@ -327,7 +327,7 @@ public void entryLocationCompact() { log.info("Trigger entry location index RocksDB compact."); entryLocationIndex.compact(); } catch (Throwable t) { - log.warn("Failed to trigger entry location index RocksDB compact", t); + log.warn().exception(t).log("Failed to trigger entry location index RocksDB compact"); } }); } @@ -362,7 +362,7 @@ public void shutdown() throws InterruptedException { executor.shutdown(); } catch (IOException e) { - log.error("Error closing db storage", e); + log.error().exception(e).log("Error closing db storage"); } } @@ -370,9 +370,10 @@ public void shutdown() throws InterruptedException { public boolean ledgerExists(long ledgerId) throws IOException { try { LedgerData ledgerData = ledgerIndex.get(ledgerId); - if (log.isDebugEnabled()) { - log.debug("Ledger exists. ledger: {} : {}", ledgerId, ledgerData.getExists()); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("exists", ledgerData.getExists()) + .log("Ledger exists"); return ledgerData.getExists(); } catch (Bookie.NoLedgerException nle) { // ledger does not exist @@ -427,9 +428,10 @@ public boolean entryExists(long ledgerId, long entryId) throws IOException, Book public boolean isFenced(long ledgerId) throws IOException, BookieException { boolean isFenced = ledgerIndex.get(ledgerId).getFenced(); - if (log.isDebugEnabled()) { - log.debug("ledger: {}, isFenced: {}.", ledgerId, isFenced); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("isFenced", isFenced) + .log("isFenced check"); // Only a negative result while in limbo equates to unknown if (!isFenced) { @@ -441,9 +443,7 @@ public boolean isFenced(long ledgerId) throws IOException, BookieException { @Override public boolean setFenced(long ledgerId) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Set fenced. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Set fenced"); boolean changed = ledgerIndex.setFenced(ledgerId); if (changed) { // notify all the watchers if a ledger is fenced @@ -457,17 +457,13 @@ public boolean setFenced(long ledgerId) throws IOException { @Override public void setMasterKey(long ledgerId, byte[] masterKey) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Set master key. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Set master key"); ledgerIndex.setMasterKey(ledgerId, masterKey); } @Override public byte[] readMasterKey(long ledgerId) throws IOException, BookieException { - if (log.isDebugEnabled()) { - log.debug("Read master key. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Read master key"); return ledgerIndex.get(ledgerId).getMasterKey().toByteArray(); } @@ -479,9 +475,11 @@ public long addEntry(ByteBuf entry) throws IOException, BookieException { long entryId = entry.getLong(entry.readerIndex() + 8); long lac = entry.getLong(entry.readerIndex() + 16); - if (log.isDebugEnabled()) { - log.debug("Add entry. {}@{}, lac = {}", ledgerId, entryId, lac); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("lac", lac) + .log("Add entry"); // First we try to do an optimistic locking to get access to the current write cache. // This is based on the fact that the write cache is only being rotated (swapped) every 1 minute. During the @@ -535,7 +533,7 @@ private void triggerFlushAndAddEntry(long ledgerId, long entryId, ByteBuf entry) try { flush(); } catch (IOException e) { - log.error("Error during flush", e); + log.error().exception(e).log("Error during flush"); } finally { flushExecutorTime.addLatency(MathUtils.elapsedNanos(startTime), TimeUnit.NANOSECONDS); } @@ -582,9 +580,10 @@ public ByteBuf getEntry(long ledgerId, long entryId) throws IOException, BookieE } private ByteBuf doGetEntry(long ledgerId, long entryId) throws IOException, BookieException { - if (log.isDebugEnabled()) { - log.debug("Get Entry: {}@{}", ledgerId, entryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Get Entry"); if (entryId == BookieProtocol.LAST_ADD_CONFIRMED) { return getLastEntry(ledgerId); @@ -702,9 +701,10 @@ private void fillReadAheadCache(long originalLedgerId, long firstEntryId, long f } } } catch (Exception e) { - if (log.isDebugEnabled()) { - log.debug("Exception during read ahead for ledger: {}: e", originalLedgerId, e); - } + log.debug() + .attr("ledgerId", originalLedgerId) + .exception(e) + .log("Exception during read ahead for ledger"); } finally { dbLedgerStorageStats.getReadAheadBatchCountStats().registerSuccessfulValue(count); dbLedgerStorageStats.getReadAheadBatchSizeStats().registerSuccessfulValue(size); @@ -732,15 +732,11 @@ public ByteBuf getLastEntry(long ledgerId) throws IOException, BookieException { // First try to read from the write cache of recent entries ByteBuf entry = writeCache.getLastEntry(ledgerId); if (entry != null) { - if (log.isDebugEnabled()) { - long foundLedgerId = entry.readLong(); // ledgerId - long entryId = entry.readLong(); - entry.resetReaderIndex(); - if (log.isDebugEnabled()) { - log.debug("Found last entry for ledger {} in write cache: {}@{}", ledgerId, foundLedgerId, - entryId); - } - } + final ByteBuf found = entry; + log.debug(e -> e.attr("ledgerId", ledgerId) + .attr("foundLedgerId", found.getLong(0)) + .attr("entryId", found.getLong(8)) + .log("Found last entry for ledger in write cache")); dbLedgerStorageStats.getWriteCacheHitCounter().inc(); return entry; @@ -749,14 +745,11 @@ public ByteBuf getLastEntry(long ledgerId) throws IOException, BookieException { // If there's a flush going on, the entry might be in the flush buffer entry = writeCacheBeingFlushed.getLastEntry(ledgerId); if (entry != null) { - if (log.isDebugEnabled()) { - entry.readLong(); // ledgerId - long entryId = entry.readLong(); - entry.resetReaderIndex(); - if (log.isDebugEnabled()) { - log.debug("Found last entry for ledger {} in write cache being flushed: {}", ledgerId, entryId); - } - } + final ByteBuf found = entry; + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", () -> found.getLong(8)) + .log("Found last entry for ledger in write cache being flushed"); dbLedgerStorageStats.getWriteCacheHitCounter().inc(); return entry; @@ -770,9 +763,10 @@ public ByteBuf getLastEntry(long ledgerId) throws IOException, BookieException { // Search the last entry in storage long locationIndexStartNano = MathUtils.nowInNano(); long lastEntryId = entryLocationIndex.getLastEntryInLedger(ledgerId); - if (log.isDebugEnabled()) { - log.debug("Found last entry for ledger {} in db: {}", ledgerId, lastEntryId); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("lastEntryId", lastEntryId) + .log("Found last entry for ledger in db"); long entryLocation = entryLocationIndex.getLocation(ledgerId, lastEntryId); dbLedgerStorageStats.getReadFromLocationIndexTime().addLatency( @@ -822,10 +816,9 @@ public void checkpoint(Checkpoint checkpoint) throws IOException { swapWriteCache(); long sizeToFlush = writeCacheBeingFlushed.size(); - if (log.isDebugEnabled()) { - log.debug("Flushing entries. count: {} -- size {} Mb", writeCacheBeingFlushed.count(), - sizeToFlush / 1024.0 / 1024); - } + log.debug(e -> e.attr("count", writeCacheBeingFlushed.count()) + .attr("sizeMb", sizeToFlush / 1024.0 / 1024) + .log("Flushing entries")); // Write all the pending entries into the entry logger and collect the offset // position for each entry @@ -844,10 +837,9 @@ public void checkpoint(Checkpoint checkpoint) throws IOException { batch.flush(); recordSuccessfulEvent(dbLedgerStorageStats.getFlushLocationIndexStats(), batchFlushStartTime); - if (log.isDebugEnabled()) { - log.debug("DB batch flushed time : {} s", - MathUtils.elapsedNanos(batchFlushStartTime) / (double) TimeUnit.SECONDS.toNanos(1)); - } + log.debug().attr("durationSeconds", + () -> MathUtils.elapsedNanos(batchFlushStartTime) / (double) TimeUnit.SECONDS.toNanos(1)) + .log("DB batch flushed"); } long ledgerIndexStartTime = MathUtils.nowInNano(); @@ -862,9 +854,10 @@ public void checkpoint(Checkpoint checkpoint) throws IOException { double flushTimeSeconds = MathUtils.elapsedNanos(startTime) / (double) TimeUnit.SECONDS.toNanos(1); double flushThroughput = sizeToFlush / 1024.0 / 1024.0 / flushTimeSeconds; - if (log.isDebugEnabled()) { - log.debug("Flushing done time {} s -- Written {} MB/s", flushTimeSeconds, flushThroughput); - } + log.debug() + .attr("durationSeconds", flushTimeSeconds) + .attr("throughputMBs", flushThroughput) + .log("Flushing done"); recordSuccessfulEvent(dbLedgerStorageStats.getFlushStats(), startTime); dbLedgerStorageStats.getFlushSizeStats().registerSuccessfulValue(sizeToFlush); @@ -878,14 +871,12 @@ public void checkpoint(Checkpoint checkpoint) throws IOException { // There can only be one single cleanup task running because the cleanupExecutor // is single-threaded try { - if (log.isDebugEnabled()) { - log.debug("Removing deleted ledgers from db indexes"); - } + log.debug("Removing deleted ledgers from db indexes"); entryLocationIndex.removeOffsetFromDeletedLedgers(); ledgerIndex.removeDeletedLedgers(); } catch (Throwable t) { - log.warn("Failed to cleanup db indexes", t); + log.warn().exception(t).log("Failed to cleanup db indexes"); } }); @@ -928,9 +919,7 @@ public void flush() throws IOException { @Override public void deleteLedger(long ledgerId) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Deleting ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Deleting ledger"); // Delete entries from this ledger that are still in the write cache long stamp = writeCacheRotationLock.readLock(); @@ -1036,26 +1025,18 @@ public void setExplicitLac(long ledgerId, ByteBuf lac) throws IOException { @Override public ByteBuf getExplicitLac(long ledgerId) throws IOException, BookieException { throwIfLimbo(ledgerId); - if (log.isDebugEnabled()) { - log.debug("getExplicitLac ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("getExplicitLac"); TransientLedgerInfo ledgerInfo = getOrAddLedgerInfo(ledgerId); if (ledgerInfo.getExplicitLac() != null) { - if (log.isDebugEnabled()) { - log.debug("getExplicitLac ledger {} returned from TransientLedgerInfo", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("getExplicitLac returned from TransientLedgerInfo"); return ledgerInfo.getExplicitLac(); } LedgerData ledgerData = ledgerIndex.get(ledgerId); if (!ledgerData.hasExplicitLac()) { - if (log.isDebugEnabled()) { - log.debug("getExplicitLac ledger {} missing from LedgerData", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("getExplicitLac missing from LedgerData"); return null; } - if (log.isDebugEnabled()) { - log.debug("getExplicitLac ledger {} returned from LedgerData", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("getExplicitLac returned from LedgerData"); ByteString persistedLac = ledgerData.getExplicitLac(); ledgerInfo.setExplicitLac(Unpooled.wrappedBuffer(persistedLac.toByteArray())); return ledgerInfo.getExplicitLac(); @@ -1146,8 +1127,6 @@ public interface LedgerLoggerProcessor { void process(long entryId, long entryLogId, long position); } - private static final Logger log = LoggerFactory.getLogger(SingleDirectoryDbLedgerStorage.class); - @Override public OfLong getListOfEntriesOfLedger(long ledgerId) throws IOException { throw new UnsupportedOperationException( @@ -1231,33 +1210,25 @@ public void diskJustWritable(File disk) { @Override public void setLimboState(long ledgerId) throws IOException { - if (log.isDebugEnabled()) { - log.debug("setLimboState. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("setLimboState"); ledgerIndex.setLimbo(ledgerId); } @Override public boolean hasLimboState(long ledgerId) throws IOException { - if (log.isDebugEnabled()) { - log.debug("hasLimboState. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("hasLimboState"); return ledgerIndex.get(ledgerId).getLimbo(); } @Override public void clearLimboState(long ledgerId) throws IOException { - if (log.isDebugEnabled()) { - log.debug("clearLimboState. ledger: {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("clearLimboState"); ledgerIndex.clearLimbo(ledgerId); } private void throwIfLimbo(long ledgerId) throws IOException, BookieException { if (hasLimboState(ledgerId)) { - if (log.isDebugEnabled()) { - log.debug("Accessing ledger({}) in limbo state, throwing exception", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Accessing ledger in limbo state, throwing exception"); throw BookieException.create(BookieException.Code.DataUnknownException); } } @@ -1294,8 +1265,10 @@ public void setStorageStateFlag(StorageState flag) throws IOException { if (ledgerIndex.setStorageStateFlags(curFlags, newFlags)) { return; } else { - log.info("Conflict updating storage state flags {} -> {}, retrying", - curFlags, newFlags); + log.info() + .attr("curFlags", curFlags) + .attr("newFlags", newFlags) + .log("Conflict updating storage state flags, retrying"); } } } @@ -1310,8 +1283,10 @@ public void clearStorageStateFlag(StorageState flag) throws IOException { if (ledgerIndex.setStorageStateFlags(curFlags, newFlags)) { return; } else { - log.info("Conflict updating storage state flags {} -> {}, retrying", - curFlags, newFlags); + log.info() + .attr("curFlags", curFlags) + .attr("newFlags", newFlags) + .log("Conflict updating storage state flags, retrying"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/WriteCache.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/WriteCache.java index d152c6fc1de..fb1e42adb24 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/WriteCache.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/WriteCache.java @@ -30,13 +30,12 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.locks.ReentrantLock; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.util.collections.ConcurrentLongHashSet; import org.apache.bookkeeper.util.collections.ConcurrentLongLongHashMap; import org.apache.bookkeeper.util.collections.ConcurrentLongLongPairHashMap; import org.apache.bookkeeper.util.collections.ConcurrentLongLongPairHashMap.LongPair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Write cache implementation. @@ -50,6 +49,7 @@ *

There is the possibility to iterate through the stored entries in an ordered * way, by (ledgerId, entry). */ +@CustomLog public class WriteCache implements Closeable { /** @@ -243,16 +243,16 @@ public void forEach(EntryConsumer consumer) throws IOException { sortedEntriesIdx += 4; }); - if (log.isDebugEnabled()) { - log.debug("iteration took {} ms", MathUtils.elapsedNanos(startTime) / 1e6); - } + final long iterationStart = startTime; + log.debug().attr("durationMs", () -> MathUtils.elapsedNanos(iterationStart) / 1e6) + .log("iteration took"); startTime = MathUtils.nowInNano(); // Sort entries by (ledgerId, entryId) maintaining the 4 items groups ArrayGroupSort.sort(sortedEntries, 0, sortedEntriesIdx); - if (log.isDebugEnabled()) { - log.debug("sorting {} ms", (MathUtils.elapsedNanos(startTime) / 1e6)); - } + final long sortStart = startTime; + log.debug().attr("durationMs", () -> MathUtils.elapsedNanos(sortStart) / 1e6) + .log("sorting"); startTime = MathUtils.nowInNano(); ByteBuf[] entrySegments = new ByteBuf[segmentsCount]; @@ -273,9 +273,9 @@ public void forEach(EntryConsumer consumer) throws IOException { consumer.accept(ledgerId, entryId, entry); } - if (log.isDebugEnabled()) { - log.debug("entry log adding {} ms", MathUtils.elapsedNanos(startTime) / 1e6); - } + final long entryLogStart = startTime; + log.debug().attr("durationMs", () -> MathUtils.elapsedNanos(entryLogStart) / 1e6) + .log("entry log adding"); } finally { sortedEntriesLock.unlock(); } @@ -307,5 +307,4 @@ private static long alignToPowerOfTwo(long n) { private long[] sortedEntries; private int sortedEntriesIdx; - private static final Logger log = LoggerFactory.getLogger(WriteCache.class); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BatchedReadOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BatchedReadOp.java index 97a284d04ec..774d57ed92b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BatchedReadOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BatchedReadOp.java @@ -25,6 +25,7 @@ import java.util.BitSet; import java.util.List; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerEntry; import org.apache.bookkeeper.client.impl.LedgerEntriesImpl; import org.apache.bookkeeper.client.impl.LedgerEntryImpl; @@ -34,13 +35,10 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.BatchedReadEntryCallback; import org.apache.bookkeeper.proto.checksum.DigestManager; import org.apache.bookkeeper.util.ByteBufList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class BatchedReadOp extends ReadOpBase implements BatchedReadEntryCallback { - private static final Logger LOG = LoggerFactory.getLogger(BatchedReadOp.class); - final int maxCount; final long maxSize; @@ -80,11 +78,16 @@ protected void submitCallback(int code) { long latencyNanos = MathUtils.elapsedNanos(requestTimeNanos); if (code != BKException.Code.OK) { - LOG.error( - "Batch read of ledger entry failed: L{} E{}-E{}, Sent to {}, " - + "Heard from {} : bitset = {}, Error = '{}'. First unread entry is ({}, rc = {})", - lh.getId(), startEntryId, startEntryId + maxCount - 1, sentToHosts, heardFromHosts, - heardFromHostsBitSet, BKException.getMessage(code), startEntryId, code); + log.error() + .attr("ledgerId", lh.getId()) + .attr("startEntryId", startEntryId) + .attr("entryId", startEntryId + maxCount - 1) + .attr("sentToHosts", sentToHosts) + .attr("heardFromHosts", heardFromHosts) + .attr("heardFromHostsBitSet", heardFromHostsBitSet) + .attr("message", BKException.getMessage(code)) + .attr("code", code) + .log("Batch read of ledger entry failed"); clientCtx.getClientStats().getReadOpLogger().registerFailedEvent(latencyNanos, TimeUnit.NANOSECONDS); // release the entries @@ -274,7 +277,10 @@ synchronized BookieId sendNextRead() { sentReplicas.set(replica); return to; } catch (InterruptedException ie) { - LOG.error("Interrupted reading entry " + this, ie); + log.error() + .attr("readOp", this) + .exception(ie) + .log("Interrupted reading entry"); Thread.currentThread().interrupt(); fail(BKException.Code.InterruptedException); return null; @@ -286,7 +292,10 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin super.logErrorAndReattemptRead(bookieIndex, host, errMsg, rc); int replica = writeSet.indexOf(bookieIndex); if (replica == NOT_FOUND) { - LOG.error("Received error from a host which is not in the ensemble {} {}.", host, ensemble); + log.error() + .attr("bookieAddr", host) + .attr("ensemble", ensemble) + .log("Received error from a host which is not in the ensemble"); return; } erroredReplicas.set(replica); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java index 9c70f582983..e34a2ebefa4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java @@ -44,6 +44,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookKeeperServerStats; import org.apache.bookkeeper.client.AsyncCallback.CreateCallback; import org.apache.bookkeeper.client.AsyncCallback.DeleteCallback; @@ -92,8 +93,6 @@ import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * BookKeeper client. @@ -106,10 +105,9 @@ *

The exceptions resulting from synchronous calls and error code resulting from * asynchronous calls can be found in the class {@link BKException}. */ +@CustomLog public class BookKeeper implements org.apache.bookkeeper.client.api.BookKeeper { - private static final Logger LOG = LoggerFactory.getLogger(BookKeeper.class); - final EventLoopGroup eventLoopGroup; private final ByteBufAllocator allocator; @@ -348,7 +346,7 @@ public BookKeeper(final ClientConfiguration conf) private static ZooKeeper validateZooKeeper(ZooKeeper zk) throws NullPointerException, IOException { checkNotNull(zk, "No zookeeper instance provided"); if (!zk.getState().isConnected()) { - LOG.error("Unconnected zookeeper handle passed to bookkeeper"); + log.error("Unconnected zookeeper handle passed to bookkeeper"); throw new IOException(KeeperException.create(KeeperException.Code.CONNECTIONLOSS)); } return zk; @@ -458,10 +456,12 @@ public BookKeeper(ClientConfiguration conf, ZooKeeper zk, EventLoopGroup eventLo rootStatsLogger, Optional.ofNullable(zkc)); } catch (ConfigurationException ce) { - LOG.error("Failed to initialize metadata client driver using invalid metadata service uri", ce); + log.error() + .exception(ce) + .log("Failed to initialize metadata client driver using invalid metadata service uri"); throw new IOException("Failed to initialize metadata client driver", ce); } catch (MetadataException me) { - LOG.error("Encountered metadata exceptions on initializing metadata client driver", me); + log.error().exception(me).log("Encountered metadata exceptions on initializing metadata client driver"); throw new IOException("Failed to initialize metadata client driver", me); } @@ -518,7 +518,7 @@ public BookKeeper(ClientConfiguration conf, ZooKeeper zk, EventLoopGroup eventLo scheduler, rootStatsLogger, this.bookieWatcher.getBookieAddressResolver()); if (conf.getDiskWeightBasedPlacementEnabled()) { - LOG.info("Weighted ledger placement enabled"); + log.info("Weighted ledger placement enabled"); ThreadFactoryBuilder tFBuilder = new ThreadFactoryBuilder() .setNameFormat("BKClientMetaDataPollScheduler-%d"); this.bookieInfoScheduler = Executors.newSingleThreadScheduledExecutor(tFBuilder.build()); @@ -526,7 +526,7 @@ public BookKeeper(ClientConfiguration conf, ZooKeeper zk, EventLoopGroup eventLo this.bookieWatcher.initialBlockingBookieRead(); this.bookieInfoReader.start(); } else { - LOG.info("Weighted ledger placement is not enabled"); + log.info("Weighted ledger placement is not enabled"); this.bookieInfoScheduler = null; this.bookieInfoReader = new BookieInfoReader(this, conf, null); this.bookieWatcher.initialBlockingBookieRead(); @@ -627,12 +627,12 @@ void checkForFaultyBookies() { isEnabled = metadataDriver.isHealthCheckEnabled().get(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Cannot verify if healthcheck is enabled", e); + log.error().exception(e).log("Cannot verify if healthcheck is enabled"); } catch (ExecutionException e) { - LOG.error("Cannot verify if healthcheck is enabled", e.getCause()); + log.error().attr("getCause", e.getCause()).log("Cannot verify if healthcheck is enabled"); } if (!isEnabled) { - LOG.info("Health checks is currently disabled!"); + log.info("Health checks is currently disabled!"); bookieWatcher.releaseAllQuarantinedBookies(); return; } @@ -967,7 +967,7 @@ public LedgerHandle createLedger(int ensSize, int writeQuorumSize, int ackQuorum LedgerHandle lh = SyncCallbackUtils.waitForResult(future); if (lh == null) { - LOG.error("Unexpected condition : no ledger handle returned for a success ledger creation"); + log.error("Unexpected condition : no ledger handle returned for a success ledger creation"); throw BKException.create(BKException.Code.UnexpectedConditionException); } return lh; @@ -1024,7 +1024,7 @@ public LedgerHandle createLedgerAdv(int ensSize, int writeQuorumSize, int ackQuo LedgerHandle lh = SyncCallbackUtils.waitForResult(future); if (lh == null) { - LOG.error("Unexpected condition : no ledger handle returned for a success ledger creation"); + log.error("Unexpected condition : no ledger handle returned for a success ledger creation"); throw BKException.create(BKException.Code.UnexpectedConditionException); } return lh; @@ -1117,14 +1117,20 @@ public LedgerHandle createLedgerAdv(final long ledgerId, LedgerHandle lh = SyncCallbackUtils.waitForResult(future); if (lh == null) { - LOG.error("Unexpected condition : no ledger handle returned for a success ledger creation"); + log.error("Unexpected condition : no ledger handle returned for a success ledger creation"); throw BKException.create(BKException.Code.UnexpectedConditionException); } else if (ledgerId != lh.getId()) { - LOG.error("Unexpected condition : Expected ledgerId: {} but got: {}", ledgerId, lh.getId()); + log.error() + .attr("expectedLedgerId", ledgerId) + .attr("gotLedgerId", lh.getId()) + .log("Unexpected condition"); throw BKException.create(BKException.Code.UnexpectedConditionException); } - LOG.info("Ensemble: {} for ledger: {}", lh.getLedgerMetadata().getEnsembleAt(0L), lh.getId()); + log.info() + .attr("getEnsembleAt", lh.getLedgerMetadata().getEnsembleAt(0L)) + .attr("ledgerId", lh.getId()) + .log("Ensemble for ledger"); return lh; } @@ -1521,30 +1527,30 @@ public void close() throws BKException, InterruptedException { ledgerManager.close(); ledgerIdGenerator.close(); } catch (IOException ie) { - LOG.error("Failed to close ledger manager : ", ie); + log.error().exception(ie).log("Failed to close ledger manager"); } // Close the scheduler scheduler.shutdown(); if (!scheduler.awaitTermination(10, TimeUnit.SECONDS)) { - LOG.warn("The scheduler did not shutdown cleanly"); + log.warn("The scheduler did not shutdown cleanly"); } // Close the watchTask scheduler highPriorityTaskExecutor.shutdown(); if (!highPriorityTaskExecutor.awaitTermination(10, TimeUnit.SECONDS)) { - LOG.warn("The highPriorityTaskExecutor for WatchTask did not shutdown cleanly, interrupting"); + log.warn("The highPriorityTaskExecutor for WatchTask did not shutdown cleanly, interrupting"); highPriorityTaskExecutor.shutdownNow(); } mainWorkerPool.shutdown(); if (!mainWorkerPool.awaitTermination(10, TimeUnit.SECONDS)) { - LOG.warn("The mainWorkerPool did not shutdown cleanly"); + log.warn("The mainWorkerPool did not shutdown cleanly"); } if (this.bookieInfoScheduler != null) { this.bookieInfoScheduler.shutdown(); if (!bookieInfoScheduler.awaitTermination(10, TimeUnit.SECONDS)) { - LOG.warn("The bookieInfoScheduler did not shutdown cleanly"); + log.warn("The bookieInfoScheduler did not shutdown cleanly"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java index 7bc99b2370f..c0337f9b083 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java @@ -56,6 +56,7 @@ import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Predicate; +import lombok.CustomLog; import lombok.SneakyThrows; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieImpl; @@ -96,16 +97,13 @@ import org.apache.commons.collections4.MapUtils; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Admin client for BookKeeper clusters. */ +@CustomLog public class BookKeeperAdmin implements AutoCloseable { - - private static final Logger LOG = LoggerFactory.getLogger(BookKeeperAdmin.class); - private static final Logger VERBOSE = LoggerFactory.getLogger("verbose"); + private static final io.github.merlimat.slog.Logger VERBOSE = io.github.merlimat.slog.Logger.get("verbose"); private static final BiConsumer NOOP_BICONSUMER = (l, e) -> { }; // BookKeeper client instance @@ -457,7 +455,11 @@ public boolean hasNext() { close(); return false; } - LOG.error("Error reading entry {} from ledger {}", nextEntryId, ledgerId, e); + log.error() + .exception(e) + .attr("entryId", nextEntryId) + .attr("ledgerId", ledgerId) + .log("Error reading entry from ledger"); close(); throw new RuntimeException(e); } @@ -487,7 +489,10 @@ private void close() { try { handle.close(); } catch (Exception e) { - LOG.error("Error closing ledger handle {}", handle, e); + log.error() + .exception(e) + .attr("handle", handle) + .log("Error closing ledger handle"); } } } @@ -512,7 +517,7 @@ public SortedMap getLedgersContainBookies(Set bo asyncGetLedgersContainBookies(bookies, new GenericCallback>() { @Override public void operationComplete(int rc, SortedMap result) { - LOG.info("GetLedgersContainBookies completed with rc : {}", rc); + log.info().attr("returnCode", rc).log("GetLedgersContainBookies completed"); synchronized (sync) { sync.rc = rc; sync.value = true; @@ -605,7 +610,9 @@ public void recoverBookieData(final Set bookiesSrc, boolean dryrun, bo asyncRecoverBookieData(bookiesSrc, dryrun, skipOpenLedgers, skipUnrecoverableLedgers, new RecoverCallback() { @Override public void recoverComplete(int rc, Object ctx) { - LOG.info("Recover bookie operation completed with rc: {}", BKException.codeLogger(rc)); + log.info() + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Recover bookie operation completed"); SyncObject syncObj = (SyncObject) ctx; synchronized (syncObj) { syncObj.rc = rc; @@ -634,7 +641,10 @@ public void recoverBookieData(final long lid, SyncObject sync = new SyncObject(); // Call the async method to recover bookie data. asyncRecoverBookieData(lid, bookiesSrc, dryrun, skipOpenLedgers, (rc, ctx) -> { - LOG.info("Recover bookie for {} completed with rc : {}", lid, BKException.codeLogger(rc)); + log.info() + .attr("ledgerId", lid) + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Recover bookie completed"); SyncObject syncObject = (SyncObject) ctx; synchronized (syncObject) { syncObject.rc = rc; @@ -807,19 +817,25 @@ private void recoverLedger(final Set bookiesSrc, final long lId, final private void recoverLedger(final Set bookiesSrc, final long lId, final boolean dryrun, final boolean skipOpenLedgers, final boolean skipUnrecoverableLedgers, final AsyncCallback.VoidCallback finalLedgerIterCb) { - if (LOG.isDebugEnabled()) { - LOG.debug("Recovering ledger : {}", lId); - } + + log.debug().attr("ledgerId", lId).log("Recovering ledger"); + asyncOpenLedgerNoRecovery(lId, new OpenCallback() { @Override public void openComplete(int rc, final LedgerHandle lh, Object ctx) { if (rc != BKException.Code.OK) { if (skipUnrecoverableLedgers) { - LOG.warn("BK error opening ledger: {}, skip recover it.", lId, BKException.create(rc)); + log.warn() + .attr("ledgerId", lId) + .attr("create", BKException.create(rc)) + .log("BK error opening ledger, skip recover it"); finalLedgerIterCb.processResult(BKException.Code.OK, null, null); } else { - LOG.error("BK error opening ledger: {}", lId, BKException.create(rc)); + log.error() + .attr("ledgerId", lId) + .attr("create", BKException.create(rc)) + .log("BK error opening ledger"); finalLedgerIterCb.processResult(rc, null, null); } return; @@ -827,13 +843,13 @@ public void openComplete(int rc, final LedgerHandle lh, Object ctx) { LedgerMetadata lm = lh.getLedgerMetadata(); if (skipOpenLedgers && lm.getState() == LedgerMetadata.State.OPEN) { - LOG.info("Skip recovering open ledger {}.", lId); + log.info().attr("ledgerId", lId).log("Skip recovering open ledger"); try { lh.close(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } catch (BKException bke) { - LOG.warn("Error on closing ledger handle for {}.", lId); + log.warn().attr("ledgerId", lId).log("Error on closing ledger handle"); } finalLedgerIterCb.processResult(BKException.Code.OK, null, null); return; @@ -849,18 +865,23 @@ public void openComplete(int rc, final LedgerHandle lh, Object ctx) { try { lh.close(); } catch (Exception ie) { - LOG.warn("Error closing non recovery ledger handle for ledger " + lId, ie); + log.warn().exception(ie).log("Error closing non recovery ledger handle for ledger " + lId); } asyncOpenLedger(lId, new OpenCallback() { @Override public void openComplete(int newrc, final LedgerHandle newlh, Object newctx) { if (newrc != BKException.Code.OK) { if (skipUnrecoverableLedgers) { - LOG.warn("BK error opening ledger: {}, skip recover it.", - lId, BKException.create(newrc)); + log.warn() + .attr("ledgerId", lId) + .attr("create", BKException.create(newrc)) + .log("BK error opening ledger, skip recover it"); finalLedgerIterCb.processResult(BKException.Code.OK, null, null); } else { - LOG.error("BK error close ledger: {}", lId, BKException.create(newrc)); + log.error() + .attr("ledgerId", lId) + .attr("create", BKException.create(newrc)) + .log("BK error close ledger"); finalLedgerIterCb.processResult(newrc, null, null); } return; @@ -880,21 +901,26 @@ public void openComplete(int newrc, final LedgerHandle newlh, Object newctx) { public void processResult(int rc, String path, Object ctx) { if (BKException.Code.OK != rc) { if (skipUnrecoverableLedgers) { - LOG.warn("Failed to recover ledger: {} : {}, skip recover it.", lId, - BKException.codeLogger(rc)); + log.warn() + .attr("ledgerId", lId) + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Failed to recover ledger, skip recover it"); rc = BKException.Code.OK; } else { - LOG.error("Failed to recover ledger {} : {}", lId, BKException.codeLogger(rc)); + log.error() + .attr("ledgerId", lId) + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Failed to recover ledger"); } } else { - LOG.info("Recovered ledger {}.", lId); + log.info().attr("ledgerId", lId).log("Recovered ledger"); } try { lh.close(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } catch (BKException bke) { - LOG.warn("Error on closing ledger handle for {}.", lId); + log.warn().attr("ledgerId", lId).log("Error on closing ledger handle"); } finalLedgerIterCb.processResult(rc, path, ctx); } @@ -947,7 +973,10 @@ public void processResult(int rc, String path, Object ctx) { } if (dryrun) { - VERBOSE.info("Recovered ledger {} : {}", lId, (fenceRequired ? "[fence required]" : "")); + VERBOSE.info() + .attr("ledgerId", lId) + .attr("status", (fenceRequired ? "[fence required]" : "")) + .log("Recovered ledger"); } /* @@ -971,8 +1000,11 @@ public void processResult(int rc, String path, Object ctx) { if (!dryrun) { ledgerFragmentsMcb.processResult(BKException.Code.NotEnoughBookiesException, null, null); } else { - VERBOSE.info(" Fragment [{} - {}] : {}", startEntryId, endEntryId, - BKException.getMessage(BKException.Code.NotEnoughBookiesException)); + VERBOSE.info() + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .attr("error", BKException.getMessage(BKException.Code.NotEnoughBookiesException)) + .log("Fragment recovery failed"); } continue; } @@ -980,14 +1012,25 @@ public void processResult(int rc, String path, Object ctx) { if (dryrun) { ArrayList newEnsemble = replaceBookiesInEnsemble(ensemble, targetBookieAddresses); - VERBOSE.info(" Fragment [{} - {}] : ", startEntryId, endEntryId); - VERBOSE.info(" old ensemble : {}", formatEnsemble(ensemble, bookiesSrc, '*')); - VERBOSE.info(" new ensemble : {}", formatEnsemble(newEnsemble, bookiesSrc, '*')); + VERBOSE.info() + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .log("Fragment"); + VERBOSE.info() + .attr("oldEnsemble", formatEnsemble(ensemble, bookiesSrc, '*')) + .log("Old ensemble"); + VERBOSE.info() + .attr("newEnsemble", formatEnsemble(newEnsemble, bookiesSrc, '*')) + .log("New ensemble"); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Replicating fragment from [{}, {}] of ledger {} to {}", - startEntryId, endEntryId, lh.getId(), targetBookieAddresses); - } + + log.debug() + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .attr("ledgerId", lh.getId()) + .attr("bookieAddr", targetBookieAddresses) + .log("Replicating fragment"); + try { LedgerFragmentReplicator.SingleFragmentCallback cb = new LedgerFragmentReplicator.SingleFragmentCallback(ledgerFragmentsMcb, lh, @@ -1104,11 +1147,12 @@ private Map getReplacementBookiesByIndexes( bookiesToExclude); BookieId newBookie = replaceBookieResponse.getResult(); PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy = replaceBookieResponse.getAdheringToPolicy(); - if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL && LOG.isDebugEnabled()) { - LOG.debug( - "replaceBookie for bookie: {} in ensemble: {} " - + "is not adhering to placement policy and chose {}", - oldBookie, ensemble, newBookie); + if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL) { + log.debug() + .attr("oldBookie", oldBookie) + .attr("ensemble", ensemble) + .attr("newBookie", newBookie) + .log("replaceBookie is not adhering to placement policy"); } targetBookieAddresses.put(bookieIndex, newBookie); bookiesToExclude.add(newBookie); @@ -1148,8 +1192,10 @@ public void replicateLedgerFragment(LedgerHandle lh, final LedgerFragment ledger ledgerFragment.getBookiesIndexes().addAll(targetBookieAddresses.keySet()); } if (MapUtils.isEmpty(targetBookieAddresses)) { - LOG.warn("Could not replicate for {} ledger: {}, not find target bookie.", - ledgerFragment.getReplicateType(), ledgerFragment.getLedgerId()); + log.warn() + .attr("getReplicateType", ledgerFragment.getReplicateType()) + .attr("ledgerId", ledgerFragment.getLedgerId()) + .log("Could not replicate for ledger, could not find target bookie"); throw new BKException.BKLedgerRecoveryException(); } replicateLedgerFragment(lh, ledgerFragment, targetBookieAddresses, onReadEntryFailureCallback); @@ -1331,8 +1377,10 @@ public static boolean nukeExistingCluster(ServerConfiguration conf, String ledge boolean force) throws Exception { String confLedgersRootPath = ZKMetadataDriverBase.resolveZkLedgersRootPath(conf); if (!confLedgersRootPath.equals(ledgersRootPath)) { - LOG.error("Provided ledgerRootPath : {} is not matching with config's ledgerRootPath: {}, " - + "so exiting nuke operation", ledgersRootPath, confLedgersRootPath); + log.error() + .attr("ledgersRootPath", ledgersRootPath) + .attr("confLedgersRootPath", confLedgersRootPath) + .log("Provided ledgerRootPath does not match config's ledgerRootPath, exiting nuke operation"); return false; } @@ -1341,8 +1389,10 @@ public static boolean nukeExistingCluster(ServerConfiguration conf, String ledge if (!force) { String readInstanceId = rm.getClusterInstanceId(); if ((instanceId == null) || !instanceId.equals(readInstanceId)) { - LOG.error("Provided InstanceId : {} is not matching with cluster InstanceId in ZK: {}", - instanceId, readInstanceId); + log.error() + .attr("instanceId", instanceId) + .attr("readInstanceId", readInstanceId) + .log("Provided InstanceId is not matching with cluster InstanceId in ZK"); return false; } } @@ -1390,14 +1440,18 @@ public static boolean initBookie(ServerConfiguration conf) throws Exception { */ BookieId bookieId = BookieImpl.getBookieId(conf); if (rm.isBookieRegistered(bookieId)) { - LOG.error("Bookie with bookieId: {} is still registered, " - + "If this node is running bookie process, try stopping it first.", bookieId); + log.error() + .attr("bookieId", bookieId) + .log("Bookie with bookieId: is still registered, " + + "If this node is running bookie process, try stopping it first."); return false; } try { rm.readCookie(bookieId); - LOG.error("Cookie still exists in the ZK for this bookie: {}, try formatting the bookie", bookieId); + log.error() + .attr("bookieId", bookieId) + .log("Cookie still exists in the ZK for this bookie, try formatting the bookie"); return false; } catch (BookieException.CookieNotFoundException nfe) { // it is expected for readCookie to fail with @@ -1414,7 +1468,10 @@ private static boolean validateDirectoriesAreEmpty(File[] dirs, String typeOfDir for (File dir : dirs) { File[] dirFiles = dir.listFiles(); if ((dirFiles != null) && dirFiles.length != 0) { - LOG.error("{}: {} is existing and its not empty, try formatting the bookie", typeOfDir, dir); + log.error() + .attr("typeOfDir", typeOfDir) + .attr("directory", dir) + .log(": is existing and its not empty, try formatting the bookie"); return false; } } @@ -1449,7 +1506,7 @@ public boolean hasNext() { } } } catch (IOException e) { - LOG.error("Error while checking if there is a next element", e); + log.error().exception(e).log("Error while checking if there is a next element"); } return false; @@ -1462,7 +1519,7 @@ public Long next() throws NoSuchElementException { currentRange = iterator.next().getLedgers().iterator(); } } catch (IOException e) { - LOG.error("Error while reading the next element", e); + log.error().exception(e).log("Error while reading the next element"); throw new NoSuchElementException(e.getMessage()); } @@ -1549,7 +1606,7 @@ public void triggerAudit() throws CompatibilityException, KeeperException, InterruptedException, UnavailableException, IOException { LedgerUnderreplicationManager urlManager = getUnderreplicationManager(); if (!urlManager.isLedgerReplicationEnabled()) { - LOG.error("Autorecovery is disabled. So giving up!"); + log.error("Autorecovery is disabled. So giving up!"); throw new UnavailableException("Autorecovery is disabled. So giving up!"); } @@ -1558,20 +1615,21 @@ public void triggerAudit() auditorId = getLedgerAuditorManager().getCurrentAuditor(); } catch (IOException e) { if (e.getCause() instanceof KeeperException.NoNodeException) { - LOG.error("Unable to find Zookeeper node: {}", e.getCause().getMessage()); + log.error().attr("getMessage", e.getCause().getMessage()).log("Unable to find Zookeeper node"); throw new UnavailableException("Autorecovery is disabled due to " + "missing Zookeeper node. Aborting recovery!"); } throw e; } if (auditorId == null) { - LOG.error("No auditor elected, though Autorecovery is enabled. So giving up."); + log.error("No auditor elected, though Autorecovery is enabled. So giving up."); throw new UnavailableException("No auditor elected, though Autorecovery is enabled. So giving up."); } int previousLostBookieRecoveryDelayValue = urlManager.getLostBookieRecoveryDelay(); - LOG.info("Resetting LostBookieRecoveryDelay value: {}, to kickstart audit task", - previousLostBookieRecoveryDelayValue); + log.info() + .attr("previousLostBookieRecoveryDelayValue", previousLostBookieRecoveryDelayValue) + .log("Resetting LostBookieRecoveryDelay to kickstart audit task"); urlManager.setLostBookieRecoveryDelay(previousLostBookieRecoveryDelayValue); } @@ -1598,7 +1656,7 @@ public void decommissionBookie(BookieId bookieAddress) throws CompatibilityException, UnavailableException, KeeperException, InterruptedException, IOException, BKAuditException, TimeoutException, BKException { if (getAvailableBookies().contains(bookieAddress) || getReadOnlyBookies().contains(bookieAddress)) { - LOG.error("Bookie: {} is not shutdown yet", bookieAddress); + log.error().attr("bookieAddress", bookieAddress).log("Bookie: is not shutdown yet"); throw BKException.create(BKException.Code.IllegalOpException); } @@ -1634,7 +1692,7 @@ public void decommissionBookie(BookieId bookieAddress) Iterator urLedgerIterator = underreplicationManager.listLedgersToRereplicate(predicate); if (urLedgerIterator.hasNext()) { //if there are any then wait and make sure those ledgers are replicated properly - LOG.info("Still in some underreplicated ledgers metadata, this bookie is part of its ensemble. " + log.info("Still in some underreplicated ledgers metadata, this bookie is part of its ensemble. " + "Have to make sure that those ledger fragments are rereplicated"); List urLedgers = new ArrayList<>(); urLedgerIterator.forEachRemaining((urLedger) -> { @@ -1655,12 +1713,14 @@ private void waitForLedgersToBeReplicated(Collection ledgers, BookieId thi while (!ledgers.isEmpty()) { int sleepTimeForThisCheck = (long) ledgers.size() * sleepTimePerLedger > maxSleepTimeInBetweenChecks ? maxSleepTimeInBetweenChecks : ledgers.size() * sleepTimePerLedger; - LOG.info("Count of Ledgers which need to be rereplicated: {}, waiting {} seconds for next check", - ledgers.size(), sleepTimeForThisCheck / 1000); + log.info() + .attr("size", ledgers.size()) + .attr("value", sleepTimeForThisCheck / 1000) + .log("Count of ledgers which need to be rereplicated, waiting for next check"); Thread.sleep(sleepTimeForThisCheck); - if (LOG.isDebugEnabled()) { - LOG.debug("Making sure following ledgers replication to be completed: {}", ledgers); - } + + log.debug().attr("ledgers", ledgers).log("Making sure ledger replication completes"); + ledgers.removeIf(validateBookieIsNotPartOfEnsemble); } } @@ -1677,12 +1737,13 @@ public static boolean areEntriesOfLedgerStoredInTheBookie(long ledgerId, BookieI if (e.getCause() != null && e.getCause().getClass() .equals(BKException.BKNoSuchLedgerExistsOnMetadataServerException.class)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} has been deleted", ledgerId); - } + + log.debug().attr("ledgerId", ledgerId).log("Ledger: has been deleted"); + return false; } else { - LOG.error("Got exception while trying to read LedgerMetadata of " + ledgerId, e); + log.error().exception(e).attr("ledgerId", ledgerId) + .log("Got exception while trying to read LedgerMetadata"); throw new RuntimeException(e); } } @@ -1828,8 +1889,10 @@ public Map replaceNotAdheringPlacementPolicyBookie(ListNOTE: This class is tended to be used by this project only. External users should not rely on it directly. */ +@CustomLog public class BookieInfoReader { - private static final Logger LOG = LoggerFactory.getLogger(BookieInfoReader.class); private static final long GET_BOOKIE_INFO_REQUEST_FLAGS = BookkeeperProtocol.GetBookieInfoRequest.Flags.TOTAL_DISK_CAPACITY_VALUE | BookkeeperProtocol.GetBookieInfoRequest.Flags.FREE_DISK_SPACE_VALUE; @@ -105,11 +104,12 @@ private static class BookieInfoMap { private Collection mostRecentlyReportedBookies = new ArrayList<>(); public void updateBookies(Collection updatedBookieSet) { - if (LOG.isDebugEnabled()) { - LOG.debug( - "updateBookies: current: {}, new: {}", - mostRecentlyReportedBookies, updatedBookieSet); - } + + log.debug() + .attr("mostRecentlyReportedBookies", mostRecentlyReportedBookies) + .attr("updatedBookieSet", updatedBookieSet) + .log("updateBookies"); + infoMap.keySet().retainAll(updatedBookieSet); mostRecentlyReportedBookies = updatedBookieSet; } @@ -242,15 +242,18 @@ public void start() { @Override public void run() { synchronized (BookieInfoReader.this) { - if (LOG.isDebugEnabled()) { - LOG.debug("Running periodic BookieInfo scan"); - } + + log.debug("Running periodic BookieInfo scan"); + try { Collection updatedBookies = bk.bookieWatcher.getBookies(); bookieInfoMap.updateBookies(updatedBookies); } catch (BKException e) { - LOG.info("Got exception while querying bookies from watcher, rerunning after {}s", - conf.getGetBookieInfoRetryIntervalSeconds(), e); + log.info() + .exception(e) + .attr("getGetBookieInfoRetryIntervalSeconds", + conf.getGetBookieInfoRetryIntervalSeconds()) + .log("Got exception while querying bookies from watcher"); scheduler.schedule(this, conf.getGetBookieInfoRetryIntervalSeconds(), TimeUnit.SECONDS); return; } @@ -271,9 +274,9 @@ private void submitTaskWithDelay(int delaySeconds) { } synchronized void availableBookiesChanged(Set updatedBookiesList) { - if (LOG.isInfoEnabled()) { - LOG.info("Scheduling bookie info read due to changes in available bookies."); - } + + log.info("Scheduling bookie info read due to changes in available bookies."); + bookieInfoMap.updateBookies(updatedBookiesList); if (instanceState.tryStartPartial()) { submitTask(); @@ -308,19 +311,19 @@ synchronized void getReadWriteBookieInfo() { State queuedType = instanceState.getAndClearQueuedType(); Collection toScan; if (queuedType == State.FULL) { - if (LOG.isDebugEnabled()) { - LOG.debug("Doing full scan"); - } + + log.debug("Doing full scan"); + toScan = bookieInfoMap.getFullScanTargets(); } else if (queuedType == State.PARTIAL) { - if (LOG.isDebugEnabled()) { - LOG.debug("Doing partial scan"); - } + + log.debug("Doing partial scan"); + toScan = bookieInfoMap.getPartialScanTargets(); } else { - if (LOG.isErrorEnabled()) { - LOG.error("Invalid state, queuedType cannot be UNQUEUED in getReadWriteBookieInfo"); - } + + log.error("Invalid state, queuedType cannot be UNQUEUED in getReadWriteBookieInfo"); + assert(queuedType != State.UNQUEUED); return; } @@ -332,9 +335,9 @@ synchronized void getReadWriteBookieInfo() { completedCnt = 0; errorCnt = 0; - if (LOG.isDebugEnabled()) { - LOG.debug("Getting bookie info for: {}", toScan); - } + + log.debug().attr("toScan", toScan).log("Getting bookie info"); + for (BookieId b : toScan) { bkc.getBookieInfo(b, requested, new GetBookieInfoCallback() { @@ -342,18 +345,23 @@ void processReadInfoComplete(int rc, BookieInfo bInfo, Object ctx) { synchronized (BookieInfoReader.this) { BookieId b = (BookieId) ctx; if (rc != BKException.Code.OK) { - if (LOG.isErrorEnabled()) { - LOG.error("Reading bookie info from bookie {} failed due to {}", - b, BKException.codeLogger(rc)); - } + + log.error() + .attr("bookieId", b) + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Reading bookie info from bookie failed"); + // We reread bookies missing from the map each time, so remove to ensure // we get to it on the next scan bookieInfoMap.clearInfo(b); errorCnt++; } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Bookie Info for bookie {} is {}", b, bInfo); - } + + log.debug() + .attr("bookieId", b) + .attr("bInfo", bInfo) + .log("Bookie Info received"); + bookieInfoMap.gotInfo(b, bInfo); } completedCnt++; @@ -383,15 +391,17 @@ public void run() { void onExit() { bk.placementPolicy.updateBookieInfo(bookieInfoMap.getBookieMap()); if (errorCnt > 0) { - if (LOG.isInfoEnabled()) { - LOG.info("Rescheduling in {}s due to errors", conf.getGetBookieInfoIntervalSeconds()); - } + + log.info() + .attr("getGetBookieInfoIntervalSeconds", conf.getGetBookieInfoIntervalSeconds()) + .log("Rescheduling due to errors"); + instanceState.tryStartPartial(); submitTaskWithDelay(conf.getGetBookieInfoRetryIntervalSeconds()); } else if (instanceState.completeUnlessQueued()) { - if (LOG.isInfoEnabled()) { - LOG.info("Rescheduling, another scan is pending"); - } + + log.info("Rescheduling, another scan is pending"); + submitTask(); } } @@ -419,14 +429,19 @@ Map getBookieInfo() throws BKException, InterruptedExcepti public void getBookieInfoComplete(int rc, BookieInfo bInfo, Object ctx) { BookieId b = (BookieId) ctx; if (rc != BKException.Code.OK) { - if (LOG.isErrorEnabled()) { - LOG.error("Reading bookie info from bookie {} failed due to {}", - b, BKException.codeLogger(rc)); - } + + log.error() + .attr("bookieId", b) + .attr("codeLogger", BKException.codeLogger(rc)) + .log("Reading bookie info from bookie failed"); + } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Free disk space on bookie {} is {}.", b, bInfo.getFreeDiskSpace()); - } + + log.debug() + .attr("bookieId", b) + .attr("getFreeDiskSpace", bInfo.getFreeDiskSpace()) + .log("Free disk space on bookie"); + map.put(b, bInfo); } if (totalCompleted.incrementAndGet() == totalSent.get()) { @@ -439,7 +454,7 @@ public void getBookieInfoComplete(int rc, BookieInfo bInfo, Object ctx) { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Received InterruptedException ", e); + log.error().exception(e).log("Received InterruptedException "); throw e; } return map; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java index f7af1549286..3b4011d8bdd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieWatcherImpl.java @@ -35,7 +35,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookKeeperServerStats; import org.apache.bookkeeper.client.BKException.BKInterruptedException; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; @@ -63,15 +63,15 @@ name = WATCHER_SCOPE, help = "Bookie watcher related stats" ) -@Slf4j +@CustomLog class BookieWatcherImpl implements BookieWatcher { private static final Function EXCEPTION_FUNC = cause -> { if (cause instanceof BKException) { - log.error("Failed to get bookie list : ", cause); + log.error().exception(cause).log("Failed to get bookie list"); return (BKException) cause; } else if (cause instanceof InterruptedException) { - log.error("Interrupted reading bookie list : ", cause); + log.error().exception(cause).log("Interrupted reading bookie list"); return new BKInterruptedException(); } else { MetaStoreException mse = new MetaStoreException(cause); @@ -126,7 +126,7 @@ public BookieWatcherImpl(ClientConfiguration conf, @Override public void onRemoval(RemovalNotification bookie) { - log.info("Bookie {} is no longer quarantined", bookie.getKey()); + log.info().attr("bookieId", bookie.getKey()).log("Bookie is no longer quarantined"); } }).build(); @@ -252,7 +252,7 @@ public void initialBlockingBookieRead() throws BKException { Thread.currentThread().interrupt(); throw ie; } catch (Exception e) { - log.error("Failed getReadOnlyBookies: ", e); + log.error().exception(e).log("Failed getReadOnlyBookies"); } } @@ -273,23 +273,27 @@ public List newEnsemble(int ensembleSize, int writeQuorumSize, if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL) { ensembleNotAdheringToPlacementPolicy.inc(); if (ensembleSize > 1) { - log.info("New ensemble: {} is not adhering to Placement Policy. quarantinedBookies: {}", - socketAddresses, quarantinedBookiesSet); + log.info() + .attr("socketAddresses", socketAddresses) + .attr("quarantinedBookies", quarantinedBookiesSet) + .log("New ensemble: is not adhering to Placement Policy"); } } // we try to only get from the healthy bookies first newEnsembleTimer.registerSuccessfulEvent(MathUtils.nowInNano() - startTime, TimeUnit.NANOSECONDS); } catch (BKNotEnoughBookiesException e) { - if (log.isDebugEnabled()) { - log.debug("Not enough healthy bookies available, using quarantined bookies"); - } + + log.debug("Not enough healthy bookies available, using quarantined bookies"); + newEnsembleResponse = placementPolicy.newEnsemble( ensembleSize, writeQuorumSize, ackQuorumSize, customMetadata, new HashSet<>()); socketAddresses = newEnsembleResponse.getResult(); isEnsembleAdheringToPlacementPolicy = newEnsembleResponse.getAdheringToPolicy(); if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL) { ensembleNotAdheringToPlacementPolicy.inc(); - log.info("New ensemble: {} is not adhering to Placement Policy", socketAddresses); + log.info() + .attr("socketAddresses", socketAddresses) + .log("New ensemble: is not adhering to Placement Policy"); } newEnsembleTimer.registerFailedEvent(MathUtils.nowInNano() - startTime, TimeUnit.NANOSECONDS); } @@ -320,26 +324,31 @@ public BookieId replaceBookie(int ensembleSize, int writeQuorumSize, int ackQuor isEnsembleAdheringToPlacementPolicy = replaceBookieResponse.getAdheringToPolicy(); if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL) { ensembleNotAdheringToPlacementPolicy.inc(); - log.warn( - "replaceBookie for bookie: {} in ensemble: {} is not adhering to placement policy and" - + " chose {}. excludedBookies {} and quarantinedBookies {}", - addr, existingBookies, socketAddress, excludeBookies, quarantinedBookiesSet); + log.warn() + .attr("bookieAddr", addr) + .attr("existingBookies", existingBookies) + .attr("socketAddress", socketAddress) + .attr("excludeBookies", excludeBookies) + .attr("quarantinedBookiesSet", quarantinedBookiesSet) + .log("replaceBookie for bookie: in ensemble: is not adhering to placement policy and chose"); } replaceBookieTimer.registerSuccessfulEvent(MathUtils.nowInNano() - startTime, TimeUnit.NANOSECONDS); } catch (BKNotEnoughBookiesException e) { - if (log.isDebugEnabled()) { - log.debug("Not enough healthy bookies available, using quarantined bookies"); - } + + log.debug("Not enough healthy bookies available, using quarantined bookies"); + replaceBookieResponse = placementPolicy.replaceBookie(ensembleSize, writeQuorumSize, ackQuorumSize, customMetadata, existingBookies, addr, excludeBookies); socketAddress = replaceBookieResponse.getResult(); isEnsembleAdheringToPlacementPolicy = replaceBookieResponse.getAdheringToPolicy(); if (isEnsembleAdheringToPlacementPolicy == PlacementPolicyAdherence.FAIL) { ensembleNotAdheringToPlacementPolicy.inc(); - log.warn( - "replaceBookie for bookie: {} in ensemble: {} is not adhering to placement policy and" - + " chose {}. excludedBookies {}", - addr, existingBookies, socketAddress, excludeBookies); + log.warn() + .attr("bookieAddr", addr) + .attr("existingBookies", existingBookies) + .attr("socketAddress", socketAddress) + .attr("excludeBookies", excludeBookies) + .log("replaceBookie for bookie: in ensemble: is not adhering to placement policy and chose"); } replaceBookieTimer.registerFailedEvent(MathUtils.nowInNano() - startTime, TimeUnit.NANOSECONDS); } @@ -354,7 +363,7 @@ public BookieId replaceBookie(int ensembleSize, int writeQuorumSize, int ackQuor public void quarantineBookie(BookieId bookie) { if (quarantinedBookies.getIfPresent(bookie) == null) { quarantinedBookies.put(bookie, Boolean.TRUE); - log.warn("Bookie {} has been quarantined because of read/write errors.", bookie); + log.warn().attr("bookieId", bookie).log("Bookie has been quarantined because of read/write errors."); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultBookieAddressResolver.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultBookieAddressResolver.java index 08016bdd821..7887cf2f723 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultBookieAddressResolver.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultBookieAddressResolver.java @@ -17,7 +17,7 @@ */ package org.apache.bookkeeper.client; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.common.concurrent.FutureUtils; import org.apache.bookkeeper.discover.BookieServiceInfo; import org.apache.bookkeeper.discover.RegistrationClient; @@ -28,7 +28,7 @@ /** * Resolve BookieIDs to Network addresses. */ -@Slf4j +@CustomLog public class DefaultBookieAddressResolver implements BookieAddressResolver { private final RegistrationClient registrationClient; @@ -53,19 +53,24 @@ public BookieSocketAddress resolve(BookieId bookieId) { BookieSocketAddress res = new BookieSocketAddress(endpoint.getHost(), endpoint.getPort()); if (!bookieId.toString().equals(res.toString())) { // only print if the information is useful - log.info("Resolved {} as {}", bookieId, res); - } else if (log.isDebugEnabled()) { - log.debug("Resolved {} as {}", bookieId, res); + log.info() + .attr("bookieId", bookieId) + .attr("res", res) + .log("Resolved as"); } + return res; } catch (BKException.BKBookieHandleNotAvailableException ex) { if (BookieSocketAddress.isDummyBookieIdForHostname(bookieId)) { - if (log.isDebugEnabled()) { - log.debug("Resolving dummy bookie Id {} using legacy bookie resolver", bookieId); - } + + log.debug().attr("bookieId", bookieId).log("Resolving dummy bookie Id using legacy bookie resolver"); + return BookieSocketAddress.resolveLegacyBookieId(bookieId); } - log.info("Cannot resolve {}, bookie is unknown {}", bookieId, ex.toString()); + log.info() + .attr("bookieId", bookieId) + .exceptionMessage(ex) + .log("Cannot resolve bookie, bookie is unknown"); throw new BookieIdNotResolvedException(bookieId, ex); } catch (Exception ex) { if (ex instanceof InterruptedException) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultEnsemblePlacementPolicy.java index 94cd30344f1..f54094cc7dd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultEnsemblePlacementPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultEnsemblePlacementPolicy.java @@ -28,6 +28,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; import org.apache.bookkeeper.client.WeightedRandomSelection.WeightedObject; @@ -38,16 +39,14 @@ import org.apache.bookkeeper.proto.BookieAddressResolver; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Default Ensemble Placement Policy, which picks bookies randomly. * * @see EnsemblePlacementPolicy */ +@CustomLog public class DefaultEnsemblePlacementPolicy implements EnsemblePlacementPolicy { - static final Logger LOG = LoggerFactory.getLogger(DefaultEnsemblePlacementPolicy.class); static final Set EMPTY_SET = new HashSet(); private boolean isWeighted; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultSpeculativeRequestExecutionPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultSpeculativeRequestExecutionPolicy.java index c85fb1dc29e..cc2fe8a3376 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultSpeculativeRequestExecutionPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DefaultSpeculativeRequestExecutionPolicy.java @@ -29,8 +29,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * A default implementation of {@link SpeculativeRequestExecutionPolicy}. @@ -38,8 +37,8 @@ *

The policy issues speculative requests in a backoff way. The time between two speculative requests * are between {@code firstSpeculativeRequestTimeout} and {@code maxSpeculativeRequestTimeout}. */ +@CustomLog public class DefaultSpeculativeRequestExecutionPolicy implements SpeculativeRequestExecutionPolicy { - private static final Logger LOG = LoggerFactory.getLogger(DefaultSpeculativeRequestExecutionPolicy.class); final int firstSpeculativeRequestTimeout; final int maxSpeculativeRequestTimeout; final float backoffMultiplier; @@ -90,25 +89,33 @@ public void onSuccess(Boolean issueNextRequest) { Math.min(maxSpeculativeRequestTimeout, Math.round((float) speculativeRequestTimeout * backoffMultiplier))); } else { - if (LOG.isTraceEnabled()) { - LOG.trace("Stopped issuing speculative requests for {}, " - + "speculativeReadTimeout = {}", requestExecutor, speculativeRequestTimeout); - } + + log.trace() + .attr("requestExecutor", requestExecutor) + .attr("speculativeRequestTimeout", speculativeRequestTimeout) + .log("Stopped issuing speculative requests"); + } } @Override public void onFailure(Throwable thrown) { - LOG.warn("Failed to issue speculative request for {}, speculativeReadTimeout = {} : ", - requestExecutor, speculativeRequestTimeout, thrown); + log.warn() + .attr("requestExecutor", requestExecutor) + .attr("speculativeRequestTimeout", speculativeRequestTimeout) + .exception(thrown) + .log("Failed to issue speculative request"); } }, directExecutor()); } }, speculativeRequestTimeout, TimeUnit.MILLISECONDS); } catch (RejectedExecutionException re) { if (!scheduler.isShutdown()) { - LOG.warn("Failed to schedule speculative request for {}, speculativeReadTimeout = {} : ", - requestExecutor, speculativeRequestTimeout, re); + log.warn() + .exception(re) + .attr("requestExecutor", requestExecutor) + .attr("speculativeRequestTimeout", speculativeRequestTimeout) + .log("Failed to schedule speculative request"); } } return null; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DynamicWeightedRandomSelectionImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DynamicWeightedRandomSelectionImpl.java index 7da6b4c20d6..dc037cb3504 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DynamicWeightedRandomSelectionImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/DynamicWeightedRandomSelectionImpl.java @@ -28,8 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * DynamicWeightedRandomSelectionImpl class implements both getNextRandom @@ -37,8 +36,8 @@ * knows of as candidates, but getNextRandom(Collection selectedNodes) method * considers only 'selectedNodes' as candidates. */ +@CustomLog class DynamicWeightedRandomSelectionImpl implements WeightedRandomSelection { - static final Logger LOG = LoggerFactory.getLogger(DynamicWeightedRandomSelectionImpl.class); int maxProbabilityMultiplier; final Map weightMap; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java index dd16f800c61..79546840ae8 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java @@ -27,19 +27,18 @@ import java.util.List; import java.util.Map; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class EnsembleUtils { - private static final Logger LOG = LoggerFactory.getLogger(EnsembleUtils.class); static List replaceBookiesInEnsemble(BookieWatcher bookieWatcher, LedgerMetadata metadata, List oldEnsemble, Map failedBookies, - String logContext) + int ensembleChangeId) throws BKException.BKNotEnoughBookiesException { List newEnsemble = new ArrayList<>(oldEnsemble); @@ -54,15 +53,23 @@ static List replaceBookiesInEnsemble(BookieWatcher bookieWatcher, for (Map.Entry entry : failedBookies.entrySet()) { int idx = entry.getKey(); BookieId addr = entry.getValue(); - if (LOG.isDebugEnabled()) { - LOG.debug("{} replacing bookie: {} index: {}", logContext, addr, idx); - } + + log.debug() + .attr("ledgerId", metadata.getLedgerId()) + .attr("ensembleChangeId", ensembleChangeId) + .attr("bookieAddr", addr) + .attr("idx", idx) + .log("replacing bookie"); if (!newEnsemble.get(idx).equals(addr)) { - if (LOG.isDebugEnabled()) { - LOG.debug("{} Not changing failed bookie {} at index {}, already changed to {}", - logContext, addr, idx, newEnsemble.get(idx)); - } + log.debug() + .attr("ledgerId", metadata.getLedgerId()) + .attr("ensembleChangeId", ensembleChangeId) + .attr("bookieAddr", addr) + .attr("idx", idx) + .attr("newBookie", newEnsemble.get(idx)) + .log("Not changing failed bookie at index, already changed"); + continue; } try { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java index e2c222220d2..d62d49a121b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java @@ -23,10 +23,9 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.client.SyncCallbackUtils.LastAddConfirmedCallback; import org.apache.bookkeeper.util.ByteBufList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; interface ExplicitLacFlushPolicy { void stopExplicitLacFlush(); @@ -45,8 +44,8 @@ public void updatePiggyBackedLac(long piggyBackedLac) { } }; + @CustomLog class ExplicitLacFlushPolicyImpl implements ExplicitLacFlushPolicy { - static final Logger LOG = LoggerFactory.getLogger(ExplicitLacFlushPolicyImpl.class); volatile long piggyBackedLac = LedgerHandle.INVALID_ENTRY_ID; volatile long explicitLac = LedgerHandle.INVALID_ENTRY_ID; @@ -61,9 +60,9 @@ class ExplicitLacFlushPolicyImpl implements ExplicitLacFlushPolicy { this.clientCtx = clientCtx; scheduleExplictLacFlush(); - if (LOG.isDebugEnabled()) { - LOG.debug("Scheduled Explicit Last Add Confirmed Update"); - } + + log.debug("Scheduled Explicit Last Add Confirmed Update"); + } private long getExplicitLac() { @@ -90,25 +89,28 @@ public void run() { // Piggyback, so no need to send an explicit LAC update to // bookies. if (getExplicitLac() < getPiggyBackedLac()) { - if (LOG.isDebugEnabled()) { - LOG.debug("ledgerid: {}", lh.getId()); - LOG.debug("explicitLac:{} piggybackLac:{}", getExplicitLac(), getPiggyBackedLac()); - } + log.debug() + .attr("ledgerId", lh.getId()) + .attr("explicitLac", getExplicitLac()) + .attr("piggyBackedLac", getPiggyBackedLac()) + .log("explicitLac / piggybackLac"); + setExplicitLac(getPiggyBackedLac()); return; } if (lh.getLastAddConfirmed() > getExplicitLac()) { // Send Explicit LAC - if (LOG.isDebugEnabled()) { - LOG.debug("ledgerid: {}", lh.getId()); - } + log.debug().attr("ledgerId", lh.getId()).log("Send explicit LAC"); + asyncExplicitLacFlush(lh.getLastAddConfirmed()); setExplicitLac(lh.getLastAddConfirmed()); - if (LOG.isDebugEnabled()) { - LOG.debug("After sending explict LAC lac: {} explicitLac:{}", lh.getLastAddConfirmed(), - getExplicitLac()); - } + + log.debug() + .attr("ledgerId", lh.getId()) + .attr("getLastAddConfirmed", lh.getLastAddConfirmed()) + .attr("explicitLac", getExplicitLac()) + .log("After sending explict LAC lac"); } } @@ -122,7 +124,10 @@ public String toString() { scheduledFuture = clientCtx.getScheduler().scheduleAtFixedRateOrdered(lh.getId(), updateLacTask, explicitLacIntervalInMs, explicitLacIntervalInMs, TimeUnit.MILLISECONDS); } catch (RejectedExecutionException re) { - LOG.error("Scheduling of ExplictLastAddConfirmedFlush for ledger: {} has failed.", lh.getId(), re); + log.error() + .exception(re) + .attr("ledgerId", lh.getId()) + .log("Scheduling of ExplictLastAddConfirmedFlush for ledger: has failed."); } } @@ -134,9 +139,9 @@ void asyncExplicitLacFlush(final long explicitLac) { final PendingWriteLacOp op = new PendingWriteLacOp(lh, clientCtx, lh.getCurrentEnsemble(), cb, null); op.setLac(explicitLac); try { - if (LOG.isDebugEnabled()) { - LOG.debug("Sending Explicit LAC: {}", explicitLac); - } + + log.debug().attr("explicitLac", explicitLac).log("Sending Explicit LAC"); + clientCtx.getMainWorkerPool().submit(() -> { ByteBufList toSend = lh.macManager .computeDigestAndPackageForSendingLac(lh.getLastAddConfirmed()); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ForceLedgerOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ForceLedgerOp.java index b96fa095ddb..2597849d631 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ForceLedgerOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ForceLedgerOp.java @@ -21,19 +21,17 @@ import java.util.List; import java.util.concurrent.CompletableFuture; +import lombok.CustomLog; import org.apache.bookkeeper.common.concurrent.FutureUtils; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieClient; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ForceLedgerCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This represents a request to sync the ledger on every bookie. */ +@CustomLog class ForceLedgerOp implements Runnable, ForceLedgerCallback { - - private static final Logger LOG = LoggerFactory.getLogger(ForceLedgerOp.class); final CompletableFuture cb; DistributionSchedule.AckSet ackSet; @@ -71,9 +69,12 @@ void initiate() { // remember that we are inside OrderedExecutor, this induces a strict ordering // on the sequence of events this.currentNonDurableLastAddConfirmed = lh.pendingAddsSequenceHead; - if (LOG.isDebugEnabled()) { - LOG.debug("force {} clientNonDurableLac {}", lh.ledgerId, currentNonDurableLastAddConfirmed); - } + + log.debug() + .attr("ledgerId", lh.ledgerId) + .attr("nonDurableLac", currentNonDurableLastAddConfirmed) + .log("force clientNonDurableLac"); + // we need to send the request to every bookie in the ensamble this.ackSet = lh.distributionSchedule.getEnsembleAckSet(); @@ -108,17 +109,22 @@ public void forceLedgerComplete(int rc, long ledgerId, BookieId addr, Object ctx completed = true; // we are able to say that every bookie sync'd its own journal // for every acknowledged entry before issuing the force() call - if (LOG.isDebugEnabled()) { - LOG.debug("After force on ledger {} updating LastAddConfirmed to {} ", - ledgerId, currentNonDurableLastAddConfirmed); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("nonDurableLac", currentNonDurableLastAddConfirmed) + .log("After force on ledger, updating LastAddConfirmed"); + lh.updateLastConfirmed(currentNonDurableLastAddConfirmed, lh.getLength()); FutureUtils.complete(cb, null); } } else { // at least one bookie failed, as we are waiting for all the bookies // we can fail immediately - LOG.error("ForceLedger did not succeed: Ledger {} on {}", ledgerId, addr); + log.error() + .attr("ledgerId", ledgerId) + .attr("bookieAddr", addr) + .log("ForceLedger did not succeed"); errored = true; // notify the failure diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java index 9364b8563c6..ef12014a97f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java @@ -33,22 +33,21 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.Code; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieClient; import org.apache.bookkeeper.proto.BookieProtocol; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A utility class to check the complete ledger and finds the UnderReplicated fragments if any. * *

NOTE: This class is tended to be used by this project only. External users should not rely on it directly. */ +@CustomLog public class LedgerChecker { - private static final Logger LOG = LoggerFactory.getLogger(LedgerChecker.class); public final BookieClient bookieClient; public final BookieWatcher bookieWatcher; @@ -87,9 +86,14 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, cb.operationComplete(rc, fragment); } } else if (!completed.getAndSet(true)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Read {}:{} from {} failed, the error code: {}", ledgerId, entryId, ctx, rc); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("ctx", ctx) + .attr("returnCode", rc) + .log("Read failed"); + cb.operationComplete(rc, fragment); } } @@ -455,7 +459,10 @@ public void operationComplete(int rc, Boolean result) { bookieClient.readEntry(addr, lh.getId(), entryToRead, eecb, null, BookieProtocol.FLAG_NONE); } catch (InterruptedException e) { - LOG.error("InterruptedException when checking entry : {}", entryToRead, e); + log.error() + .exception(e) + .attr("entryId", entryToRead) + .log("InterruptedException when checking entry"); } } return; @@ -478,19 +485,25 @@ private void checkFragments(Set fragments, FullLedgerCallback allFragmentsCb = new FullLedgerCallback(fragments .size(), cb); for (LedgerFragment r : fragments) { - if (LOG.isDebugEnabled()) { - LOG.debug("Checking fragment {}", r); - } + + log.debug().attr("ledgerFragment", r).log("Checking fragment"); + try { verifyLedgerFragment(r, allFragmentsCb, percentageOfLedgerFragmentToBeVerified); } catch (InvalidFragmentException ife) { - LOG.error("Invalid fragment found : {}", r); + log.error().attr("ledgerFragment", r).log("Invalid fragment found"); allFragmentsCb.operationComplete( BKException.Code.IncorrectParameterException, r); } catch (BKException e) { - LOG.error("BKException when checking fragment : {}", r, e); + log.error() + .exception(e) + .attr("ledgerFragment", r) + .log("BKException when checking fragment"); } catch (InterruptedException e) { - LOG.error("InterruptedException when checking fragment : {}", r, e); + log.error() + .exception(e) + .attr("ledgerFragment", r) + .log("InterruptedException when checking fragment"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java index 5eaeebf6837..e64342bf28c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerCreateOp.java @@ -30,6 +30,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.client.AsyncCallback.CreateCallback; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; import org.apache.bookkeeper.client.BookKeeper.DigestType; @@ -47,17 +48,14 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Encapsulates asynchronous ledger create operation. * */ +@CustomLog class LedgerCreateOp { - static final Logger LOG = LoggerFactory.getLogger(LedgerCreateOp.class); - final CreateCallback cb; LedgerMetadata metadata; LedgerHandle lh; @@ -141,18 +139,22 @@ public void initiate() { break; } catch (BKNotEnoughBookiesException e) { if (actualEnsembleSize >= writeQuorumSize + 1) { - LOG.info("Not enough bookies to create ledger with ensembleSize={}," - + " writeQuorumSize={} and ackQuorumSize={}, opportusticStriping enabled, try again", - actualEnsembleSize, writeQuorumSize, ackQuorumSize); + log.info() + .attr("ensembleSize", actualEnsembleSize) + .attr("writeQuorumSize", writeQuorumSize) + .attr("ackQuorumSize", ackQuorumSize) + .log("Not enough bookies to create ledger with opportusticStriping enabled, try again"); } lastError = e; actualEnsembleSize--; } } if (lastError != null) { - LOG.error("Not enough bookies to create ledger with ensembleSize={}," - + " writeQuorumSize={} and ackQuorumSize={}", - actualEnsembleSize, writeQuorumSize, ackQuorumSize); + log.error() + .attr("ensembleSize", actualEnsembleSize) + .attr("writeQuorumSize", writeQuorumSize) + .attr("ackQuorumSize", ackQuorumSize) + .log("Not enough bookies to create ledger"); createComplete(lastError.getCode(), null); return; } @@ -161,9 +163,11 @@ public void initiate() { ensemble = bk.getBookieWatcher() .newEnsemble(actualEnsembleSize, writeQuorumSize, ackQuorumSize, customMetadata); } catch (BKNotEnoughBookiesException e) { - LOG.error("Not enough bookies to create ledger with ensembleSize={}," - + " writeQuorumSize={} and ackQuorumSize={}", - actualEnsembleSize, writeQuorumSize, ackQuorumSize); + log.error() + .attr("ensembleSize", actualEnsembleSize) + .attr("writeQuorumSize", writeQuorumSize) + .attr("ackQuorumSize", ackQuorumSize) + .log("Not enough bookies to create ledger"); createComplete(e.getCode(), null); return; } @@ -243,17 +247,26 @@ private void metadataCallback(Versioned writtenMetadata, lh = new LedgerHandle(bk.getClientCtx(), ledgerId, writtenMetadata, digestType, passwd, writeFlags); } } catch (GeneralSecurityException e) { - LOG.error("Security exception while creating ledger: " + ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Security exception while creating ledger"); createComplete(BKException.Code.DigestNotInitializedException, null); return; } catch (NumberFormatException e) { - LOG.error("Incorrectly entered parameter throttle: " + bk.getConf().getThrottleValue(), e); + log.error() + .exception(e) + .attr("throttle", bk.getConf().getThrottleValue()) + .log("Incorrectly entered parameter throttle"); createComplete(BKException.Code.IncorrectParameterException, null); return; } List curEns = lh.getLedgerMetadata().getEnsembleAt(0L); - LOG.info("Ensemble: {} for ledger: {}", curEns, lh.getId()); + log.info() + .attr("ensemble", curEns) + .attr("ledgerId", lh.getId()) + .log("New ledger"); for (BookieId bsa : curEns) { clientStats.getEnsembleBookieDistributionCounter(bsa.toString()).inc(); @@ -344,38 +357,43 @@ public CreateAdvBuilder makeAdv() { private boolean validate() { if (builderWriteFlags == null) { - LOG.error("invalid null writeFlags"); + log.error("invalid null writeFlags"); return false; } if (builderWriteQuorumSize > builderEnsembleSize) { - LOG.error("invalid writeQuorumSize {} > ensembleSize {}", builderWriteQuorumSize, builderEnsembleSize); + log.error() + .attr("writeQuorumSize", builderWriteQuorumSize) + .attr("ensembleSize", builderEnsembleSize) + .log("invalid writeQuorumSize > ensembleSize"); return false; } if (builderAckQuorumSize > builderWriteQuorumSize) { - LOG.error("invalid ackQuorumSize {} > writeQuorumSize {}", builderAckQuorumSize, - builderWriteQuorumSize); + log.error() + .attr("ackQuorumSize", builderAckQuorumSize) + .attr("writeQuorumSize", builderWriteQuorumSize) + .log("invalid ackQuorumSize > writeQuorumSize"); return false; } if (builderAckQuorumSize <= 0) { - LOG.error("invalid ackQuorumSize {} <= 0", builderAckQuorumSize); + log.error().attr("ackQuorumSize", builderAckQuorumSize).log("invalid ackQuorumSize <= 0"); return false; } if (builderPassword == null) { - LOG.error("invalid null password"); + log.error("invalid null password"); return false; } if (builderDigestType == null) { - LOG.error("invalid null digestType"); + log.error("invalid null digestType"); return false; } if (builderCustomMetadata == null) { - LOG.error("invalid null customMetadata"); + log.error("invalid null customMetadata"); return false; } @@ -441,8 +459,9 @@ private boolean validate() { return false; } if (builderLedgerId != null && builderLedgerId < 0) { - LOG.error("invalid ledgerId {} < 0. Do not set en explicit value if you want automatic generation", - builderLedgerId); + log.error() + .attr("ledgerId", builderLedgerId) + .log("invalid ledgerId < 0. Do not set en explicit value if you want automatic generation"); return false; } return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerDeleteOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerDeleteOp.java index a19bd761de0..7399d4064ef 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerDeleteOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerDeleteOp.java @@ -24,23 +24,21 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.client.AsyncCallback.DeleteCallback; import org.apache.bookkeeper.client.SyncCallbackUtils.SyncDeleteCallback; import org.apache.bookkeeper.client.api.DeleteBuilder; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.versioning.Version; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Encapsulates asynchronous ledger delete operation. * */ +@CustomLog class LedgerDeleteOp { - static final Logger LOG = LoggerFactory.getLogger(LedgerDeleteOp.class); - final BookKeeper bk; final long ledgerId; final DeleteCallback cb; @@ -117,7 +115,7 @@ public CompletableFuture execute() { private boolean validate() { if (builderLedgerId == null || builderLedgerId < 0) { - LOG.error("invalid ledgerId {} < 0", builderLedgerId); + log.error().attr("ledgerId", builderLedgerId).log("invalid ledgerId < 0"); return false; } return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java index f6d54e1d02b..3f4f74b0352 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java @@ -44,6 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.client.AsyncCallback.ReadCallback; import org.apache.bookkeeper.client.api.WriteFlag; import org.apache.bookkeeper.common.util.MathUtils; @@ -60,8 +61,6 @@ import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.bookkeeper.util.ByteBufList; import org.apache.zookeeper.AsyncCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the helper class for replicating the fragments from one bookie to @@ -71,6 +70,7 @@ name = REPLICATION_WORKER_SCOPE, help = "Ledger fragment replicator related stats" ) +@CustomLog public class LedgerFragmentReplicator { // BookKeeper instance @@ -135,17 +135,15 @@ public LedgerFragmentReplicator(BookKeeper bkc, ClientConfiguration conf) { this(bkc, NullStatsLogger.INSTANCE, conf); } - private static final Logger LOG = LoggerFactory - .getLogger(LedgerFragmentReplicator.class); - private void replicateFragmentInternal(final LedgerHandle lh, final LedgerFragment lf, final AsyncCallback.VoidCallback ledgerFragmentMcb, final Set newBookies, final BiConsumer onReadEntryFailureCallback) throws InterruptedException { if (!lf.isClosed()) { - LOG.error("Trying to replicate an unclosed fragment;" - + " This is not safe {}", lf); + log.error() + .attr("ledgerFragment", lf) + .log("Trying to replicate an unclosed fragment; This is not safe"); ledgerFragmentMcb.processResult(BKException.Code.UnclosedFragmentException, null, null); return; @@ -158,8 +156,11 @@ private void replicateFragmentInternal(final LedgerHandle lh, * INVALID_ENTRY_ID and viceversa. */ if (startEntryId == INVALID_ENTRY_ID ^ endEntryId == INVALID_ENTRY_ID) { - LOG.error("For LedgerFragment: {}, seeing inconsistent firstStoredEntryId: {} and lastStoredEntryId: {}", - lf, startEntryId, endEntryId); + log.error() + .attr("ledgerFragment", lf) + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .log("For LedgerFragment, seeing inconsistent firstStoredEntryId and lastStoredEntryId"); assert false; } @@ -235,8 +236,10 @@ void replicate(final LedgerHandle lh, final LedgerFragment lf, throws InterruptedException { Set partitionedFragments = splitIntoSubFragments(lh, lf, bkc.getConf().getRereplicationEntryBatchSize()); - LOG.info("Replicating fragment {} in {} sub fragments.", - lf, partitionedFragments.size()); + log.info() + .attr("ledgerFragment", lf) + .attr("size", partitionedFragments.size()) + .log("Replicating fragment in sub fragments."); replicateNextBatch(lh, partitionedFragments.iterator(), ledgerFragmentMcb, targetBookieAddresses, onReadEntryFailureCallback); } @@ -300,8 +303,11 @@ static Set splitIntoSubFragments(LedgerHandle lh, * INVALID_ENTRY_ID and viceversa. */ if (firstEntryId == INVALID_ENTRY_ID ^ lastEntryId == INVALID_ENTRY_ID) { - LOG.error("For LedgerFragment: {}, seeing inconsistent firstStoredEntryId: {} and lastStoredEntryId: {}", - ledgerFragment, firstEntryId, lastEntryId); + log.error() + .attr("ledgerFragment", ledgerFragment) + .attr("firstEntryId", firstEntryId) + .attr("lastEntryId", lastEntryId) + .log("For LedgerFragment, seeing inconsistent firstStoredEntryId and lastStoredEntryId"); assert false; } @@ -365,8 +371,12 @@ void recoverLedgerFragmentEntry(final Long entryId, @Override public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("BK error writing entry for ledgerId: {}, entryId: {}, bookie: {}", - ledgerId, entryId, addr, BKException.create(rc)); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .exceptionMessage(BKException.create(rc)) + .log("BK error writing entry"); if (completed.compareAndSet(false, true)) { ledgerFragmentEntryMcb.processResult(rc, null, null); } @@ -375,10 +385,13 @@ public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Ob if (ctx instanceof Long) { numBytesWritten.registerSuccessfulValue((Long) ctx); } - if (LOG.isDebugEnabled()) { - LOG.debug("Success writing ledger id {}, entry id {} to a new bookie {}!", - ledgerId, entryId, addr); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .log("Success writing entry to a new bookie"); + if (numCompleted.incrementAndGet() == newBookies.size() && completed.compareAndSet(false, true)) { ledgerFragmentEntryMcb.processResult(rc, null, null); } @@ -397,8 +410,11 @@ public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Ob public void readComplete(int rc, LedgerHandle lh, Enumeration seq, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("BK error reading ledger entry: " + entryId, - BKException.create(rc)); + log.error() + .attr("ledgerId", lh.getId()) + .attr("entryId", entryId) + .exceptionMessage(BKException.create(rc)) + .log("BK error reading ledger entry"); onReadEntryFailureCallback.accept(ledgerId, entryId); ledgerFragmentEntryMcb.processResult(rc, null, null); return; @@ -466,8 +482,12 @@ void batchRecoverLedgerFragmentEntry(final long startEntryId, @Override public void readComplete(int rc, LedgerHandle lh, Enumeration seq, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("BK error reading ledger entries: {} - {}", - startEntryId, endEntryId, BKException.create(rc)); + log.error() + .attr("ledgerId", lh.getId()) + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .exceptionMessage(BKException.create(rc)) + .log("BK error reading ledger entries"); onReadEntryFailureCallback.accept(lh.getId(), startEntryId); for (int i = 0; i < entriesToReplicateCnt; i++) { ledgerFragmentMcb.processResult(rc, null, null); @@ -503,8 +523,12 @@ public void readComplete(int rc, LedgerHandle lh, Enumeration seq, @Override public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("BK error writing entry for ledgerId: {}, entryId: {}, bookie: {}", - ledgerId, entryId, addr, BKException.create(rc)); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .attr("create", BKException.create(rc)) + .log("BK error writing entry"); if (completed.compareAndSet(false, true)) { ledgerFragmentMcb.processResult(rc, null, null); } @@ -513,10 +537,13 @@ public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Ob if (ctx instanceof Long) { numBytesWritten.registerSuccessfulValue((Long) ctx); } - if (LOG.isDebugEnabled()) { - LOG.debug("Success writing ledger id {}, entry id {} to a new bookie {}!", - ledgerId, entryId, addr); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .log("Success writing entry to a new bookie"); + if (numCompleted.incrementAndGet() == newBookies.size() && completed.compareAndSet(false, true)) { ledgerFragmentMcb.processResult(rc, null, null); @@ -582,8 +609,10 @@ static class SingleFragmentCallback implements AsyncCallback.VoidCallback { @Override public void processResult(int rc, String path, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("BK error replicating ledger fragments for ledger: " - + lh.getId(), BKException.create(rc)); + log.error() + .attr("create", BKException.create(rc)) + .attr("ledgerId", lh.getId()) + .log("BK error replicating ledger fragments"); ledgerFragmentsMcb.processResult(rc, null, null); return; } @@ -619,12 +648,16 @@ private static void updateEnsembleInfo( updateLoop.run().whenComplete((result, ex) -> { if (ex == null) { - LOG.info("Updated ZK to point ledger fragments" - + " from old bookies to new bookies: {}", oldBookie2NewBookie); + log.info() + .attr("oldBookie2NewBookie", oldBookie2NewBookie) + .log("Updated ZK to point ledger fragments from old bookies to new bookies"); ensembleUpdatedCb.processResult(BKException.Code.OK, null, null); } else { - LOG.error("Error updating ledger config metadata for ledgerId {}", lh.getId(), ex); + log.error() + .exception(ex) + .attr("ledgerId", lh.getId()) + .log("Error updating ledger config metadata for ledgerId"); ensembleUpdatedCb.processResult( BKException.getExceptionCode(ex, BKException.Code.UnexpectedConditionException), diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java index 7d1f67a2e4b..9714803d5df 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java @@ -31,6 +31,7 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Sets; import com.google.common.util.concurrent.RateLimiter; +import io.github.merlimat.slog.Logger; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.security.GeneralSecurityException; @@ -85,15 +86,14 @@ import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.collections4.IteratorUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Ledger handle contains ledger metadata and is used to access the read and * write operations to a ledger. */ public class LedgerHandle implements WriteHandle { - static final Logger LOG = LoggerFactory.getLogger(LedgerHandle.class); + + protected final Logger log; private static final int STICKY_READ_BOOKIE_INDEX_UNSET = -1; @@ -180,6 +180,7 @@ private enum HandleState { BookKeeper.DigestType digestType, byte[] password, EnumSet writeFlags) throws GeneralSecurityException, NumberFormatException { + this.log = Logger.get(LedgerHandle.class).with().attr("ledgerId", ledgerId).build(); this.clientCtx = clientCtx; this.versionedMetadata = versionedMetadata; @@ -516,9 +517,9 @@ void asyncCloseInternal(final CloseCallback cb, final Object ctx, final int rc) try { doAsyncCloseInternal(cb, ctx, rc); } catch (RejectedExecutionException re) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to close ledger {} : ", ledgerId, re); - } + + log.debug().exception(re).log("Failed to close ledger"); + errorOutPendingAdds(BookKeeper.getReturnRc(clientCtx.getBookieClient(), rc)); cb.closeComplete(BookKeeper.getReturnRc(clientCtx.getBookieClient(), BKException.Code.InterruptedException), this, ctx); @@ -573,10 +574,12 @@ void doAsyncCloseInternal(final CloseCallback cb, final Object ctx, final int rc } if (prevHandleState != HandleState.CLOSED) { - if (LOG.isDebugEnabled()) { - LOG.debug("Closing ledger: {} at entryId {} with {} bytes", getId(), lastEntry, - finalLength); - } + + log.debug() + .attr("lastEntry", lastEntry) + .attr("finalLength", finalLength) + .log("Closing ledger"); + tearDownWriteHandleState(); new MetadataUpdateLoop( @@ -591,14 +594,14 @@ void doAsyncCloseInternal(final CloseCallback cb, final Object ctx, final int rc && finalLength == metadata.getLength()) { return false; } else { - LOG.error("Metadata conflict when closing ledger {}." - + " Another client may have recovered the ledger while " - + "there" - + " were writes outstanding. (local lastEntry:{} " - + "length:{}) " - + " (metadata lastEntry:{} length:{})", - getId(), lastEntry, finalLength, - metadata.getLastEntryId(), metadata.getLength()); + log.error() + .attr("lastEntryId", lastEntry) + .attr("length", finalLength) + .attr("metadataLastEntryId", metadata.getLastEntryId()) + .attr("metadataLength", metadata.getLength()) + .log("Metadata conflict when closing ledger." + + " Another client may have recovered the ledger while" + + " there were writes outstanding."); throw new BKException.BKMetadataVersionException(); } } else { @@ -721,15 +724,20 @@ public Enumeration batchReadUnconfirmedEntries(long firstEntry, int public void asyncReadEntries(long firstEntry, long lastEntry, ReadCallback cb, Object ctx) { // Little sanity check if (firstEntry < 0 || firstEntry > lastEntry) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{} lastEntry:{}", - ledgerId, firstEntry, lastEntry); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .log("IncorrectParameterException"); cb.readComplete(BKException.Code.IncorrectParameterException, this, null, ctx); return; } if (lastEntry > lastAddConfirmed) { - LOG.error("ReadEntries exception on ledgerId:{} firstEntry:{} lastEntry:{} lastAddConfirmed:{}", - ledgerId, firstEntry, lastEntry, lastAddConfirmed); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .attr("lastAddConfirmed", lastAddConfirmed) + .log("ReadEntries exception"); cb.readComplete(BKException.Code.ReadException, this, null, ctx); return; } @@ -755,8 +763,10 @@ public void asyncReadEntries(long firstEntry, long lastEntry, ReadCallback cb, O public void asyncBatchReadEntries(long startEntry, int maxCount, long maxSize, ReadCallback cb, Object ctx) { // Little sanity check if (startEntry < 0 || startEntry > lastAddConfirmed) { - LOG.error("IncorrectParameterException on ledgerId:{} startEntry:{} lastAddConfirmed:{}", - ledgerId, startEntry, lastAddConfirmed); + log.error() + .attr("startEntry", startEntry) + .attr("lastAddConfirmed", lastAddConfirmed) + .log("IncorrectParameterException"); cb.readComplete(BKException.Code.IncorrectParameterException, this, null, ctx); return; } @@ -811,8 +821,10 @@ public void readComplete(int rc, LedgerHandle lh, Enumeration seq, public void asyncReadUnconfirmedEntries(long firstEntry, long lastEntry, ReadCallback cb, Object ctx) { // Little sanity check if (firstEntry < 0 || firstEntry > lastEntry) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{} lastEntry:{}", - ledgerId, firstEntry, lastEntry); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .log("IncorrectParameterException"); cb.readComplete(BKException.Code.IncorrectParameterException, this, null, ctx); return; } @@ -838,7 +850,9 @@ public void asyncBatchReadUnconfirmedEntries(long startEntry, int maxCount, long Object ctx) { // Little sanity check if (startEntry < 0) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{}", ledgerId, startEntry); + log.error() + .attr("startEntry", startEntry) + .log("IncorrectParameterException"); cb.readComplete(BKException.Code.IncorrectParameterException, this, null, ctx); } if (notSupportBatchRead()) { @@ -874,14 +888,19 @@ public void readComplete(int rc, LedgerHandle lh, Enumeration seq, public CompletableFuture readAsync(long firstEntry, long lastEntry) { // Little sanity check if (firstEntry < 0 || firstEntry > lastEntry) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{} lastEntry:{}", - ledgerId, firstEntry, lastEntry); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .log("IncorrectParameterException"); return FutureUtils.exception(new BKIncorrectParameterException()); } if (lastEntry > lastAddConfirmed) { - LOG.error("ReadAsync exception on ledgerId:{} firstEntry:{} lastEntry:{} lastAddConfirmed:{}", - ledgerId, firstEntry, lastEntry, lastAddConfirmed); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .attr("lastAddConfirmed", lastAddConfirmed) + .log("ReadAsync exception"); return FutureUtils.exception(new BKReadException()); } @@ -903,12 +922,16 @@ public CompletableFuture readAsync(long firstEntry, long lastEntr public CompletableFuture batchReadAsync(long startEntry, int maxCount, long maxSize) { // Little sanity check if (startEntry < 0) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{}", ledgerId, startEntry); + log.error() + .attr("startEntry", startEntry) + .log("IncorrectParameterException"); return FutureUtils.exception(new BKIncorrectParameterException()); } if (startEntry > lastAddConfirmed) { - LOG.error("ReadAsync exception on ledgerId:{} firstEntry:{} lastAddConfirmed:{}", - ledgerId, startEntry, lastAddConfirmed); + log.error() + .attr("startEntry", startEntry) + .attr("lastAddConfirmed", lastAddConfirmed) + .log("ReadAsync exception"); return FutureUtils.exception(new BKReadException()); } if (notSupportBatchRead()) { @@ -956,17 +979,19 @@ private CompletableFuture batchReadEntriesInternalAsync(long star boolean isRecoveryRead) { int nettyMaxFrameSizeBytes = clientCtx.getConf().nettyMaxFrameSizeBytes; if (maxSize > nettyMaxFrameSizeBytes) { - if (LOG.isDebugEnabled()) { - LOG.debug("The max size is greater than nettyMaxFrameSizeBytes, " - + "use nettyMaxFrameSizeBytes:{} to replace it.", nettyMaxFrameSizeBytes); - } + + log.debug() + .attr("nettyMaxFrameSizeBytes", nettyMaxFrameSizeBytes) + .log("The max size is greater than nettyMaxFrameSizeBytes, use nettyMaxFrameSizeBytes: to replace it."); + maxSize = nettyMaxFrameSizeBytes; } if (maxSize <= 0) { - if (LOG.isDebugEnabled()) { - LOG.debug("The max size is negative, use nettyMaxFrameSizeBytes:{} to replace it.", - nettyMaxFrameSizeBytes); - } + + log.debug() + .attr("nettyMaxFrameSizeBytes", nettyMaxFrameSizeBytes) + .log("The max size is negative, use nettyMaxFrameSizeBytes to replace it."); + maxSize = nettyMaxFrameSizeBytes; } BatchedReadOp op = new BatchedReadOp(this, clientCtx, @@ -1036,8 +1061,10 @@ private CompletableFuture batchReadEntriesInternalAsync(long star public CompletableFuture readUnconfirmedAsync(long firstEntry, long lastEntry) { // Little sanity check if (firstEntry < 0 || firstEntry > lastEntry) { - LOG.error("IncorrectParameterException on ledgerId:{} firstEntry:{} lastEntry:{}", - ledgerId, firstEntry, lastEntry); + log.error() + .attr("firstEntry", firstEntry) + .attr("lastEntry", lastEntry) + .log("IncorrectParameterException"); return FutureUtils.exception(new BKIncorrectParameterException()); } @@ -1223,7 +1250,7 @@ public CompletableFuture appendAsync(ByteBuf data) { * @return the entryId of the new inserted entry */ public long addEntry(final long entryId, byte[] data) throws InterruptedException, BKException { - LOG.error("To use this feature Ledger must be created with createLedgerAdv interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv interface."); throw BKException.create(BKException.Code.IllegalOpException); } @@ -1241,9 +1268,9 @@ public long addEntry(final long entryId, byte[] data) throws InterruptedExceptio */ public long addEntry(byte[] data, int offset, int length) throws InterruptedException, BKException { - if (LOG.isDebugEnabled()) { - LOG.debug("Adding entry {}", data); - } + + log.debug().attr("data", data).log("Adding entry"); + SyncAddCallback callback = new SyncAddCallback(); asyncAddEntry(data, offset, length, callback, null); @@ -1269,7 +1296,7 @@ public long addEntry(byte[] data, int offset, int length) */ public long addEntry(final long entryId, byte[] data, int offset, int length) throws InterruptedException, BKException { - LOG.error("To use this feature Ledger must be created with createLedgerAdv() interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv() interface."); throw BKException.create(BKException.Code.IllegalOpException); } @@ -1305,7 +1332,7 @@ public void asyncAddEntry(final byte[] data, final AddCallback cb, * some control object */ public void asyncAddEntry(final long entryId, final byte[] data, final AddCallback cb, final Object ctx) { - LOG.error("To use this feature Ledger must be created with createLedgerAdv() interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv() interface."); cb.addCompleteWithLatency(BKException.Code.IllegalOpException, LedgerHandle.this, entryId, 0, ctx); } @@ -1367,7 +1394,7 @@ public void asyncAddEntry(ByteBuf data, final AddCallback cb, final Object ctx) */ public void asyncAddEntry(final long entryId, final byte[] data, final int offset, final int length, final AddCallback cb, final Object ctx) { - LOG.error("To use this feature Ledger must be created with createLedgerAdv() interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv() interface."); cb.addCompleteWithLatency(BKException.Code.IllegalOpException, LedgerHandle.this, entryId, 0, ctx); } @@ -1393,7 +1420,7 @@ public void asyncAddEntry(final long entryId, final byte[] data, final int offse */ public void asyncAddEntry(final long entryId, final byte[] data, final int offset, final int length, final AddCallbackWithLatency cb, final Object ctx) { - LOG.error("To use this feature Ledger must be created with createLedgerAdv() interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv() interface."); cb.addCompleteWithLatency(BKException.Code.IllegalOpException, LedgerHandle.this, entryId, 0, ctx); } @@ -1414,7 +1441,7 @@ public void asyncAddEntry(final long entryId, final byte[] data, final int offse */ public void asyncAddEntry(final long entryId, ByteBuf data, final AddCallbackWithLatency cb, final Object ctx) { - LOG.error("To use this feature Ledger must be created with createLedgerAdv() interface."); + log.error("To use this feature Ledger must be created with createLedgerAdv() interface."); cb.addCompleteWithLatency(BKException.Code.IllegalOpException, LedgerHandle.this, entryId, 0, ctx); } @@ -1441,7 +1468,7 @@ public CompletableFuture force() { executeOrdered(new Runnable() { @Override public void run() { - LOG.warn("Force() attempted on a closed ledger: {}", ledgerId); + log.warn("Force() attempted on a closed ledger"); result.completeExceptionally(new BKException.BKLedgerClosedException()); } @@ -1566,10 +1593,11 @@ protected boolean waitForWritable(DistributionSchedule.WriteSet writeSet, } } if (backoff > 1) { - LOG.info("Spent {} ms waiting for {} writable channels, writable result {}", - MathUtils.elapsedMSec(startTime), - writeSet.size() - allowedNonWritableCount, - writableResult); + log.info() + .attr("elapsedMSec", MathUtils.elapsedMSec(startTime)) + .attr("writableChannels", writeSet.size() - allowedNonWritableCount) + .attr("writableResult", writableResult) + .log("Spent ms waiting for writable channels"); } } @@ -1610,7 +1638,7 @@ protected void doAsyncAddEntry(final PendingAddOp op) { executeOrdered(new Runnable() { @Override public void run() { - LOG.warn("Attempt to add to closed ledger: {}", ledgerId); + log.warn("Attempt to add to closed ledger"); op.cb.addCompleteWithLatency(BKException.Code.LedgerClosedException, LedgerHandle.this, INVALID_ENTRY_ID, 0, op.ctx); op.recyclePendAddOpObject(); @@ -2053,7 +2081,9 @@ void handleUnrecoverableErrorDuringAdd(int rc) { errorOutPendingAdds(rc); return; } - LOG.error("Closing ledger {} due to {}", ledgerId, BKException.codeLogger(rc)); + log.error() + .attr("rc", BKException.codeLogger(rc)) + .log("Closing ledger due to error"); asyncCloseInternal(NoopCloseCallback.instance, null, rc); } @@ -2065,7 +2095,7 @@ private void monitorPendingAddOps() { } } if (timedOut > 0) { - LOG.info("Timed out {} add ops", timedOut); + log.info().attr("timedOutOpsCount", timedOut).log("Timed out add ops"); } } @@ -2097,17 +2127,19 @@ void sendAddSuccessCallbacks() { while ((pendingAddOp = pendingAddOps.peek()) != null && !changingEnsemble) { if (!pendingAddOp.completed) { - if (LOG.isDebugEnabled()) { - LOG.debug("pending add not completed: {}", pendingAddOp); - } + + log.debug().attr("pendingAddOp", pendingAddOp).log("pending add not completed"); + return; } // Check if it is the next entry in the sequence. if (pendingAddOp.entryId != 0 && pendingAddOp.entryId != pendingAddsSequenceHead + 1) { - if (LOG.isDebugEnabled()) { - LOG.debug("Head of the queue entryId: {} is not the expected value: {}", pendingAddOp.entryId, - pendingAddsSequenceHead + 1); - } + + log.debug() + .attr("entryId", pendingAddOp.entryId) + .attr("expectedEntryId", pendingAddsSequenceHead + 1) + .log("Head of the queue is not the expected entryId"); + return; } @@ -2157,21 +2189,23 @@ void maybeHandleDelayedWriteBookieFailure() { void handleBookieFailure(final Map failedBookies) { if (clientCtx.getConf().disableEnsembleChangeFeature.isAvailable()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ensemble change is disabled. Retry sending to failed bookies {} for ledger {}.", - failedBookies, ledgerId); - } + + log.debug() + .attr("failedBookies", failedBookies) + .log("Ensemble change is disabled. Retry sending to failed bookies"); + executeOrdered(() -> unsetSuccessAndSendWriteRequest(getCurrentEnsemble(), failedBookies.keySet())); return; } if (writeFlags.contains(WriteFlag.DEFERRED_SYNC)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Cannot perform ensemble change with write flags {}. " - + "Failed bookies {} for ledger {}.", - writeFlags, failedBookies, ledgerId); - } + + log.debug() + .attr("writeFlags", writeFlags) + .attr("failedBookies", failedBookies) + .log("Cannot perform ensemble change with write flag on failed bookies"); + handleUnrecoverableErrorDuringAdd(WriteException); return; } @@ -2202,19 +2236,24 @@ void handleBookieFailure(final Map failedBookies) { void ensembleChangeLoop(List origEnsemble, Map failedBookies) { int ensembleChangeId = numEnsembleChanges.incrementAndGet(); ensembleChangeCounter.inc(); - String logContext = String.format("[EnsembleChange(ledger:%d, change-id:%010d)]", ledgerId, ensembleChangeId); // when the ensemble changes are too frequent, close handle if (ensembleChangeId > clientCtx.getConf().maxAllowedEnsembleChanges) { - LOG.info("{} reaches max allowed ensemble change number {}", - logContext, clientCtx.getConf().maxAllowedEnsembleChanges); + log.info() + .attr("ensembleChangeId", ensembleChangeId) + .attr("maxAllowedEnsembleChanges", clientCtx.getConf().maxAllowedEnsembleChanges) + .log("reaches max allowed ensemble change number"); handleUnrecoverableErrorDuringAdd(WriteException); return; } - if (LOG.isDebugEnabled()) { - LOG.debug("{} Replacing {} in {}", logContext, failedBookies, origEnsemble); - } + + log.debug() + .attr("ensembleChangeId", ensembleChangeId) + .attr("failedBookies", failedBookies) + .attr("origEnsemble", origEnsemble) + .log("Replacing bookies"); + AtomicInteger attempts = new AtomicInteger(0); new MetadataUpdateLoop( @@ -2229,16 +2268,21 @@ void ensembleChangeLoop(List origEnsemble, Map fail List currentEnsemble = getCurrentEnsemble(); List newEnsemble = EnsembleUtils.replaceBookiesInEnsemble( - clientCtx.getBookieWatcher(), metadata, currentEnsemble, failedBookies, logContext); + clientCtx.getBookieWatcher(), metadata, currentEnsemble, failedBookies, ensembleChangeId); Long lastEnsembleKey = LedgerMetadataUtils.getLastEnsembleKey(metadata); LedgerMetadataBuilder builder = LedgerMetadataBuilder.from(metadata); long newEnsembleStartEntry = getLastAddConfirmed() + 1; checkState(lastEnsembleKey <= newEnsembleStartEntry, "New ensemble must either replace the last ensemble, or add a new one"); - if (LOG.isDebugEnabled()) { - LOG.debug("{}[attempt:{}] changing ensemble from: {} to: {} starting at entry: {}", - logContext, attempts.get(), currentEnsemble, newEnsemble, newEnsembleStartEntry); - } + + log.debug() + .attr("ensembleChangeId", ensembleChangeId) + .attr("attempts", attempts.get()) + .attr("currentEnsemble", currentEnsemble) + .attr("newEnsemble", newEnsemble) + .attr("newEnsembleStartEntry", newEnsembleStartEntry) + .log("Changing ensemble"); + if (lastEnsembleKey.equals(newEnsembleStartEntry)) { return builder.replaceEnsembleEntry(newEnsembleStartEntry, newEnsemble).build(); @@ -2249,25 +2293,33 @@ void ensembleChangeLoop(List origEnsemble, Map fail this::setLedgerMetadata) .run().whenCompleteAsync((metadata, ex) -> { if (ex != null) { - LOG.warn("{}[attempt:{}] Exception changing ensemble", logContext, attempts.get(), ex); + log.warn() + .exception(ex) + .attr("ensembleChangeId", ensembleChangeId) + .attr("attempts", attempts.get()) + .log("Exception changing ensemble"); handleUnrecoverableErrorDuringAdd(BKException.getExceptionCode(ex, WriteException)); } else if (metadata.getValue().isClosed()) { - if (LOG.isDebugEnabled()) { - LOG.debug("{}[attempt:{}] Metadata closed during attempt to replace bookie." - + " Another client must have recovered the ledger.", logContext, attempts.get()); - } + log.debug() + .attr("ensembleChangeId", ensembleChangeId) + .attr("attempts", attempts.get()) + .log("Metadata closed during attempt to replace bookie." + + " Another client must have recovered the ledger."); + handleUnrecoverableErrorDuringAdd(BKException.Code.LedgerClosedException); } else if (metadata.getValue().getState() == LedgerMetadata.State.IN_RECOVERY) { - if (LOG.isDebugEnabled()) { - LOG.debug("{}[attempt:{}] Metadata marked as in-recovery during attempt to replace bookie." - + " Another client must be recovering the ledger.", logContext, attempts.get()); - } + log.debug() + .attr("ensembleChangeId", ensembleChangeId) + .attr("attempts", attempts.get()) + .log("Metadata marked as in-recovery during attempt to replace bookie." + + " Another client must be recovering the ledger."); handleUnrecoverableErrorDuringAdd(BKException.Code.LedgerFencedException); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("{}[attempt:{}] Success updating metadata.", logContext, attempts.get()); - } + log.debug() + .attr("ensembleChangeId", ensembleChangeId) + .attr("get", attempts.get()) + .log("Success updating metadata"); List newEnsemble = null; Set replaced = null; @@ -2280,7 +2332,9 @@ void ensembleChangeLoop(List origEnsemble, Map fail } else { newEnsemble = getCurrentEnsemble(); replaced = EnsembleUtils.diffEnsemble(origEnsemble, newEnsemble); - LOG.info("New Ensemble: {} for ledger: {}", newEnsemble, ledgerId); + log.info() + .attr("newEnsemble", newEnsemble) + .log("New Ensemble"); changingEnsemble = false; } @@ -2312,12 +2366,13 @@ void registerOperationFailureOnBookie(BookieId bookie, long entryId) { } static class NoopCloseCallback implements CloseCallback { + private static final Logger noopLog = Logger.get(NoopCloseCallback.class); static NoopCloseCallback instance = new NoopCloseCallback(); @Override public void closeComplete(int rc, LedgerHandle lh, Object ctx) { if (rc != BKException.Code.OK) { - LOG.warn("Close failed: {}", BKException.codeLogger(rc)); + noopLog.warn().attr("codeLogger", BKException.codeLogger(rc)).log("Close failed"); } // noop } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java index c94a9154f51..215d162827b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandleAdv.java @@ -38,17 +38,12 @@ import org.apache.bookkeeper.client.api.WriteAdvHandle; import org.apache.bookkeeper.client.api.WriteFlag; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - /** * Ledger Advanced handle extends {@link LedgerHandle} to provide API to add entries with * user supplied entryIds. Through this interface Ledger Length may not be accurate while the * ledger being written. */ public class LedgerHandleAdv extends LedgerHandle implements WriteAdvHandle { - static final Logger LOG = LoggerFactory.getLogger(LedgerHandleAdv.class); static class PendingOpsComparator implements Comparator, Serializable { @Override @@ -101,9 +96,9 @@ public long addEntry(final long entryId, byte[] data) throws InterruptedExceptio @Override public long addEntry(final long entryId, byte[] data, int offset, int length) throws InterruptedException, BKException { - if (LOG.isDebugEnabled()) { - LOG.debug("Adding entry {}", data); - } + + log.debug().attr("data", data).log("Adding entry"); + SyncAddCallback callback = new SyncAddCallback(); asyncAddEntry(entryId, data, offset, length, callback, null); @@ -207,7 +202,7 @@ public void asyncAddEntry(final long entryId, ByteBuf data, op.setEntryId(entryId); if ((entryId <= this.lastAddConfirmed) || pendingAddOps.contains(op)) { - LOG.error("Trying to re-add duplicate entryid:{}", entryId); + log.error().attr("entryId", entryId).log("Trying to re-add duplicate entryId"); op.submitCallback(BKException.Code.DuplicateEntryIdException); return; } @@ -245,7 +240,7 @@ protected void doAsyncAddEntry(final PendingAddOp op) { clientCtx.getMainWorkerPool().submit(new Runnable() { @Override public void run() { - LOG.warn("Attempt to add to closed ledger: {}", ledgerId); + log.warn("Attempt to add to closed ledger"); op.cb.addCompleteWithLatency(BKException.Code.LedgerClosedException, LedgerHandleAdv.this, op.getEntryId(), 0, op.ctx); op.recyclePendAddOpObject(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataImpl.java index 14a17bb5fd7..e1adcbd37c6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataImpl.java @@ -31,13 +31,12 @@ import java.util.Optional; import java.util.TreeMap; import java.util.stream.Collectors; +import lombok.CustomLog; import lombok.EqualsAndHashCode; import org.apache.bookkeeper.client.api.DigestType; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.client.api.LedgerMetadata.State; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class encapsulates all the ledger metadata that is persistently stored @@ -48,8 +47,8 @@ @EqualsAndHashCode(exclude = "ledgerId" // ledgerId is not serialized inside ZK node data ) +@CustomLog class LedgerMetadataImpl implements LedgerMetadata { - static final Logger LOG = LoggerFactory.getLogger(LedgerMetadataImpl.class); private final long ledgerId; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataUtils.java index ab26be7d65f..1a24e8454dc 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerMetadataUtils.java @@ -23,16 +23,15 @@ import java.util.List; import java.util.Set; import java.util.SortedMap; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Utilities for working with ledger metadata. */ +@CustomLog public class LedgerMetadataUtils { - static final Logger LOG = LoggerFactory.getLogger(LedgerMetadataUtils.class); static List getCurrentEnsemble(LedgerMetadata metadata) { return getLastEnsembleValue(metadata); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java index 52c8190e1f2..6e0fe9b6c03 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerOpenOp.java @@ -23,6 +23,7 @@ import static org.apache.bookkeeper.client.BookKeeper.DigestType.fromApiDigestType; +import io.github.merlimat.slog.Logger; import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.concurrent.CompletableFuture; @@ -40,15 +41,14 @@ import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.util.OrderedGenericCallback; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Encapsulates the ledger open operation. * */ class LedgerOpenOp { - static final Logger LOG = LoggerFactory.getLogger(LedgerOpenOp.class); + + private final Logger log; final BookKeeper bk; final long ledgerId; @@ -89,6 +89,7 @@ class LedgerOpenOp { public LedgerOpenOp(BookKeeper bk, BookKeeperClientStats clientStats, long ledgerId, DigestType digestType, byte[] passwd, OpenCallback cb, Object ctx) { + this.log = Logger.get(LedgerOpenOp.class).with().attr("ledgerId", ledgerId).build(); this.bk = bk; this.ledgerId = ledgerId; this.passwd = passwd; @@ -101,6 +102,7 @@ public LedgerOpenOp(BookKeeper bk, BookKeeperClientStats clientStats, public LedgerOpenOp(BookKeeper bk, BookKeeperClientStats clientStats, long ledgerId, OpenCallback cb, Object ctx) { + this.log = Logger.get(LedgerOpenOp.class).with().attr("ledgerId", ledgerId).build(); this.bk = bk; this.ledgerId = ledgerId; this.cb = cb; @@ -180,14 +182,14 @@ private void openWithMetadata(Versioned versionedMetadata) { if (metadata.hasPassword()) { if (!Arrays.equals(passwd, metadata.getPassword())) { - LOG.error("Provided passwd does not match that in metadata"); + log.error("Provided passwd does not match that in metadata"); openComplete(BKException.Code.UnauthorizedAccessException, null); return; } // if `digest auto detection` is enabled, ignore the suggested digest type, this allows digest type // changes. e.g. moving from `crc32` to `crc32c`. if (suggestedDigestType != fromApiDigestType(metadata.getDigestType()) && !enableDigestAutodetection) { - LOG.error("Provided digest does not match that in metadata"); + log.error("Provided digest does not match that in metadata"); openComplete(BKException.Code.DigestMatchException, null); return; } @@ -215,11 +217,12 @@ private void openWithMetadata(Versioned versionedMetadata) { lh = new ReadOnlyLedgerHandle(bk.getClientCtx(), ledgerId, versionedMetadata, digestType, passwd, watchImmediately); } catch (GeneralSecurityException e) { - LOG.error("Security exception while opening ledger: " + ledgerId, e); + log.error().exception(e).attr("ledgerId", ledgerId).log("Security exception while opening ledger"); openComplete(BKException.Code.DigestNotInitializedException, null); return; } catch (NumberFormatException e) { - LOG.error("Incorrectly entered parameter throttle: " + bk.getConf().getThrottleValue(), e); + log.error().exception(e).attr("throttle", bk.getConf().getThrottleValue()) + .log("Incorrectly entered parameter throttle"); openComplete(BKException.Code.IncorrectParameterException, null); return; } @@ -242,7 +245,9 @@ public void safeOperationComplete(int rc, Void result) { } else { closeLedgerHandleAsync().whenComplete((ignore, ex) -> { if (ex != null) { - LOG.error("Ledger {} close failed", ledgerId, ex); + log.error() + .exception(ex) + .log("Ledger close failed"); } if (rc == BKException.Code.UnauthorizedAccessException || rc == BKException.Code.TimeoutException) { @@ -266,14 +271,18 @@ public void readLastConfirmedComplete(int rc, if (rc == BKException.Code.TimeoutException) { closeLedgerHandleAsync().whenComplete((r, ex) -> { if (ex != null) { - LOG.error("Ledger {} close failed", ledgerId, ex); + log.error() + .exception(ex) + .log("Ledger close failed"); } openComplete(bk.getReturnRc(rc), null); }); } else if (rc != BKException.Code.OK) { closeLedgerHandleAsync().whenComplete((r, ex) -> { if (ex != null) { - LOG.error("Ledger {} close failed", ledgerId, ex); + log.error() + .exception(ex) + .log("Ledger close failed"); } openComplete(bk.getReturnRc(BKException.Code.ReadException), null); }); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java index 16a95cbc895..52c30aeec1d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerRecoveryOp.java @@ -18,14 +18,13 @@ package org.apache.bookkeeper.client; import com.google.common.annotations.VisibleForTesting; +import io.github.merlimat.slog.Logger; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; import org.apache.bookkeeper.client.AsyncCallback.AddCallback; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryListener; import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class encapsulated the ledger recovery operation. It first does a read @@ -35,7 +34,7 @@ */ class LedgerRecoveryOp implements ReadEntryListener, AddCallback { - static final Logger LOG = LoggerFactory.getLogger(LedgerRecoveryOp.class); + private final Logger log; final LedgerHandle lh; final ClientContext clientCtx; @@ -70,6 +69,7 @@ protected LedgerMetadata getLedgerMetadata() { } public LedgerRecoveryOp(LedgerHandle lh, ClientContext clientCtx) { + this.log = Logger.get(LedgerRecoveryOp.class).with().attr("ledgerId", lh.getId()).build(); readCount = new AtomicLong(0); writeCount = new AtomicLong(0); readDone = false; @@ -195,8 +195,10 @@ public void onEntryComplete(int rc, LedgerHandle lh, LedgerEntry entry, Object c lh.length.set(entry.getLength() - (long) data.length); // check whether entry id is expected, so we won't overwritten any entries by mistake if (entry.getEntryId() != lh.lastAddPushed + 1) { - LOG.error("Unexpected to recovery add entry {} as entry {} for ledger {}.", - entry.getEntryId(), (lh.lastAddPushed + 1), lh.getId()); + log.error() + .attr("entryId", entry.getEntryId()) + .attr("expectedEntryId", (lh.lastAddPushed + 1)) + .log("Unexpected entryId during recovery add"); rc = BKException.Code.UnexpectedConditionException; } } @@ -221,14 +223,21 @@ public void onEntryComplete(int rc, LedgerHandle lh, LedgerEntry entry, Object c // otherwise, some other error, we can't handle if (BKException.Code.OK != rc && !promise.isDone()) { - LOG.error("Failure {} while reading entries: ({} - {}), ledger: {} while recovering ledger", - BKException.getMessage(rc), startEntryToRead, endEntryToRead, lh.getId()); + log.error() + .attr("getMessage", BKException.getMessage(rc)) + .attr("startEntryId", startEntryToRead) + .attr("endEntryId", endEntryToRead) + .attr("ledgerId", lh.getId()) + .log("Failure while reading entries: ( - ), ledger: while recovering ledger"); submitCallback(rc); } else if (BKException.Code.OK == rc) { // we are here is because we successfully read an entry but readDone was already set to true. // this would happen on recovery a ledger than has gaps in the tail. - LOG.warn("Successfully read entry {} for ledger {}, but readDone is already {}", - entry.getEntryId(), lh.getId(), readDone); + log.warn() + .attr("entryId", entry.getEntryId()) + .attr("ledgerId", lh.getId()) + .attr("readDone", readDone) + .log("Successfully read entry, but readDone is already set"); } return; } @@ -236,8 +245,11 @@ public void onEntryComplete(int rc, LedgerHandle lh, LedgerEntry entry, Object c @Override public void addComplete(int rc, LedgerHandle lh, long entryId, Object ctx) { if (rc != BKException.Code.OK) { - LOG.error("Failure {} while writing entry: {} while recovering ledger: {}", - BKException.codeLogger(rc), entryId + 1, lh.ledgerId); + log.error() + .attr("codeLogger", BKException.codeLogger(rc)) + .attr("entryId", entryId + 1) + .attr("ledgerId", lh.ledgerId) + .log("Failure while writing entry while recovering ledger"); submitCallback(rc); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ListenerBasedPendingReadOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ListenerBasedPendingReadOp.java index 18af8d9188b..f563c458c1c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ListenerBasedPendingReadOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ListenerBasedPendingReadOp.java @@ -21,11 +21,11 @@ package org.apache.bookkeeper.client; import java.util.concurrent.TimeUnit; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryListener; -@Slf4j +@CustomLog class ListenerBasedPendingReadOp extends PendingReadOp { final ReadEntryListener listener; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java index 83c2b4ada5f..855564304e4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java @@ -20,6 +20,7 @@ package org.apache.bookkeeper.client; import com.google.common.util.concurrent.RateLimiter; +import io.github.merlimat.slog.Logger; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.function.Supplier; @@ -27,8 +28,6 @@ import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Mechanism to safely update the metadata of a ledger. @@ -47,7 +46,8 @@ * iteration of the loop begins. */ class MetadataUpdateLoop { - static final Logger LOG = LoggerFactory.getLogger(MetadataUpdateLoop.class); + + private final Logger log; private final LedgerManager lm; private final long ledgerId; @@ -57,7 +57,6 @@ class MetadataUpdateLoop { private final LocalValueUpdater updateLocalValue; private final RateLimiter throttler; - private final String logContext; private volatile int writeLoopCount = 0; private static final AtomicIntegerFieldUpdater WRITE_LOOP_COUNT_UPDATER = AtomicIntegerFieldUpdater.newUpdater(MetadataUpdateLoop.class, "writeLoopCount"); @@ -111,7 +110,10 @@ interface LocalValueUpdater { this.updateLocalValue = updateLocalValue; this.throttler = throttler; - this.logContext = String.format("UpdateLoop(ledgerId=%d,loopId=%08x)", ledgerId, System.identityHashCode(this)); + this.log = Logger.get(MetadataUpdateLoop.class).with() + .attr("ledgerId", ledgerId) + .attr("loopId", String.format("%08x", System.identityHashCode(this))) + .build(); } CompletableFuture> run() { @@ -124,10 +126,11 @@ CompletableFuture> run() { private void writeLoop(Versioned currentLocal, CompletableFuture> promise) { - if (LOG.isDebugEnabled()) { - LOG.debug("{} starting write loop iteration, attempt {}", - logContext, WRITE_LOOP_COUNT_UPDATER.incrementAndGet(this)); - } + + log.debug() + .attr("attempt", WRITE_LOOP_COUNT_UPDATER.incrementAndGet(this)) + .log("Starting write loop iteration"); + try { if (needsTransformation.needsUpdate(currentLocal.getValue())) { LedgerMetadata transformed = transform.transform(currentLocal.getValue()); @@ -139,20 +142,18 @@ private void writeLoop(Versioned currentLocal, .whenComplete((writtenMetadata, ex) -> { if (ex == null) { if (updateLocalValue.updateValue(currentLocal, writtenMetadata)) { - if (LOG.isDebugEnabled()) { - LOG.debug("{} success", logContext); - } + + log.debug("success"); + promise.complete(writtenMetadata); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("{} local value changed while we were writing, try again", - logContext); - } + + log.debug("local value changed while we were writing, try again"); + writeLoop(currentLocalValue.get(), promise); } } else if (ex instanceof BKException.BKMetadataVersionException) { - LOG.info("{} conflict writing metadata to store, update local value and try again", - logContext); + log.info("conflict writing metadata to store, update local value and try again"); updateLocalValueFromStore(ledgerId).whenComplete((readMetadata, readEx) -> { if (readEx == null) { writeLoop(readMetadata, promise); @@ -161,18 +162,22 @@ private void writeLoop(Versioned currentLocal, } }); } else { - LOG.error("{} Error writing metadata to store", logContext, ex); + log.error() + .exception(ex) + .log("Error writing metadata to store"); promise.completeExceptionally(ex); } }); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("{} Update not needed, completing", logContext); - } + + log.debug("Update not needed, completing"); + promise.complete(currentLocal); } } catch (Exception e) { - LOG.error("{} Exception updating", logContext, e); + log.error() + .exception(e) + .log("Exception updating"); promise.completeExceptionally(e); } } @@ -191,8 +196,9 @@ private void readLoop(long ledgerId, CompletableFuture lm.readLedgerMetadata(ledgerId).whenComplete( (read, exception) -> { if (exception != null) { - LOG.error("{} Failed to read metadata from store", - logContext, exception); + log.error() + .exception(exception) + .log("Failed to read metadata from store"); promise.completeExceptionally(exception); } else if (current.getVersion().compare(read.getVersion()) == Version.Occurred.CONCURRENTLY) { // no update needed, these are the same in the immutable world diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java index 6b82200b3fa..cd55eb69ee5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java @@ -35,13 +35,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.client.AsyncCallback.AddCallbackWithLatency; import org.apache.bookkeeper.client.api.WriteFlag; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This represents a pending add operation. When it has got success from all @@ -52,8 +51,8 @@ * * */ +@CustomLog class PendingAddOp implements WriteCallback { - private static final Logger LOG = LoggerFactory.getLogger(PendingAddOp.class); ByteBuf payload; ReferenceCounted toSend; @@ -209,10 +208,13 @@ synchronized void unsetSuccessAndSendWriteRequest(List ensemble, int b return; } - if (LOG.isDebugEnabled()) { - LOG.debug("Unsetting success for ledger: " + lh.ledgerId + " entry: " + entryId + " bookie index: " - + bookieIndex); - } + + log.debug() + .attr("ledgerId", lh.ledgerId) + .attr("entryId", entryId) + .attr("bookieIndex", bookieIndex) + .log("Unsetting success"); + // if we had already heard a success from this array index, need to // increment our number of responses that are pending, since we are @@ -266,9 +268,12 @@ public synchronized void writeComplete(int rc, long ledgerId, long entryId, Book if (!ensemble.get(bookieIndex).equals(addr)) { // ensemble has already changed, failure of this addr is immaterial - if (LOG.isDebugEnabled()) { - LOG.debug("Write did not succeed: " + ledgerId + ", " + entryId + ". But we have already fixed it."); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Write did not succeed. But we have already fixed it."); + return; } @@ -324,13 +329,19 @@ public synchronized void writeComplete(int rc, long ledgerId, long entryId, Book lh.handleUnrecoverableErrorDuringAdd(rc); return; case BKException.Code.LedgerFencedException: - LOG.warn("Fencing exception on write: L{} E{} on {}", - ledgerId, entryId, addr); + log.warn() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .log("Fencing exception on write"); lh.handleUnrecoverableErrorDuringAdd(rc); return; case BKException.Code.UnauthorizedAccessException: - LOG.warn("Unauthorized access exception on write: L{} E{} on {}", - ledgerId, entryId, addr); + log.warn() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", addr) + .log("Unauthorized access exception on write"); lh.handleUnrecoverableErrorDuringAdd(rc); return; default: @@ -338,18 +349,31 @@ public synchronized void writeComplete(int rc, long ledgerId, long entryId, Book if (ackSet.failBookieAndCheck(bookieIndex, addr) || rc == BKException.Code.WriteOnReadOnlyBookieException) { Map failedBookies = ackSet.getFailedBookies(); - LOG.warn("Failed to write entry ({}, {}) to bookies {}, handling failures.", - ledgerId, entryId, failedBookies); + log.warn() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("failedBookies", failedBookies) + .log("Failed to write entry to bookies, handling failures"); // we can't meet ack quorum requirement, trigger ensemble change. lh.handleBookieFailure(failedBookies); - } else if (LOG.isDebugEnabled()) { - LOG.debug("Failed to write entry ({}, {}) to bookie ({}, {})," - + " but it didn't break ack quorum, delaying ensemble change : {}", - ledgerId, entryId, bookieIndex, addr, BKException.getMessage(rc)); + } else { + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieIndex", bookieIndex) + .attr("bookieAddr", addr) + .attr("error", BKException.getMessage(rc)) + .log("Failed to write entry to bookie," + + " but it didn't break ack quorum, delaying ensemble change"); } } else { - LOG.warn("Failed to write entry ({}, {}) to bookie ({}, {}): {}", - ledgerId, entryId, bookieIndex, addr, BKException.getMessage(rc)); + log.warn() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieIndex", bookieIndex) + .attr("bookieAddr", addr) + .attr("error", BKException.getMessage(rc)) + .log("Failed to write entry to bookie"); lh.handleBookieFailure(ImmutableMap.of(bookieIndex, addr)); } return; @@ -361,8 +385,10 @@ public synchronized void writeComplete(int rc, long ledgerId, long entryId, Book .areAckedBookiesAdheringToPlacementPolicy(addEntrySuccessBookies, lh.getLedgerMetadata().getWriteQuorumSize(), lh.getLedgerMetadata().getAckQuorumSize()))) { - LOG.warn("Write success for entry ID {} delayed, not acknowledged by bookies in enough fault domains", - entryId); + log.warn() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Write success for entry ID delayed, not acknowledged by bookies in enough fault domains"); // Increment to indicate write did not complete due to not enough fault domains clientCtx.getClientStats().getWriteDelayedDueToNotEnoughFaultDomains().inc(); @@ -391,15 +417,21 @@ void sendAddSuccessCallbacks() { } synchronized void submitCallback(final int rc) { - if (LOG.isDebugEnabled()) { - LOG.debug("Submit callback (lid:{}, eid: {}). rc:{}", lh.getId(), entryId, rc); - } + + log.debug() + .attr("ledgerId", lh.getId()) + .attr("entryId", entryId) + .attr("rc", rc) + .log("Submit callback"); + long latencyNanos = MathUtils.elapsedNanos(requestTimeNanos); if (rc != BKException.Code.OK) { clientCtx.getClientStats().getAddOpLogger().registerFailedEvent(latencyNanos, TimeUnit.NANOSECONDS); - LOG.error("Write of ledger entry to quorum failed: L{} E{}", - lh.getId(), entryId); + log.error() + .attr("ledgerId", lh.getId()) + .attr("entryId", entryId) + .log("Write of ledger entry to quorum failed"); } else { clientCtx.getClientStats().getAddOpLogger().registerSuccessfulEvent(latencyNanos, TimeUnit.NANOSECONDS); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java index 07687bfcce0..896d3478ce6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadLacOp.java @@ -19,13 +19,12 @@ import io.netty.buffer.ByteBuf; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKDigestMatchException; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieClient; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadLacCallback; import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This represents a pending ReadLac operation. @@ -42,8 +41,8 @@ * from bookies, and doesn't affect the correctness of the protocol. */ +@CustomLog class PendingReadLacOp implements ReadLacCallback { - static final Logger LOG = LoggerFactory.getLogger(PendingReadLacOp.class); LedgerHandle lh; BookieClient bookieClient; LacCallback cb; @@ -121,8 +120,10 @@ public void readLacComplete(int rc, long ledgerId, final ByteBuf lacBuffer, fina } catch (BKDigestMatchException e) { // Too bad, this bookie did not give us a valid answer, we // still might be able to recover. So, continue - LOG.error("Mac mismatch while reading ledger: " + ledgerId + " LAC from bookie: " - + currentEnsemble.get(bookieIndex)); + log.error() + .attr("ledgerId", ledgerId) + .attr("bookieAddr", currentEnsemble.get(bookieIndex)) + .log("Mac mismatch while reading LAC from bookie"); rc = BKException.Code.DigestMatchException; } } @@ -146,17 +147,21 @@ public void readLacComplete(int rc, long ledgerId, final ByteBuf lacBuffer, fina && coverageSet.checkCovered() && !completed) { completed = true; - if (LOG.isDebugEnabled()) { - LOG.debug("Read LAC complete with enough validResponse for ledger: {} LAC: {}", ledgerId, maxLac); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("maxLac", maxLac) + .log("Read LAC complete with enough validResponse"); + cb.getLacComplete(BKException.Code.OK, maxLac); return; } if (numResponsesPending == 0 && !completed) { - LOG.error( - "While readLac ledger: {} did not hear success responses from all of ensemble, coverageSet is: {}", - ledgerId, coverageSet); + log.error() + .attr("ledgerId", ledgerId) + .attr("coverageSet", coverageSet) + .log("While readLac did not hear success responses from all of ensemble"); cb.getLacComplete(lastSeenError, maxLac); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java index b45617be55f..79cfa41bfa4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java @@ -26,6 +26,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.client.impl.LedgerEntriesImpl; import org.apache.bookkeeper.client.impl.LedgerEntryImpl; import org.apache.bookkeeper.common.util.MathUtils; @@ -33,8 +34,6 @@ import org.apache.bookkeeper.proto.BookieProtocol; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback; import org.apache.bookkeeper.proto.checksum.DigestManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Sequence of entries of a ledger that represents a pending read operation. @@ -43,8 +42,8 @@ * application as soon as it arrives rather than waiting for the whole thing. * */ +@CustomLog class PendingReadOp extends ReadOpBase implements ReadEntryCallback { - private static final Logger LOG = LoggerFactory.getLogger(PendingReadOp.class); protected boolean parallelRead = false; protected final LinkedList seq; @@ -118,8 +117,11 @@ public void readEntryComplete(int rc, long ledgerId, final long entryId, final B } if (numPendingEntries < 0) { - LOG.error("Read too many values for ledger {} : [{}, {}].", - ledgerId, startEntryId, endEntryId); + log.error() + .attr("ledgerId", ledgerId) + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .log("Read too many values"); } } @@ -150,11 +152,17 @@ protected void submitCallback(int code) { break; } } - LOG.error( - "Read of ledger entry failed: L{} E{}-E{}, Sent to {}, " - + "Heard from {} : bitset = {}, Error = '{}'. First unread entry is ({}, rc = {})", - lh.getId(), startEntryId, endEntryId, sentToHosts, heardFromHosts, heardFromHostsBitSet, - BKException.getMessage(code), firstUnread, firstRc); + log.error() + .attr("ledgerId", lh.getId()) + .attr("startEntryId", startEntryId) + .attr("endEntryId", endEntryId) + .attr("sentToHosts", sentToHosts) + .attr("heardFromHosts", heardFromHosts) + .attr("heardFromHostsBitSet", heardFromHostsBitSet) + .attr("error", BKException.getMessage(code)) + .attr("firstUnreadEntry", firstUnread) + .attr("firstReturnCode", firstRc) + .log("Read of ledger entry failed"); clientCtx.getClientStats().getReadOpLogger().registerFailedEvent(latencyNanos, TimeUnit.NANOSECONDS); // release the entries seq.forEach(LedgerEntryRequest::close); @@ -248,7 +256,10 @@ void read() { try { sendReadTo(writeSet.get(i), to, this); } catch (InterruptedException ie) { - LOG.error("Interrupted reading entry {} : ", this, ie); + log.error() + .exception(ie) + .attr("readOp", this) + .log("Interrupted reading entry"); Thread.currentThread().interrupt(); fail(BKException.Code.InterruptedException); return; @@ -363,7 +374,10 @@ synchronized BookieId sendNextRead() { sentReplicas.set(replica); return to; } catch (InterruptedException ie) { - LOG.error("Interrupted reading entry " + this, ie); + log.error() + .exception(ie) + .attr("readOp", this) + .log("Interrupted reading entry"); Thread.currentThread().interrupt(); fail(BKException.Code.InterruptedException); return null; @@ -376,7 +390,10 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin int replica = writeSet.indexOf(bookieIndex); if (replica == NOT_FOUND) { - LOG.error("Received error from a host which is not in the ensemble {} {}.", host, ensemble); + log.error() + .attr("bookieAddr", host) + .attr("ensemble", ensemble) + .log("Received error from a host which is not in the ensemble"); return; } erroredReplicas.set(replica); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingWriteLacOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingWriteLacOp.java index 32e5f8a848d..cc686e48619 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingWriteLacOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingWriteLacOp.java @@ -20,12 +20,11 @@ import io.netty.util.ReferenceCountUtil; import java.util.BitSet; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.client.AsyncCallback.AddLacCallback; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteLacCallback; import org.apache.bookkeeper.util.ByteBufList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This represents a pending WriteLac operation. When it has got @@ -36,8 +35,8 @@ * to be up to date with the writer. This is best effort to get latest LAC * from bookies, and doesn't affect the correctness of the protocol. */ +@CustomLog class PendingWriteLacOp implements WriteLacCallback { - private static final Logger LOG = LoggerFactory.getLogger(PendingWriteLacOp.class); AddLacCallback cb; long lac; Object ctx; @@ -110,7 +109,10 @@ public synchronized void writeLacComplete(int rc, long ledgerId, BookieId addr, return; } } else { - LOG.warn("WriteLac did not succeed: Ledger {} on {}", ledgerId, addr); + log.warn() + .attr("ledgerId", ledgerId) + .attr("bookieAddr", addr) + .log("WriteLac did not succeed"); } if (receivedResponseSet.isEmpty()){ diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java index be90ceab94d..c96319cb30a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java @@ -46,6 +46,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; import org.apache.bookkeeper.client.WeightedRandomSelection.WeightedObject; @@ -70,8 +71,6 @@ import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Simple rackware ensemble placement policy. @@ -82,9 +81,8 @@ name = CLIENT_SCOPE, help = "BookKeeper client stats" ) +@CustomLog public class RackawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsemblePlacementPolicy { - - static final Logger LOG = LoggerFactory.getLogger(RackawareEnsemblePlacementPolicyImpl.class); int maxWeightMultiple; protected int minNumRacksPerWriteQuorum; @@ -248,23 +246,25 @@ public Integer getSample() { ? InetAddress.getLocalHost().getCanonicalHostName() : InetAddress.getLocalHost().getHostAddress(); bn = createDummyLocalBookieNode(hostname); } catch (IOException e) { - LOG.error("Failed to get local host address : ", e); + log.error().exception(e).log("Failed to get local host address"); } } else { - LOG.info("Ignoring LocalNode in Placementpolicy"); + log.info("Ignoring LocalNode in Placementpolicy"); } localNode = bn; - LOG.info("Initialize rackaware ensemble placement policy @ {} @ {} : {}.", - localNode, null == localNode ? "Unknown" : localNode.getNetworkLocation(), - dnsResolver.getClass().getName()); + log.info() + .attr("localNode", localNode) + .attr("getNetworkLocation", null == localNode ? "Unknown" : localNode.getNetworkLocation()) + .attr("getName", dnsResolver.getClass().getName()) + .log("Initialize rackaware ensemble placement policy"); this.isWeighted = isWeighted; if (this.isWeighted) { this.maxWeightMultiple = maxWeightMultiple; this.weightedSelection = new WeightedRandomSelectionImpl(this.maxWeightMultiple); - LOG.info("Weight based placement with max multiple of " + this.maxWeightMultiple); + log.info().attr("maxWeightMultiple", this.maxWeightMultiple).log("Weight based placement"); } else { - LOG.info("Not weighted"); + log.info("Not weighted"); } return this; } @@ -311,8 +311,10 @@ public RackawareEnsemblePlacementPolicyImpl initialize(ClientConfiguration conf, } } catch (RuntimeException re) { if (!conf.getEnforceMinNumRacksPerWriteQuorum()) { - LOG.warn("Failed to initialize DNS Resolver {}, used default subnet resolver because {}", - dnsResolverName, re.getMessage()); + log.warn() + .attr("dnsResolverName", dnsResolverName) + .exceptionMessage(re) + .log("Failed to initialize DNS Resolver, used default subnet resolver"); dnsResolver = new DefaultResolver(this::getDefaultRack); dnsResolver.setBookieAddressResolver(bookieAddressResolver); } else { @@ -370,7 +372,10 @@ protected Set addDefaultRackBookiesIfMinNumRacksIsEnforced( } bookiesInDefaultRack.add(((BookieNode) node).getAddr()); } else { - LOG.error("found non-BookieNode: {} as leaf of defaultrack: {}", node, getDefaultRack()); + log.error() + .attr("node", node) + .attr("defaultRack", getDefaultRack()) + .log("found non-BookieNode as leaf of defaultrack"); } } if ((bookiesInDefaultRack == null) || bookiesInDefaultRack.isEmpty()) { @@ -378,8 +383,9 @@ protected Set addDefaultRackBookiesIfMinNumRacksIsEnforced( } else { comprehensiveExclusionBookiesSet = new HashSet(excludeBookies); comprehensiveExclusionBookiesSet.addAll(bookiesInDefaultRack); - LOG.info("enforceMinNumRacksPerWriteQuorum is enabled, so Excluding bookies of defaultRack: {}", - bookiesInDefaultRack); + log.info() + .attr("bookiesInDefaultRack", bookiesInDefaultRack) + .log("enforceMinNumRacksPerWriteQuorum is enabled, so excluding bookies of defaultRack"); } } else { comprehensiveExclusionBookiesSet = excludeBookies; @@ -445,7 +451,7 @@ protected PlacementResult> newEnsembleInternal( // only one rack, use the random algorithm. if (numRacks < 2) { if (enforceMinNumRacksPerWriteQuorum && (minNumRacksPerWriteQuorumForThisEnsemble > 1)) { - LOG.error("Only one rack available and minNumRacksPerWriteQuorum is enforced, so giving up"); + log.error("Only one rack available and minNumRacksPerWriteQuorum is enforced, so giving up"); throw new BKNotEnoughBookiesException(); } List bns = selectRandom(ensembleSize, excludeNodes, TruePredicate.INSTANCE, @@ -487,8 +493,10 @@ protected PlacementResult> newEnsembleInternal( } List bookieList = ensemble.toList(); if (ensembleSize != bookieList.size()) { - LOG.error("Not enough {} bookies are available to form an ensemble : {}.", - ensembleSize, bookieList); + log.error() + .attr("ensembleSize", ensembleSize) + .attr("bookieList", bookieList) + .log("Not enough bookies are available to form an ensemble"); throw new BKNotEnoughBookiesException(); } return PlacementResult.of(bookieList, @@ -535,10 +543,13 @@ public PlacementResult replaceBookie(int ensembleSize, int writeQuorum Set networkLocationsToBeExcluded = getNetworkLocations(ensembleNodes); - if (LOG.isDebugEnabled()) { - LOG.debug("Try to choose a new bookie to replace {} from ensemble {}, excluding {}.", - bookieToReplace, ensembleNodes, excludeNodes); - } + + log.debug() + .attr("bookieToReplace", bookieToReplace) + .attr("ensembleNodes", ensembleNodes) + .attr("excludeNodes", excludeNodes) + .log("Try to choose a new bookie to replace from ensemble"); + // pick a candidate from same rack to replace BookieNode candidate = selectFromNetworkLocation( bn.getNetworkLocation(), @@ -547,9 +558,12 @@ public PlacementResult replaceBookie(int ensembleSize, int writeQuorum TruePredicate.INSTANCE, EnsembleForReplacementWithNoConstraints.INSTANCE, !enforceMinNumRacksPerWriteQuorum); - if (LOG.isDebugEnabled()) { - LOG.debug("Bookie {} is chosen to replace bookie {}.", candidate, bn); - } + + log.debug() + .attr("candidate", candidate) + .attr("bookieNode", bn) + .log("Bookie is chosen to replace bookie"); + BookieId candidateAddr = candidate.getAddr(); List newEnsemble = new ArrayList(currentEnsemble); if (currentEnsemble.isEmpty()) { @@ -581,16 +595,19 @@ public BookieNode selectFromNetworkLocation( return selectRandomFromRack(networkLoc, excludeBookies, predicate, ensemble); } catch (BKNotEnoughBookiesException e) { if (!fallbackToRandom) { - LOG.error( - "Failed to choose a bookie from {} : " - + "excluded {}, enforceMinNumRacksPerWriteQuorum is enabled so giving up.", - networkLoc, excludeBookies); + log.error() + .attr("networkLoc", networkLoc) + .attr("excludeBookies", excludeBookies) + .log("Failed to choose a bookie, enforceMinNumRacksPerWriteQuorum is enabled so giving up"); throw e; } - LOG.warn("Failed to choose a bookie from network location {}, " - + "the bookies in the network location are {}, excluded bookies {}, " - + "current ensemble {}, fallback to choose bookie randomly from the cluster.", - networkLoc, topology.getLeaves(networkLoc), excludeBookies, ensemble.toList()); + log.warn() + .attr("networkLoc", networkLoc) + .attr("getLeaves", topology.getLeaves(networkLoc)) + .attr("excludeBookies", excludeBookies) + .attr("toList", ensemble.toList()) + .log("Failed to choose a bookie from network location, " + + "fallback to choose bookie randomly from the cluster"); // randomly choose one from whole cluster, ignore the provided predicate. return selectRandom(1, excludeBookies, predicate, ensemble).get(0); } @@ -613,10 +630,13 @@ public BookieNode selectFromNetworkLocation(String networkLoc, * the whole cluster and exclude the racks specified at * excludeRacks. */ - LOG.warn("Failed to choose a bookie node from network location {}, " - + "the bookies in the network location are {}, excluded bookies {}, " - + "current ensemble {}, fallback to choose bookie randomly from the cluster.", - networkLoc, topology.getLeaves(networkLoc), excludeBookies, ensemble.toList()); + log.warn() + .attr("networkLoc", networkLoc) + .attr("getLeaves", topology.getLeaves(networkLoc)) + .attr("excludeBookies", excludeBookies) + .attr("toList", ensemble.toList()) + .log("Failed to choose a bookie node from network location, " + + "fallback to choose bookie randomly from the cluster"); return selectFromNetworkLocation(excludeRacks, excludeBookies, predicate, ensemble, fallbackToRandom); } } @@ -647,15 +667,17 @@ public BookieNode selectFromNetworkLocation(Set excludeRacks, return selectRandomInternal(knownNodes, 1, fullExclusionBookiesList, predicate, ensemble).get(0); } catch (BKNotEnoughBookiesException e) { if (!fallbackToRandom) { - LOG.error( - "Failed to choose a bookie excluding Racks: {} " - + "Nodes: {}, enforceMinNumRacksPerWriteQuorum is enabled so giving up.", - excludeRacks, excludeBookies); + log.error() + .attr("excludeRacks", excludeRacks) + .attr("excludeBookies", excludeBookies) + .log("Failed to choose a bookie excluding Racks: " + + "Nodes: enforceMinNumRacksPerWriteQuorum is enabled so giving up."); throw e; } - LOG.warn("Failed to choose a bookie: excluded {}, fallback to choose bookie randomly from the cluster.", - excludeBookies); + log.warn() + .attr("excludeBookies", excludeBookies) + .log("Failed to choose a bookie, fallback to choose bookie randomly from the cluster"); // randomly choose one from whole cluster return selectRandom(1, excludeBookies, predicate, ensemble).get(0); } @@ -845,8 +867,11 @@ protected List selectRandomInternal(List bookiesToSelect if (numBookies == 0) { return newBookies; } - LOG.warn("Failed to find {} bookies : excludeBookies {}, allBookies {}.", - numBookies, excludeBookies, bookiesToSelectFrom); + log.warn() + .attr("numBookies", numBookies) + .attr("excludeBookies", excludeBookies) + .attr("bookiesToSelectFrom", bookiesToSelectFrom) + .log("Failed to find bookies"); throw new BKNotEnoughBookiesException(); } @@ -957,11 +982,14 @@ DistributionSchedule.WriteSet reorderReadSequenceWithRegion( // to not trigger the speculativeReadTimeout. But even if it hits that timeout, // things may have changed by then so much that whichever bookie we put second // may actually not be the second-best choice any more. - if (LOG.isDebugEnabled()) { - LOG.debug("read set reordered from {} ({} pending) to {} ({} pending)", - ensemble.get(writeSet.get(0)), pendingReqs[0], ensemble.get(writeSet.get(bestBookieIdx)), - pendingReqs[bestBookieIdx]); - } + + log.debug() + .attr("fromBookie", ensemble.get(writeSet.get(0))) + .attr("fromPending", pendingReqs[0]) + .attr("toBookie", ensemble.get(writeSet.get(bestBookieIdx))) + .attr("toPending", pendingReqs[bestBookieIdx]) + .log("read set reordered"); + writeSet.moveAndShift(bestBookieIdx, 0); reordered = true; } @@ -1103,8 +1131,8 @@ public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(List ackedBooki for (BookieId bookie : ackedBookies) { if (knownBookies.containsKey(bookie)) { rackCounter.add(knownBookies.get(bookie).getNetworkLocation()); - } else if (LOG.isDebugEnabled()) { - LOG.debug("bookie {} is not in the list of knownBookies", bookie); + } else { + log.debug().attr("bookieAddr", bookie).log("bookie is not in the list of knownBookies"); } } // Check to make sure that ensemble is writing to `minNumberOfRacks`'s number of racks at least. - if (LOG.isDebugEnabled()) { - LOG.debug("areAckedBookiesAdheringToPlacementPolicy returning {} because number of racks = {} and " - + "minNumRacksPerWriteQuorum = {}", - rackCounter.size() >= minNumRacksPerWriteQuorum, - rackCounter.size(), - minNumRacksPerWriteQuorum); - } + + log.debug() + .attr("result", rackCounter.size() >= minNumRacksPerWriteQuorum) + .attr("rackCount", rackCounter.size()) + .attr("minNumRacksPerWriteQuorum", minNumRacksPerWriteQuorum) + .log("areAckedBookiesAdheringToPlacementPolicy returning because number of racks" + + " and minNumRacksPerWriteQuorum"); + } finally { readLock.unlock(); } @@ -1178,7 +1210,9 @@ public PlacementResult> replaceToAdherePlacementPolicy( int numRacks = topology.getNumOfRacks(); // only one rack or less than minNumRacksPerWriteQuorumForThisEnsemble, stop calculation to skip relocation if (numRacks < 2 || numRacks < minNumRacksPerWriteQuorumForThisEnsemble) { - LOG.warn("Skip ensemble relocation because the cluster has only {} rack.", numRacks); + log.warn() + .attr("numRacks", numRacks) + .log("Skip ensemble relocation because the cluster has only rack."); return PlacementResult.of(Collections.emptyList(), PlacementPolicyAdherence.FAIL); } PlacementResult> placementResult = PlacementResult.of(Collections.emptyList(), @@ -1260,14 +1294,16 @@ private PlacementResult> doReplaceToAdherePlacementPolicy( // replace to newer node provisionalEnsembleNodes.set(index, prevNode); } catch (BKNotEnoughBookiesException e) { - LOG.warn("Skip ensemble relocation because the cluster has not enough bookies."); + log.warn("Skip ensemble relocation because the cluster has not enough bookies."); return PlacementResult.of(Collections.emptyList(), PlacementPolicyAdherence.FAIL); } } List bookieList = ensemble.toList(); if (ensembleSize != bookieList.size()) { - LOG.warn("Not enough {} bookies are available to form an ensemble : {}.", - ensembleSize, bookieList); + log.warn() + .attr("ensembleSize", ensembleSize) + .attr("bookieList", bookieList) + .log("Not enough bookies are available to form an ensemble"); return PlacementResult.of(Collections.emptyList(), PlacementPolicyAdherence.FAIL); } PlacementPolicyAdherence placementPolicyAdherence = isEnsembleAdheringToPlacementPolicy(bookieList, diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java index 35ba2823365..e187192d8c1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java @@ -21,6 +21,7 @@ package org.apache.bookkeeper.client; import com.google.common.util.concurrent.ListenableFuture; +import io.github.merlimat.slog.Logger; import io.netty.buffer.ByteBuf; import java.util.BitSet; import java.util.List; @@ -36,8 +37,6 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks; import org.apache.bookkeeper.proto.ReadLastConfirmedAndEntryContext; import org.apache.bookkeeper.proto.checksum.DigestManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Long poll read operation. @@ -45,8 +44,6 @@ class ReadLastConfirmedAndEntryOp implements BookkeeperInternalCallbacks.ReadEntryCallback, SpeculativeRequestExecutor { - static final Logger LOG = LoggerFactory.getLogger(ReadLastConfirmedAndEntryOp.class); - ReadLACAndEntryRequest request; final BitSet heardFromHostsBitSet; final BitSet emptyResponsesFromHostsBitSet; @@ -67,6 +64,7 @@ class ReadLastConfirmedAndEntryOp implements BookkeeperInternalCallbacks.ReadEnt private long timeOutInMillis; private final List currentEnsemble; private ScheduledFuture speculativeTask = null; + protected final Logger log; abstract class ReadLACAndEntryRequest implements AutoCloseable { @@ -203,10 +201,13 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin ++numMissedEntryReads; } - if (LOG.isDebugEnabled()) { - LOG.debug("{} while reading entry: {} ledgerId: {} from bookie: {}", errMsg, entryImpl.getEntryId(), - lh.getId(), host); - } + + log.debug() + .attr("error", errMsg) + .attr("entryId", entryImpl.getEntryId()) + .attr("bookieAddr", host) + .log("Error while reading entry from bookie"); + } /** @@ -259,7 +260,9 @@ void read() { try { sendReadTo(orderedEnsemble.get(i), to, this); } catch (InterruptedException ie) { - LOG.error("Interrupted reading entry {} : ", this, ie); + log.error() + .exception(ie) + .log("Interrupted reading entry"); Thread.currentThread().interrupt(); fail(BKException.Code.InterruptedException); return; @@ -383,7 +386,10 @@ synchronized BookieId sendNextRead() { sentReplicas.set(replica); return to; } catch (InterruptedException ie) { - LOG.error("Interrupted reading entry " + this, ie); + log.error() + .attr("addEntryOp", this) + .exception(ie) + .log("Interrupted reading entry"); Thread.currentThread().interrupt(); fail(BKException.Code.InterruptedException); return null; @@ -396,7 +402,10 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin int replica = getReplicaIndex(bookieIndex); if (replica == NOT_FOUND) { - LOG.error("Received error from a host which is not in the ensemble {} {}.", host, ensemble); + log.error() + .attr("bookieAddr", host) + .attr("ensemble", ensemble) + .log("Received error from a host which is not in the ensemble"); return; } @@ -454,6 +463,11 @@ boolean complete(int bookieIndex, BookieId host, ByteBuf buffer, long entryId) { - getLedgerMetadata().getAckQuorumSize(); heardFromHostsBitSet = new BitSet(getLedgerMetadata().getEnsembleSize()); emptyResponsesFromHostsBitSet = new BitSet(getLedgerMetadata().getEnsembleSize()); + this.log = Logger.get(ReadLastConfirmedAndEntryOp.class) + .with() + .attr("ledgerId", lh.getId()) + .attr("prevEntryId", prevEntryId) + .build(); } protected LedgerMetadata getLedgerMetadata() { @@ -481,10 +495,12 @@ public ListenableFuture issueSpeculativeRequest() { public Boolean call() throws Exception { if (!requestComplete.get() && !request.isComplete() && (null != request.maybeSendSpeculativeRead(heardFromHostsBitSet))) { - if (LOG.isDebugEnabled()) { - LOG.debug("Send speculative ReadLAC {} for ledger {} (previousLAC: {}). Hosts heard are {}.", - request, lh.getId(), lastAddConfirmed, heardFromHostsBitSet); - } + + log.debug() + .attr("request", request) + .attr("lastAddConfirmed", lastAddConfirmed) + .attr("heardFromHostsBitSet", heardFromHostsBitSet) + .log("Send speculative ReadLAC for ledger"); return true; } return false; @@ -507,10 +523,12 @@ public void initiate() { } void sendReadTo(int bookieIndex, BookieId to, ReadLACAndEntryRequest entry) throws InterruptedException { - if (LOG.isDebugEnabled()) { - LOG.debug("Calling Read LAC and Entry with {} and long polling interval {} on Bookie {} - Parallel {}", - prevEntryId, timeOutInMillis, to, parallelRead); - } + log.debug() + .attr("timeOutInMillis", timeOutInMillis) + .attr("bookieAddr", to) + .attr("parallelRead", parallelRead) + .log("Calling Read LAC and Entry with and long polling interval on Bookie - Parallel"); + clientCtx.getBookieClient().readEntryWaitForLACUpdate(to, lh.getId(), BookieProtocol.LAST_ADD_CONFIRMED, @@ -552,18 +570,20 @@ private void submitCallback(int rc) { @Override public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffer, Object ctx) { - if (LOG.isTraceEnabled()) { - LOG.trace("{} received response for (lid={}, eid={}) : {}", - getClass().getName(), ledgerId, entryId, rc); - } + log.trace() + .attr("class", getClass().getName()) + .attr("entryId", entryId) + .attr("rc", rc) + .log("received response"); + ReadLastConfirmedAndEntryContext rCtx = (ReadLastConfirmedAndEntryContext) ctx; BookieId bookie = rCtx.getBookieAddress(); numResponsesPending--; if (BKException.Code.OK == rc) { - if (LOG.isTraceEnabled()) { - LOG.trace("Received lastAddConfirmed (lac={}) from bookie({}) for (lid={}).", - rCtx.getLastAddConfirmed(), bookie, ledgerId); - } + log.trace() + .attr("getLastAddConfirmed", rCtx.getLastAddConfirmed()) + .attr("bookieAddr", bookie) + .log("Received lastAddConfirmed"); if (rCtx.getLastAddConfirmed() > lastAddConfirmed) { lastAddConfirmed = rCtx.getLastAddConfirmed(); @@ -598,20 +618,19 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffe // received advanced lac completeRequest(); } else if (emptyResponsesFromHostsBitSet.cardinality() >= numEmptyResponsesAllowed) { - if (LOG.isDebugEnabled()) { - LOG.debug("Completed readLACAndEntry(lid = {}, previousEntryId = {}) " - + "after received {} empty responses ('{}').", - ledgerId, prevEntryId, emptyResponsesFromHostsBitSet.cardinality(), - emptyResponsesFromHostsBitSet); - } + log.debug() + .attr("cardinality", emptyResponsesFromHostsBitSet.cardinality()) + .attr("emptyResponsesFromHostsBitSet", emptyResponsesFromHostsBitSet) + .log("Completed readLACAndEntry after received empty responses"); + completeRequest(); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Received empty response for readLACAndEntry(lid = {}, previousEntryId = {}) from" - + " bookie {} @ {}, reattempting reading next bookie : lac = {}", - ledgerId, prevEntryId, rCtx.getBookieAddress(), - rCtx.getBookieAddress(), lastAddConfirmed); - } + log.debug() + .attr("bookieAddr", rCtx.getBookieAddress()) + .attr("bookieAddr", rCtx.getBookieAddress()) + .attr("lastAddConfirmed", lastAddConfirmed) + .log("Received empty response from bookie, reattempting reading next bookie"); + request.logErrorAndReattemptRead(rCtx.getBookieIndex(), bookie, "Empty Response", rc); } return; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java index 4e30c7231eb..83c3fcc62ff 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedOp.java @@ -20,6 +20,7 @@ import com.google.common.annotations.VisibleForTesting; import io.netty.buffer.ByteBuf; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKDigestMatchException; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieClient; @@ -27,15 +28,13 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback; import org.apache.bookkeeper.proto.checksum.DigestManager; import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class encapsulated the read last confirmed operation. * */ +@CustomLog class ReadLastConfirmedOp implements ReadEntryCallback { - static final Logger LOG = LoggerFactory.getLogger(ReadLastConfirmedOp.class); private final long ledgerId; private final byte[] ledgerKey; private final BookieClient bookieClient; @@ -113,9 +112,11 @@ public synchronized void readEntryComplete(final int rc, final long ledgerId, fi } catch (BKDigestMatchException e) { // Too bad, this bookie didn't give us a valid answer, we // still might be able to recover though so continue - LOG.error("Mac mismatch for ledger: " + ledgerId + ", entry: " + entryId - + " while reading last entry from bookie: " - + currentEnsemble.get(bookieIndex)); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", currentEnsemble.get(bookieIndex)) + .log("Mac mismatch while reading last entry from bookie"); } } @@ -138,18 +139,22 @@ public synchronized void readEntryComplete(final int rc, final long ledgerId, fi && coverageSet.checkCovered() && !completed) { completed = true; - if (LOG.isDebugEnabled()) { - LOG.debug("Read Complete with enough validResponses for ledger: {}, entry: {}", - ledgerId, entryId); - } + + log.debug() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Read complete with enough valid responses"); + cb.readLastConfirmedDataComplete(BKException.Code.OK, maxRecoveredData); return; } if (numResponsesPending == 0 && !completed) { - LOG.error("While readLastConfirmed ledger: {} did not hear success responses from all quorums, {}", - ledgerId, coverageSet); + log.error() + .attr("ledgerId", ledgerId) + .attr("coverageSet", coverageSet) + .log("While readLastConfirmed did not hear success responses from all quorums"); cb.readLastConfirmedDataComplete(lastSeenError, maxRecoveredData); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOnlyLedgerHandle.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOnlyLedgerHandle.java index ffad02d8f7c..e6e1db2b3b9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOnlyLedgerHandle.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOnlyLedgerHandle.java @@ -44,9 +44,6 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.TimedGenericCallback; import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Read only ledger handle. This ledger handle allows you to * read from a ledger but not to write to it. It overrides all @@ -54,7 +51,6 @@ * It should be returned for BookKeeper#openLedger operations. */ class ReadOnlyLedgerHandle extends LedgerHandle implements LedgerMetadataListener { - private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyLedgerHandle.class); private Object metadataLock = new Object(); private final NavigableMap> newEnsemblesFromRecovery = new TreeMap<>(); @@ -75,8 +71,10 @@ public void run() { if (Version.Occurred.BEFORE == occurred) { synchronized (ReadOnlyLedgerHandle.this) { if (setLedgerMetadata(currentMetadata, newMetadata)) { - LOG.info("Updated ledger metadata for ledger {} to {}, version {}.", - ledgerId, newMetadata.getValue().toSafeString(), newMetadata.getVersion()); + log.info() + .attr("newMetadata", newMetadata.getValue().toSafeString()) + .attr("newMetadataVersion", newMetadata.getVersion()) + .log("Updated ledger metadata"); break; } } @@ -127,7 +125,7 @@ public long addEntry(byte[] data) throws InterruptedException, BKException { @Override public long addEntry(byte[] data, int offset, int length) throws InterruptedException, BKException { - LOG.error("Tried to add entry on a Read-Only ledger handle, ledgerid=" + ledgerId); + log.error("Tried to add entry on a Read-Only ledger handle"); throw BKException.create(BKException.Code.IllegalOpException); } @@ -140,16 +138,18 @@ public void asyncAddEntry(final byte[] data, final AddCallback cb, @Override public void asyncAddEntry(final byte[] data, final int offset, final int length, final AddCallback cb, final Object ctx) { - LOG.error("Tried to add entry on a Read-Only ledger handle, ledgerid=" + ledgerId); + log.error("Tried to add entry on a Read-Only ledger handle"); cb.addComplete(BKException.Code.IllegalOpException, this, LedgerHandle.INVALID_ENTRY_ID, ctx); } @Override public void onChanged(long lid, Versioned newMetadata) { - if (LOG.isDebugEnabled()) { - LOG.debug("Received ledger metadata update on {} : {}", lid, newMetadata); - } + + log.debug() + .attr("newMetadata", newMetadata) + .log("Received ledger metadata update"); + if (this.ledgerId != lid) { return; } @@ -158,16 +158,20 @@ public void onChanged(long lid, Versioned newMetadata) { } Versioned currentMetadata = getVersionedLedgerMetadata(); Version.Occurred occurred = currentMetadata.getVersion().compare(newMetadata.getVersion()); - if (LOG.isDebugEnabled()) { - LOG.debug("Try to update metadata from {} to {} : {}", - currentMetadata, newMetadata, occurred); - } + + log.debug() + .attr("currentMetadata", currentMetadata) + .attr("newMetadata", newMetadata) + .attr("occurred", occurred) + .log("Try to update metadata"); + if (Version.Occurred.BEFORE == occurred) { // the metadata is updated try { clientCtx.getMainWorkerPool().executeOrdered(ledgerId, new MetadataUpdater(newMetadata)); } catch (RejectedExecutionException ree) { - LOG.error("Failed on submitting updater to update ledger metadata on ledger {} : {}", - ledgerId, newMetadata); + log.error() + .attr("newMetadata", newMetadata) + .log("Failed on submitting updater to update ledger metadata on ledger"); } } } @@ -196,8 +200,10 @@ public void readLastConfirmedComplete(int rc, long lastConfirmed, Object ctx) { asyncReadEntriesInternal(lastConfirmed, lastConfirmed, cb, ctx, false); } } else { - LOG.error("ReadException in asyncReadLastEntry, ledgerId: {}, lac: {}, rc:{}", - lastConfirmed, ledgerId, rc); + log.error() + .attr("lastAddConfirmed", lastConfirmed) + .attr("rc", rc) + .log("ReadException in asyncReadLastEntry"); cb.readComplete(rc, ReadOnlyLedgerHandle.this, null, ctx); } } @@ -217,21 +223,19 @@ void handleBookieFailure(final Map failedBookies) { // ledger, so this synchronized should be unnecessary, but putting it here now // just in case (can be removed when we validate threads) synchronized (metadataLock) { - String logContext = String.format("[RecoveryEnsembleChange(ledger:%d)]", ledgerId); - long lac = getLastAddConfirmed(); LedgerMetadata metadata = getLedgerMetadata(); List currentEnsemble = getCurrentEnsemble(); try { List newEnsemble = EnsembleUtils.replaceBookiesInEnsemble( - clientCtx.getBookieWatcher(), metadata, currentEnsemble, failedBookies, logContext); + clientCtx.getBookieWatcher(), metadata, currentEnsemble, failedBookies, 0); Set replaced = EnsembleUtils.diffEnsemble(currentEnsemble, newEnsemble); if (!replaced.isEmpty()) { newEnsemblesFromRecovery.put(lac + 1, newEnsemble); unsetSuccessAndSendWriteRequest(newEnsemble, replaced); } } catch (BKException.BKNotEnoughBookiesException e) { - LOG.error("Could not get additional bookie to remake ensemble, closing ledger: {}", ledgerId); + log.error("Could not get additional bookie to remake ensemble, closing ledger"); handleUnrecoverableErrorDuringAdd(e.getCode()); return; @@ -306,7 +310,9 @@ CompletableFuture> closeRecovered() { lac = lastAddConfirmed; len = length.get(); } - LOG.info("Closing recovered ledger {} at entry {}", getId(), lac); + log.info() + .attr("lastAddConfirmed", lac) + .log("Closing recovered ledger"); CompletableFuture> f = new MetadataUpdateLoop( clientCtx.getLedgerManager(), getId(), this::getVersionedLedgerMetadata, @@ -335,7 +341,9 @@ CompletableFuture> closeRecovered() { newEnsemblesFromRecovery.clear(); } if (exception != null) { - LOG.error("When closeRecovered,failed on clearing newEnsemblesFromRecovery.", exception); + log.error() + .exception(exception) + .log("When closeRecovered,failed on clearing newEnsemblesFromRecovery."); } }); return f; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOpBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOpBase.java index cbd68ec657a..eb16f473c70 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOpBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadOpBase.java @@ -29,17 +29,15 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerEntries; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public abstract class ReadOpBase implements Runnable { - private static final Logger LOG = LoggerFactory.getLogger(ReadOpBase.class); - protected ScheduledFuture speculativeTask = null; protected final CompletableFuture future; protected final Set heardFromHosts; @@ -196,15 +194,22 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin if (BKException.Code.NoSuchEntryException == rc || BKException.Code.NoSuchLedgerExistsException == rc) { ++numBookiesMissingEntry; - if (LOG.isDebugEnabled()) { - LOG.debug("No such entry found on bookie. L{} E{} bookie: {}", - lh.ledgerId, eId, host); - } + + log.debug() + .attr("ledgerId", lh.ledgerId) + .attr("entryId", eId) + .attr("bookieAddr", host) + .log("No such entry found on bookie"); + } else { - if (LOG.isInfoEnabled()) { - LOG.info("{} while reading L{} E{} from bookie: {}", - errMsg, lh.ledgerId, eId, host); - } + + log.info() + .attr("error", errMsg) + .attr("ledgerId", lh.ledgerId) + .attr("entryId", eId) + .attr("bookieAddr", host) + .log("Error while reading from bookie"); + } lh.recordReadErrorOnBookie(bookieIndex); @@ -255,11 +260,14 @@ public ListenableFuture issueSpeculativeRequest() { @Override public Boolean call() throws Exception { if (!isComplete() && null != maybeSendSpeculativeRead(heardFromHostsBitSet)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Send speculative read for {}. Hosts sent are {}, " - + " Hosts heard are {}, ensemble is {}.", - this, sentToHosts, heardFromHostsBitSet, ensemble); - } + + log.debug() + .attr("readOp", this) + .attr("sentToHosts", sentToHosts) + .attr("heardFromHostsBitSet", heardFromHostsBitSet) + .attr("ensemble", ensemble) + .log("Send speculative read"); + return true; } return false; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java index fd0bc8f7e5e..c6ae45d12a0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.feature.Feature; import org.apache.bookkeeper.feature.FeatureProvider; @@ -42,16 +43,14 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.util.BookKeeperConstants; import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A placement policy use region information in the network topology for placing ensembles. * * @see EnsemblePlacementPolicy */ +@CustomLog public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlacementPolicy { - static final Logger LOG = LoggerFactory.getLogger(RegionAwareEnsemblePlacementPolicy.class); public static final String REPP_REGIONS_TO_WRITE = "reppRegionsToWrite"; public static final String REPP_MINIMUM_REGIONS_FOR_DURABILITY = "reppMinimumRegionsForDurability"; @@ -171,9 +170,9 @@ public void handleBookiesThatJoined(Set joinedBookies) { regionSet.add(addr); } - if (LOG.isDebugEnabled()) { - LOG.debug("Cluster changed : bookie {} joined the cluster.", addr); - } + + log.debug().attr("bookieAddr", addr).log("Cluster changed. New bookie joined the cluster."); + } for (Map.Entry regionEntry : perRegionPlacement.entrySet()) { @@ -229,7 +228,10 @@ public void onBookieRackChange(List bookieAddressList) { } } } catch (IllegalArgumentException | NetworkTopologyImpl.InvalidTopologyException e) { - LOG.error("Failed to update bookie rack info: {} ", bookieAddress, e); + log.error() + .exception(e) + .attr("bookieAddress", bookieAddress) + .log("Failed to update bookie rack info"); } }); } finally { @@ -356,7 +358,7 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu if (numRegionsAvailable < 1) { // We cant disallow all regions; if we did, raise an alert to draw attention if (perRegionPlacement.keySet().size() >= 1) { - LOG.error("No regions available, invalid configuration"); + log.error("No regions available, invalid configuration"); } List bns = selectRandom(ensembleSize, excludeNodes, TruePredicate.INSTANCE, EnsembleForReplacementWithNoConstraints.INSTANCE); @@ -427,7 +429,7 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu TopologyAwareEnsemblePlacementPolicy policyWithinRegion = perRegionPlacement.get(region); if (!regionsReachedMaxAllocation.contains(region)) { if (numRemainingRegions <= 0) { - LOG.error("Inconsistent State: This should never happen"); + log.error("Inconsistent State: This should never happen"); throw new BKException.BKNotEnoughBookiesException(); } // try to place the bookies as balance as possible across all the regions @@ -456,13 +458,19 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu success = true; regionsToAllocate--; lastRegionIndex = startRegionIndex; - LOG.info("Region {} allocating bookies with ensemble size {} " - + "and write quorum size {} : {}", - region, newEnsembleSize, newWriteQuorumSize, allocated); + log.info() + .attr("region", region) + .attr("ensembleSize", newEnsembleSize) + .attr("writeQuorumSize", newWriteQuorumSize) + .attr("allocated", allocated) + .log("Region allocating bookies"); break; } catch (BKException.BKNotEnoughBookiesException exc) { - LOG.warn("Could not allocate {} bookies in region {}, try allocating {} bookies", - newEnsembleSize, region, (newEnsembleSize - 1)); + log.warn() + .attr("ensembleSize", newEnsembleSize) + .attr("region", region) + .attr("suggestedEnsembleSize", (newEnsembleSize - 1)) + .log("Could not allocate bookies in region, try allocating bookies"); addToEnsembleSize--; } } @@ -476,8 +484,12 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu if (regionsReachedMaxAllocation.contains(region)) { if (currentAllocation.getLeft() > 0) { - LOG.info("Allocating {} bookies in region {} : ensemble {} exclude {}", - currentAllocation.getLeft(), region, comprehensiveExclusionBookiesSet, ensemble); + log.info() + .attr("bookieCount", currentAllocation.getLeft()) + .attr("region", region) + .attr("comprehensiveExclusionBookiesSet", comprehensiveExclusionBookiesSet) + .attr("ensemble", ensemble) + .log("Allocating bookies"); policyWithinRegion.newEnsemble( currentAllocation.getLeft(), currentAllocation.getRight(), @@ -485,8 +497,11 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu comprehensiveExclusionBookiesSet, ensemble, ensemble); - LOG.info("Allocated {} bookies in region {} : {}", - currentAllocation.getLeft(), region, ensemble); + log.info() + .attr("bookiesCount", currentAllocation.getLeft()) + .attr("region", region) + .attr("ensemble", ensemble) + .log("Allocated bookies"); } } } @@ -498,17 +513,21 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu List bookieList = ensemble.toList(); if (ensembleSize != bookieList.size()) { - LOG.error("Not enough {} bookies are available to form an ensemble : {}.", - ensembleSize, bookieList); + log.error() + .attr("ensembleSize", ensembleSize) + .attr("bookieList", bookieList) + .log("Not enough bookies are available to form an ensemble"); throw new BKException.BKNotEnoughBookiesException(); } if (enableValidation && !ensemble.validate()) { - LOG.error("Not enough {} bookies are available to form a valid ensemble : {}.", - ensembleSize, bookieList); + log.error() + .attr("ensembleSize", ensembleSize) + .attr("bookieList", bookieList) + .log("Not enough bookies are available to form a valid ensemble"); throw new BKException.BKNotEnoughBookiesException(); } - LOG.info("Bookies allocated successfully {}", ensemble); + log.info().attr("ensemble", ensemble).log("Bookies allocated successfully"); List ensembleList = ensemble.toList(); return PlacementResult.of(ensembleList, isEnsembleAdheringToPlacementPolicy(ensembleList, writeQuorumSize, ackQuorumSize)); @@ -555,7 +574,7 @@ public PlacementResult replaceBookie(int ensembleSize, int writeQuorum excludeNodes.add(bn); if (!ensemble.apply(bn, ensemble)) { - LOG.warn("Anomalous ensemble detected"); + log.warn("Anomalous ensemble detected"); if (null != statsLogger) { statsLogger.getCounter(REGION_AWARE_ANOMALOUS_ENSEMBLE).inc(); } @@ -565,16 +584,21 @@ public PlacementResult replaceBookie(int ensembleSize, int writeQuorum ensemble.addNode(bn); } - if (LOG.isDebugEnabled()) { - LOG.debug("Try to choose a new bookie to replace {}, excluding {}.", bookieToReplace, - excludeNodes); - } + + log.debug() + .attr("bookieToReplace", bookieToReplace) + .attr("excludeNodes", excludeNodes) + .log("Trying to choose a new bookie to replace existing one"); + // pick a candidate from same rack to replace BookieNode candidate = replaceFromRack(bookieNodeToReplace, excludeNodes, ensemble, ensemble, enforceDurability); - if (LOG.isDebugEnabled()) { - LOG.debug("Bookie {} is chosen to replace bookie {}.", candidate, bookieNodeToReplace); - } + + log.debug() + .attr("candidate", candidate) + .attr("bookieNodeToReplace", bookieNodeToReplace) + .log("Bookie chosen to replace existing bookie"); + BookieId candidateAddr = candidate.getAddr(); List newEnsemble = new ArrayList(currentEnsemble); if (currentEnsemble.isEmpty()) { @@ -623,9 +647,10 @@ protected BookieNode replaceFromRack(BookieNode bookieNodeToReplace, EnsembleForReplacementWithNoConstraints.INSTANCE, true); } catch (BKException.BKNotEnoughBookiesException e) { - LOG.warn("Failed to choose a bookie from {} : " - + "excluded {}, fallback to choose bookie randomly from the cluster.", - bookieNodeToReplace.getNetworkLocation(), excludeBookies); + log.warn() + .attr("getNetworkLocation", bookieNodeToReplace.getNetworkLocation()) + .attr("excludeBookies", excludeBookies) + .log("Failed to choose a bookie, fallback to choose bookie randomly from the cluster"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RoundRobinDistributionSchedule.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RoundRobinDistributionSchedule.java index 62690129744..97319bc1dc7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RoundRobinDistributionSchedule.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RoundRobinDistributionSchedule.java @@ -25,10 +25,9 @@ import java.util.Arrays; import java.util.BitSet; import java.util.Map; +import lombok.CustomLog; import lombok.Getter; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A specific {@link DistributionSchedule} that places entries in round-robin @@ -37,8 +36,8 @@ * on. * */ +@CustomLog public class RoundRobinDistributionSchedule implements DistributionSchedule { - private static final Logger LOG = LoggerFactory.getLogger(RoundRobinDistributionSchedule.class); @Getter private final int writeQuorumSize; private final int ackQuorumSize; @@ -438,10 +437,12 @@ public boolean hasEntry(long entryId, int bookieIndex) { public BitSet getEntriesStripedToTheBookie(int bookieIndex, long startEntryId, long lastEntryId) { if ((startEntryId < 0) || (lastEntryId < 0) || (bookieIndex < 0) || (bookieIndex >= ensembleSize) || (lastEntryId < startEntryId)) { - LOG.error( - "Illegal arguments for getEntriesStripedToTheBookie, bookieIndex : {}," - + " ensembleSize : {}, startEntryId : {}, lastEntryId : {}", - bookieIndex, ensembleSize, startEntryId, lastEntryId); + log.error() + .attr("bookieIndex", bookieIndex) + .attr("ensembleSize", ensembleSize) + .attr("startEntryId", startEntryId) + .attr("entryId", lastEntryId) + .log("Illegal arguments for getEntriesStripedToTheBookie"); throw new IllegalArgumentException("Illegal arguments for getEntriesStripedToTheBookie"); } BitSet entriesStripedToTheBookie = new BitSet((int) (lastEntryId - startEntryId + 1)); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java index a421a7547d7..8503739c1b4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java @@ -22,7 +22,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LastConfirmedAndEntry; import org.apache.bookkeeper.client.impl.LastConfirmedAndEntryImpl; @@ -30,7 +30,7 @@ * Utility for callbacks. * */ -@Slf4j +@CustomLog class SyncCallbackUtils { /** @@ -196,9 +196,9 @@ static class LastAddConfirmedCallback implements AsyncCallback.AddLacCallback { @Override public void addLacComplete(int rc, LedgerHandle lh, Object ctx) { if (rc != BKException.Code.OK) { - log.warn("LastAddConfirmedUpdate failed: {} ", BKException.getMessage(rc)); - } else if (log.isDebugEnabled()) { - log.debug("Callback LAC Updated for: {} ", lh.getId()); + log.warn().attr("error", BKException.getMessage(rc)).log("LastAddConfirmedUpdate failed"); + } else { + log.debug().attr("ledgerId", lh.getId()).log("Callback LAC Updated"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java index 9eae79438fd..be7dc952fc4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java @@ -37,6 +37,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Supplier; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; import org.apache.bookkeeper.client.WeightedRandomSelection.WeightedObject; import org.apache.bookkeeper.net.BookieId; @@ -53,12 +54,10 @@ import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog abstract class TopologyAwareEnsemblePlacementPolicy implements ITopologyAwareEnsemblePlacementPolicy { - static final Logger LOG = LoggerFactory.getLogger(TopologyAwareEnsemblePlacementPolicy.class); public static final String REPP_DNS_RESOLVER_CLASS = "reppDnsResolverClass"; protected final Map knownBookies = new HashMap(); protected final Map historyBookies = new HashMap(); @@ -214,12 +213,14 @@ private boolean checkSumOfSubsetWithinLimit(final Set includedRacksOrReg int maxAllowedSum) { if (remainingRacksOrRegions.isEmpty() || (subsetSize <= 0)) { if (maxAllowedSum < 0) { - if (LOG.isTraceEnabled()) { - LOG.trace( - "CHECK FAILED: RacksOrRegions Included {} Remaining {}, subsetSize {}, " - + "maxAllowedSum {}", - includedRacksOrRegions, remainingRacksOrRegions, subsetSize, maxAllowedSum); - } + + log.trace() + .attr("includedRacksOrRegions", includedRacksOrRegions) + .attr("remainingRacksOrRegions", remainingRacksOrRegions) + .attr("subsetSize", subsetSize) + .attr("maxAllowedSum", maxAllowedSum) + .log("CHECK FAILED: RacksOrRegions"); + } return (maxAllowedSum >= 0); } @@ -232,12 +233,14 @@ private boolean checkSumOfSubsetWithinLimit(final Set includedRacksOrReg } if (currentAllocation > maxAllowedSum) { - if (LOG.isTraceEnabled()) { - LOG.trace( - "CHECK FAILED: RacksOrRegions Included {} Candidate {}, subsetSize {}, " - + "maxAllowedSum {}", - includedRacksOrRegions, rackOrRegion, subsetSize, maxAllowedSum); - } + + log.trace() + .attr("includedRacksOrRegions", includedRacksOrRegions) + .attr("rackOrRegion", rackOrRegion) + .attr("subsetSize", subsetSize) + .attr("maxAllowedSum", maxAllowedSum) + .log("CHECK FAILED: RacksOrRegions"); + return false; } else { Set remainingElements = new HashSet(remainingRacksOrRegions); @@ -276,11 +279,13 @@ public boolean apply(BookieNode candidate) { // find sets that contain this candidateRackOrRegion Integer currentAllocation = allocationToRacksOrRegions.get(candidateRackOrRegion); if (currentAllocation == null) { - LOG.info("Detected a region that was not initialized {}", candidateRackOrRegion); + log.info() + .attr("candidateRackOrRegion", candidateRackOrRegion) + .log("Detected a region that was not initialized"); if (candidateRackOrRegion.equals(NetworkTopology.DEFAULT_REGION)) { - LOG.error("Failed to resolve network location {}", candidate); + log.error().attr("candidate", candidate).log("Failed to resolve network location"); } else if (!racksOrRegions.contains(candidateRackOrRegion)) { - LOG.error("Unknown region detected {}", candidateRackOrRegion); + log.error().attr("candidateRackOrRegion", candidateRackOrRegion).log("Unknown region detected"); } allocationToRacksOrRegions.put(candidateRackOrRegion, 0); currentAllocation = 0; @@ -563,8 +568,10 @@ public List resolve(List names) { if (rNames != null && rNames.size() == names.size()) { for (int i = 0; i < rNames.size(); ++i) { if (rNames.get(i) == null) { - LOG.warn("Failed to resolve network location for {}, using default rack for it : {}.", - names.get(i), defaultRack); + log.warn() + .attr("bookie", names.get(i)) + .attr("defaultRack", defaultRack) + .log("Failed to resolve network location, using default rack"); failedToResolveNetworkLocationCounter.inc(); rNames.set(i, defaultRack); } @@ -572,8 +579,10 @@ public List resolve(List names) { return rNames; } - LOG.warn("Failed to resolve network location for {}, using default rack for them : {}.", names, - defaultRack); + log.warn() + .attr("names", names) + .attr("defaultRack", defaultRack) + .log("Failed to resolve network location, using default rack"); rNames = new ArrayList<>(names.size()); for (int i = 0; i < names.size(); ++i) { @@ -658,10 +667,13 @@ public Set onClusterChanged(Set writableBookies, joinedBookies = Sets.difference(writableBookies, oldBookieSet).immutableCopy(); // dead bookies. deadBookies = Sets.difference(leftBookies, readOnlyBookies).immutableCopy(); - if (LOG.isDebugEnabled()) { - LOG.debug("Cluster changed : left bookies are {}, joined bookies are {}, while dead bookies are {}.", - leftBookies, joinedBookies, deadBookies); - } + + log.debug() + .attr("leftBookies", leftBookies) + .attr("joinedBookies", joinedBookies) + .attr("deadBookies", deadBookies) + .log("Cluster changed"); + handleBookiesThatLeft(leftBookies); handleBookiesThatJoined(joinedBookies); if (this.isWeighted && (leftBookies.size() > 0 || joinedBookies.size() > 0)) { @@ -693,12 +705,15 @@ public void handleBookiesThatLeft(Set leftBookies) { bookiesLeftCounter.registerSuccessfulValue(1L); - if (LOG.isDebugEnabled()) { - LOG.debug("Cluster changed : bookie {} left from cluster.", addr); - } + + log.debug().attr("bookieAddr", addr).log("Cluster changed: bookie left cluster"); + } } catch (Throwable t) { - LOG.error("Unexpected exception while handling leaving bookie {}", addr, t); + log.error() + .attr("bookieAddr", addr) + .exception(t) + .log("Unexpected exception while handling leaving bookie"); if (bookiesLeftCounter != null) { bookiesLeftCounter.registerFailedValue(1L); } @@ -726,12 +741,15 @@ public void handleBookiesThatJoined(Set joinedBookies) { bookiesJoinedCounter.registerSuccessfulValue(1L); - if (LOG.isDebugEnabled()) { - LOG.debug("Cluster changed : bookie {} joined the cluster.", addr); - } + + log.debug().attr("bookieAddr", addr).log("Cluster changed: bookie joined the cluster"); + } catch (Throwable t) { // topology.add() throws unchecked exception - LOG.error("Unexpected exception while handling joining bookie {}", addr, t); + log.error() + .attr("bookieAddr", addr) + .exception(t) + .log("Unexpected exception while handling joining bookie"); bookiesJoinedCounter.registerFailedValue(1L); // no need to re-throw; we want to process the rest of the bookies @@ -758,7 +776,10 @@ public void onBookieRackChange(List bookieAddressList) { } } } catch (IllegalArgumentException | NetworkTopologyImpl.InvalidTopologyException e) { - LOG.error("Failed to update bookie rack info: {} ", bookieAddress, e); + log.error() + .exception(e) + .attr("bookieAddr", bookieAddress) + .log("Failed to update bookie rack info"); } }); } finally { @@ -785,7 +806,7 @@ public static int differBetweenBookies(List bookiesA, List b @Override public void updateBookieInfo(Map bookieInfoMap) { if (!isWeighted) { - LOG.info("bookieFreeDiskInfo callback called even without weighted placement policy being used."); + log.info("bookieFreeDiskInfo callback called even without weighted placement policy being used."); return; } rwLock.writeLock().lock(); @@ -825,8 +846,11 @@ protected String resolveNetworkLocation(BookieId addr) { return historyBookie.getNetworkLocation(); } String defaultRack = getDefaultRack(); - LOG.error("Cannot resolve bookieId {} to a network address, resolving as {}. {}", addr, - defaultRack, err.getMessage()); + log.error() + .attr("bookieAddr", addr) + .attr("defaultRack", defaultRack) + .exceptionMessage(err) + .log("Cannot resolve bookieId to a network address"); return defaultRack; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java index fb01843e64b..27303de0075 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java @@ -19,23 +19,21 @@ import io.netty.buffer.ByteBuf; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.client.ReadLastConfirmedOp.LastConfirmedDataCallback; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieClient; import org.apache.bookkeeper.proto.BookieProtocol; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback; import org.apache.bookkeeper.proto.checksum.DigestManager.RecoveryData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This op is try to read last confirmed without involving quorum coverage checking. * Use {@link ReadLastConfirmedOp} if you need quorum coverage checking. */ +@CustomLog class TryReadLastConfirmedOp implements ReadEntryCallback { - static final Logger LOG = LoggerFactory.getLogger(TryReadLastConfirmedOp.class); - final LedgerHandle lh; final BookieClient bookieClient; final LastConfirmedDataCallback cb; @@ -67,20 +65,27 @@ public void initiate() { @Override public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffer, Object ctx) { - if (LOG.isTraceEnabled()) { - LOG.trace("TryReadLastConfirmed received response for (lid={}, eid={}) : {}", - ledgerId, entryId, rc); - } + + log.trace() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("rc", rc) + .log("TryReadLastConfirmed received response"); + int bookieIndex = (Integer) ctx; numResponsesPending--; if (BKException.Code.OK == rc) { try { RecoveryData recoveryData = lh.macManager.verifyDigestAndReturnLastConfirmed(buffer); - if (LOG.isTraceEnabled()) { - LOG.trace("Received lastAddConfirmed (lac={}, length={}) from bookie({}) for (lid={}).", - recoveryData.getLastAddConfirmed(), recoveryData.getLength(), bookieIndex, ledgerId); - } + + log.trace() + .attr("lastAddConfirmed", recoveryData.getLastAddConfirmed()) + .attr("length", recoveryData.getLength()) + .attr("bookieIndex", bookieIndex) + .attr("ledgerId", ledgerId) + .log("Received lastAddConfirmed"); + if (recoveryData.getLastAddConfirmed() > maxRecoveredData.getLastAddConfirmed()) { maxRecoveredData = recoveryData; // callback immediately @@ -88,9 +93,11 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffe } hasValidResponse = true; } catch (BKException.BKDigestMatchException e) { - LOG.error("Mac mismatch for ledger: " + ledgerId + ", entry: " + entryId - + " while reading last entry from bookie: " - + currentEnsemble.get(bookieIndex)); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("bookieAddr", currentEnsemble.get(bookieIndex)) + .log("Mac mismatch while reading last entry from bookie"); } } else if (BKException.Code.UnauthorizedAccessException == rc && !completed) { cb.readLastConfirmedDataComplete(rc, maxRecoveredData); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java index bcdb20464ad..17b3e5c2409 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java @@ -33,20 +33,18 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieShell.UpdateLedgerNotifier; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Encapsulates updating the ledger metadata operation. */ +@CustomLog public class UpdateLedgerOp { - - private static final Logger LOG = LoggerFactory.getLogger(UpdateLedgerOp.class); private final LedgerManager lm; private final BookKeeperAdmin admin; @@ -119,11 +117,14 @@ public void updateBookieIdInLedgers(final BookieId oldBookieId, final BookieId n && !(ex instanceof BKException.BKNoSuchLedgerExistsOnMetadataServerException)) { String error = String.format("Failed to update ledger metadata %s, replacing %s with %s", ledgerId, oldBookieId, newBookieId); - LOG.error(error, ex); + log.error().exception(ex).log(error); finalPromise.completeExceptionally(new IOException(error, ex)); } else { - LOG.info("Updated ledger {} metadata, replacing {} with {}", - ledgerId, oldBookieId, newBookieId); + log.info() + .attr("ledgerId", ledgerId) + .attr("oldBookieId", oldBookieId) + .attr("newBookieId", newBookieId) + .log("Updated ledger metadata, replaced old bookie with new bookie"); updatedLedgerCnt.incrementAndGet(); progressable.progress(updatedLedgerCnt.get(), issuedLedgerCnt.get()); @@ -144,16 +145,22 @@ public void updateBookieIdInLedgers(final BookieId oldBookieId, final BookieId n try { finalPromise.get(); - LOG.info("Total number of ledgers issued={} updated={}", - issuedLedgerCnt.get(), updatedLedgerCnt.get()); + log.info() + .attr("issued", issuedLedgerCnt.get()) + .attr("updated", updatedLedgerCnt.get()) + .log("Total number of ledgers"); } catch (ExecutionException e) { - String error = String.format("Error waiting for ledger metadata updates to complete (replacing %s with %s)", - oldBookieId, newBookieId); - LOG.info(error, e); + log.info() + .exception(e) + .attr("oldBookieId", oldBookieId) + .attr("newBookieId", newBookieId) + .log("Error waiting for ledger metadata updates to complete"); if (e.getCause() instanceof IOException) { throw (IOException) e.getCause(); } else { - throw new IOException(error, e); + throw new IOException( + String.format("Error waiting for ledger metadata updates to complete (replacing %s with %s)", + oldBookieId, newBookieId), e); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java index 1a2b9f0dcd5..bbb036f3e69 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java @@ -28,11 +28,10 @@ import java.util.TreeMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; +@CustomLog class WeightedRandomSelectionImpl implements WeightedRandomSelection { - static final Logger LOG = LoggerFactory.getLogger(WeightedRandomSelectionImpl.class); Double randomMax; int maxProbabilityMultiplier; @@ -94,9 +93,12 @@ public int compare(WeightedObject o1, WeightedObject o2) { medianWeight = median / (double) totalWeight; minWeight = (double) min / totalWeight; - if (LOG.isDebugEnabled()) { - LOG.debug("Updating weights map. MediaWeight: {} MinWeight: {}", medianWeight, minWeight); - } + + log.debug() + .attr("medianWeight", medianWeight) + .attr("minWeight", minWeight) + .log("Updating weights map"); + double maxWeight = maxProbabilityMultiplier * medianWeight; Map weightMap = new HashMap(); @@ -109,10 +111,13 @@ public int compare(WeightedObject o1, WeightedObject o2) { } if (maxWeight > 0 && weightedProbability > maxWeight) { weightedProbability = maxWeight; - if (LOG.isDebugEnabled()) { - LOG.debug("Capping the probability to {} for {} Value: {}", - weightedProbability, e.getKey(), e.getValue()); - } + + log.debug() + .attr("weightedProbability", weightedProbability) + .attr("key", e.getKey()) + .attr("value", e.getValue()) + .log("Capping the probability"); + } weightMap.put(e.getKey(), weightedProbability); } @@ -124,10 +129,14 @@ public int compare(WeightedObject o1, WeightedObject o2) { Double key = 0.0; for (Map.Entry e : weightMap.entrySet()) { tmpCumulativeMap.put(key, e.getKey()); - if (LOG.isDebugEnabled()) { - LOG.debug("Key: {} Value: {} AssignedKey: {} AssignedWeight: {}", - e.getKey(), e.getValue(), key, e.getValue()); - } + + log.debug() + .attr("key", e.getKey()) + .attr("value", e.getValue()) + .attr("assignedKey", key) + .attr("assignedValue", e.getValue()) + .log("Assigned weight"); + key += e.getValue(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java index 1ce04c4be31..1cccad34804 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java @@ -44,6 +44,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException; import org.apache.bookkeeper.common.util.ReflectionUtils; import org.apache.bookkeeper.conf.ClientConfiguration; @@ -65,16 +66,13 @@ import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Simple zoneaware ensemble placement policy. */ +@CustomLog public class ZoneawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsemblePlacementPolicy { - static final Logger LOG = LoggerFactory.getLogger(ZoneawareEnsemblePlacementPolicyImpl.class); - public static final String UNKNOWN_ZONE = "UnknownZone"; /* * this defaultFaultDomain is used as placeholder network location for @@ -210,18 +208,21 @@ public Integer getSample() { if (this.isWeighted) { this.maxWeightMultiple = conf.getBookieMaxWeightMultipleForWeightBasedPlacement(); this.weightedSelection = new DynamicWeightedRandomSelectionImpl(this.maxWeightMultiple); - LOG.info("Weight based placement with max multiple of {}", this.maxWeightMultiple); + log.info() + .attr("maxWeightMultiple", this.maxWeightMultiple) + .log("Weight based placement enabled"); } else { - LOG.info("Not weighted"); + log.info("Not weighted"); } this.minNumZonesPerWriteQuorum = conf.getMinNumZonesPerWriteQuorum(); this.desiredNumZonesPerWriteQuorum = conf.getDesiredNumZonesPerWriteQuorum(); this.enforceStrictZoneawarePlacement = conf.getEnforceStrictZoneawarePlacement(); if (minNumZonesPerWriteQuorum > desiredNumZonesPerWriteQuorum) { - LOG.error( - "It is misconfigured, for ZoneawareEnsemblePlacementPolicy, minNumZonesPerWriteQuorum: {} cann't be" - + " greater than desiredNumZonesPerWriteQuorum: {}", - minNumZonesPerWriteQuorum, desiredNumZonesPerWriteQuorum); + log.error() + .attr("minNumZonesPerWriteQuorum", minNumZonesPerWriteQuorum) + .attr("desiredNumZonesPerWriteQuorum", desiredNumZonesPerWriteQuorum) + .log("It is misconfigured, for ZoneawareEnsemblePlacementPolicy," + + " minNumZonesPerWriteQuorum cannot be greater than desiredNumZonesPerWriteQuorum"); throw new IllegalArgumentException("minNumZonesPerWriteQuorum: " + minNumZonesPerWriteQuorum + " cann't be greater than desiredNumZonesPerWriteQuorum: " + desiredNumZonesPerWriteQuorum); } @@ -251,11 +252,14 @@ public Integer getSample() { myNode = createDummyLocalBookieNode(InetAddress.getLocalHost().getHostAddress()); myZone = getZoneAwareNodeLocation(myNode).getZone(); } catch (IOException e) { - LOG.error("Failed to get local host address : ", e); + log.error().exception(e).log("Failed to get local host address"); throw new RuntimeException(e); } - LOG.info("Initialized zoneaware ensemble placement policy @ {} @ {} : {}.", myNode, - myNode.getNetworkLocation(), dnsResolver.getClass().getName()); + log.info() + .attr("myNode", myNode) + .attr("getNetworkLocation", myNode.getNetworkLocation()) + .attr("getName", dnsResolver.getClass().getName()) + .log("Initialized zoneaware ensemble placement policy"); slowBookies = CacheBuilder.newBuilder() .expireAfterWrite(conf.getBookieFailureHistoryExpirationMSec(), TimeUnit.MILLISECONDS) @@ -273,7 +277,7 @@ public ZoneawareEnsemblePlacementPolicyImpl withDefaultFaultDomain(String defaul String[] parts = StringUtils.split(NodeBase.normalize(defaultFaultDomain), NodeBase.PATH_SEPARATOR); if (parts.length != 2) { - LOG.error("provided defaultFaultDomain: {} is not valid", defaultFaultDomain); + log.error().attr("defaultFaultDomain", defaultFaultDomain).log("provided defaultFaultDomain: is not valid"); throw new IllegalArgumentException("invalid defaultFaultDomain"); } else { unresolvedNodeLocation = new ZoneAwareNodeLocation(NodeBase.PATH_SEPARATOR_STR + parts[0], @@ -359,7 +363,7 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu * * So prohibiting this combination of configuration. */ - LOG.error("It is illegal for ensembleSize to be not multiple of" + log.error("It is illegal for ensembleSize to be not multiple of" + " writeQuorumSize When StrictZoneawarePlacement is enabled"); throw new IllegalArgumentException("It is illegal for ensembleSize to be not multiple of" + " writeQuorumSize When StrictZoneawarePlacement is enabled"); @@ -382,7 +386,7 @@ public PlacementResult> newEnsemble(int ensembleSize, int writeQu * * So prohibiting this combination of configuration. */ - LOG.error("It is illegal for writeQuorumSize to be lesser than or equal" + log.error("It is illegal for writeQuorumSize to be lesser than or equal" + " to minNumZonesPerWriteQuorum When StrictZoneawarePlacement is enabled"); throw new IllegalArgumentException("It is illegal for writeQuorumSize to be lesser than or equal" + " to minNumZonesPerWriteQuorum When StrictZoneawarePlacement is enabled"); @@ -444,7 +448,9 @@ private PlacementResult> createNewEnsembleRandomly(List int ensembleSize = newEnsemble.size(); Set bookiesToConsider = getBookiesToConsider(excludeBookies); if (bookiesToConsider.size() < newEnsemble.size()) { - LOG.error("Not enough bookies are available to form ensemble of size: {}", newEnsemble.size()); + log.error() + .attr("size", newEnsemble.size()) + .log("Not enough bookies are available to form ensemble"); throw new BKNotEnoughBookiesException(); } @@ -466,7 +472,7 @@ private PlacementResult selectBookieRandomly(List newEnsembl int bookieToReplaceIndex = newEnsemble.indexOf(bookieToReplace); if (bookiesToConsider.isEmpty()) { - LOG.error("There is no bookie available to replace a bookie"); + log.error("There is no bookie available to replace a bookie"); throw new BKNotEnoughBookiesException(); } BookieId candidateAddr = (selectCandidateNode(bookiesToConsider)).getAddr(); @@ -561,8 +567,11 @@ private BookieId setBookieInTheEnsemble(int ensembleSize, int writeQuorumSize, writeQuorumSize, currentEnsemble, bookieToReplaceIndex, excludeBookies, zonesToExclude); } if (bookiesToConsiderAfterExcludingZonesAndUDs.isEmpty()) { - LOG.error("Not enough bookies are available to replaceBookie : {} in ensemble : {} with excludeBookies {}.", - bookieToReplace, currentEnsemble, excludeBookies); + log.error() + .attr("bookieToReplace", bookieToReplace) + .attr("currentEnsemble", currentEnsemble) + .attr("excludeBookies", excludeBookies) + .log("Not enough bookies are available to replaceBookie"); throw new BKNotEnoughBookiesException(); } @@ -583,7 +592,10 @@ protected Set addDefaultFaultDomainBookies(Set excludeBookie if (node instanceof BookieNode) { comprehensiveExclusionBookiesSet.add(((BookieNode) node).getAddr()); } else { - LOG.error("found non-BookieNode: {} as leaf of defaultFaultDomain: {}", node, getDefaultFaultDomain()); + log.error() + .attr("node", node) + .attr("defaultFaultDomain", getDefaultFaultDomain()) + .log("Found non-BookieNode as leaf of defaultFaultDomain"); } } return comprehensiveExclusionBookiesSet; @@ -872,21 +884,24 @@ public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(List= desiredNumZonesPerWriteQuorumForThisEnsemble) { if (!validateMinUDsAreMaintained(numOfBookiesInZones, bookiesLocationInWriteSet)) { placementPolicyAdherence = PlacementPolicyAdherence.FAIL; - if (LOG.isDebugEnabled()) { - LOG.debug("in ensemble: {}, writeset starting at: {} doesn't maintain min of 2 UDs" - + " when there are multiple bookies from the same zone.", ensembleList, i); - } + + log.debug() + .attr("ensembleList", ensembleList) + .attr("i", i) + .log("in ensemble: writeset starting at: doesn't maintain min of 2 UDs" + + " when there are multiple bookies from the same zone."); + return placementPolicyAdherence; } } else { if (!validateMinUDsAreMaintained(numOfBookiesInZones, bookiesLocationInWriteSet)) { placementPolicyAdherence = PlacementPolicyAdherence.FAIL; - if (LOG.isDebugEnabled()) { - LOG.debug("in ensemble: {}, writeset starting at: {} doesn't maintain min of 2 UDs" - + " when there are multiple bookies from the same zone.", ensembleList, i); - } + + log.debug() + .attr("ensembleList", ensembleList) + .attr("i", i) + .log("in ensemble: writeset starting at: doesn't maintain min of 2 UDs" + + " when there are multiple bookies from the same zone."); + return placementPolicyAdherence; } if (placementPolicyAdherence == PlacementPolicyAdherence.MEETS_STRICT) { @@ -984,14 +1010,14 @@ public boolean areAckedBookiesAdheringToPlacementPolicy(Set ackedBooki } areAckedBookiesAdheringToPlacementPolicy = ((zonesOfAckedBookies .size() >= minNumZonesPerWriteQuorumForThisEnsemble) && (ackedBookies.size() >= ackQuorumSize)); - if (LOG.isDebugEnabled()) { - LOG.debug( - "areAckedBookiesAdheringToPlacementPolicy returning {}, because number of ackedBookies = {}," - + " number of Zones of ackedbookies = {}," - + " number of minNumZonesPerWriteQuorumForThisEnsemble = {}", - areAckedBookiesAdheringToPlacementPolicy, ackedBookies.size(), zonesOfAckedBookies.size(), - minNumZonesPerWriteQuorumForThisEnsemble); - } + + log.debug() + .attr("areAckedBookiesAdheringToPlacementPolicy", areAckedBookiesAdheringToPlacementPolicy) + .attr("size", ackedBookies.size()) + .attr("size", zonesOfAckedBookies.size()) + .attr("minNumZonesPerWriteQuorumForThisEnsemble", minNumZonesPerWriteQuorumForThisEnsemble) + .log("areAckedBookiesAdheringToPlacementPolicy"); + } finally { readLock.unlock(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java index 270f115d84b..f61575329cb 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java @@ -19,18 +19,17 @@ package org.apache.bookkeeper.client.impl; import java.util.Arrays; +import lombok.CustomLog; import org.apache.bookkeeper.client.LedgerHandle; import org.apache.bookkeeper.client.api.BKException.Code; import org.apache.bookkeeper.client.api.DigestType; import org.apache.bookkeeper.client.api.OpenBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Base class for open builders which does the mundane builder stuff. */ +@CustomLog public abstract class OpenBuilderBase implements OpenBuilder { - static final Logger LOG = LoggerFactory.getLogger(OpenBuilderBase.class); protected boolean recovery = false; protected long ledgerId = LedgerHandle.INVALID_LEDGER_ID; @@ -63,7 +62,7 @@ public OpenBuilder withDigestType(DigestType digestType) { protected int validate() { if (ledgerId < 0) { - LOG.error("invalid ledgerId {} < 0", ledgerId); + log.error().attr("ledgerId", ledgerId).log("invalid ledgerId < 0"); return Code.NoSuchLedgerExistsOnMetadataServerException; } return Code.OK; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractHierarchicalLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractHierarchicalLedgerManager.java index 4a1ad27bb5e..9775c38465d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractHierarchicalLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractHierarchicalLedgerManager.java @@ -23,6 +23,7 @@ import java.util.TreeSet; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.util.StringUtils; @@ -30,16 +31,13 @@ import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException.Code; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * An abstract class for managing hierarchical ledgers. */ +@CustomLog public abstract class AbstractHierarchicalLedgerManager extends AbstractZkLedgerManager { - private static final Logger LOG = LoggerFactory.getLogger(AbstractHierarchicalLedgerManager.class); - /** * Constructor. * @@ -67,8 +65,10 @@ public void processResult(int rc, String path, Object ctx) { finalCb.processResult(successRc, null, context); return; } else if (rc != Code.OK.intValue()) { - LOG.error("Error syncing path " + path + " when getting its children: ", - KeeperException.create(KeeperException.Code.get(rc), path)); + log.error() + .attr("path", path) + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Error syncing path when getting its children"); finalCb.processResult(failureRc, null, context); return; } @@ -82,8 +82,10 @@ public void processResult(int rc, String path, Object ctx, finalCb.processResult(successRc, null, context); return; } else if (rc != Code.OK.intValue()) { - LOG.error("Error polling hash nodes of " + path, - KeeperException.create(KeeperException.Code.get(rc), path)); + log.error() + .attr("path", path) + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Error polling hash nodes"); finalCb.processResult(failureRc, null, context); return; } @@ -190,7 +192,10 @@ protected NavigableSet ledgerListToSet(List ledgerNodes, String pa NavigableSet zkActiveLedgers = new TreeSet(); if (!path.startsWith(ledgerRootPath)) { - LOG.warn("Ledger path [{}] is not a valid path name, it should start with {}", path, ledgerRootPath); + log.warn() + .attr("path", path) + .attr("ledgerRootPath", ledgerRootPath) + .log("Ledger path is not a valid path name"); return zkActiveLedgers; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java index 59b17be922b..3a2d53a06d6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java @@ -33,6 +33,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.LedgerMetadataBuilder; import org.apache.bookkeeper.client.api.LedgerMetadata; @@ -62,16 +63,13 @@ import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Abstract ledger manager based on zookeeper, which provides common methods such as query zk nodes. */ +@CustomLog public abstract class AbstractZkLedgerManager implements LedgerManager, Watcher { - private static final Logger LOG = LoggerFactory.getLogger(AbstractZkLedgerManager.class); - @VisibleForTesting static final int ZK_CONNECT_BACKOFF_MS = 200; @@ -100,13 +98,11 @@ protected class ReadLedgerMetadataTask implements Runnable { @Override public void run() { if (null != listeners.get(ledgerId)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Re-read ledger metadata for {}.", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Re-read ledger metadata"); readLedgerMetadata(ledgerId, AbstractZkLedgerManager.this) .whenComplete((metadata, exception) -> handleMetadata(metadata, exception)); - } else if (LOG.isDebugEnabled()) { - LOG.debug("Ledger metadata listener for ledger {} is already removed.", ledgerId); + } else { + log.debug().attr("ledgerId", ledgerId).log("Ledger metadata listener is already removed"); } } @@ -114,9 +110,10 @@ private void handleMetadata(Versioned result, Throwable exceptio if (exception == null) { final Set listenerSet = listeners.get(ledgerId); if (null != listenerSet) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger metadata is changed for {} : {}.", ledgerId, result); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("metadata", result) + .log("Ledger metadata is changed"); scheduler.submit(() -> { synchronized (listenerSet) { for (LedgerMetadataListener listener : listenerSet) { @@ -130,10 +127,10 @@ private void handleMetadata(Versioned result, Throwable exceptio // the ledger is removed, do nothing Set listenerSet = listeners.remove(ledgerId); if (null != listenerSet) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removed ledger metadata listener set on ledger {} as its ledger is deleted : {}", - ledgerId, listenerSet.size()); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("listenerCount", listenerSet.size()) + .log("Removed ledger metadata listener set as ledger is deleted"); // notify `null` as indicator that a ledger is deleted // make this behavior consistent with `NodeDeleted` watched event. synchronized (listenerSet) { @@ -143,8 +140,10 @@ private void handleMetadata(Versioned result, Throwable exceptio } } } else { - LOG.warn("Failed on read ledger metadata of ledger {}: {}", - ledgerId, BKException.getExceptionCode(exception)); + log.warn() + .attr("ledgerId", ledgerId) + .attr("errorCode", BKException.getExceptionCode(exception)) + .log("Failed on read ledger metadata"); scheduler.schedule(this, ZK_CONNECT_BACKOFF_MS, TimeUnit.MILLISECONDS); } } @@ -165,9 +164,7 @@ protected class CancelWatchLedgerMetadataTask implements Runnable { public void run() { Set listeners = AbstractZkLedgerManager.this.listeners.get(ledgerId); if (!CollectionUtils.isEmpty(listeners)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Still watch ledgerId: {}, ignore this unwatch task.", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Still watching ledger, ignore this unwatch task"); return; } cancelMetadataWatch(ledgerId, AbstractZkLedgerManager.this); @@ -189,9 +186,7 @@ protected AbstractZkLedgerManager(AbstractConfiguration conf, ZooKeeper zk) { this.ledgerRootPath = ZKMetadataDriverBase.resolveZkLedgersRootPath(conf); this.scheduler = Executors .newSingleThreadScheduledExecutor(new DefaultThreadFactory("ZkLedgerManagerScheduler")); - if (LOG.isDebugEnabled()) { - LOG.debug("Using AbstractZkLedgerManager with root path : {}", ledgerRootPath); - } + log.debug().attr("ledgerRootPath", ledgerRootPath).log("Using AbstractZkLedgerManager"); } /** @@ -215,16 +210,14 @@ protected AbstractZkLedgerManager(AbstractConfiguration conf, ZooKeeper zk) { @Override public void process(WatchedEvent event) { - if (LOG.isDebugEnabled()) { - LOG.debug("Received watched event {} from zookeeper based ledger manager.", event); - } + log.debug().attr("event", event).log("Received watched event from zookeeper based ledger manager"); if (Event.EventType.None == event.getType()) { if (Event.KeeperState.Expired == event.getState()) { - LOG.info("ZooKeeper client expired on ledger manager."); + log.info("ZooKeeper client expired on ledger manager."); Set keySet = new HashSet(listeners.keySet()); for (Long lid : keySet) { scheduler.submit(new ReadLedgerMetadataTask(lid)); - LOG.info("Re-read ledger metadata for {} after zookeeper session expired.", lid); + log.info().attr("ledgerId", lid).log("Re-read ledger metadata after zookeeper session expired"); } } return; @@ -237,7 +230,10 @@ public void process(WatchedEvent event) { try { ledgerId = getLedgerId(event.getPath()); } catch (IOException ioe) { - LOG.info("Received invalid ledger path {} : ", event.getPath(), ioe); + log.info() + .attr("path", event.getPath()) + .exception(ioe) + .log("Received invalid ledger path"); return; } switch (event.getType()) { @@ -245,27 +241,29 @@ public void process(WatchedEvent event) { Set listenerSet = listeners.get(ledgerId); if (null != listenerSet) { synchronized (listenerSet){ - if (LOG.isDebugEnabled()) { - LOG.debug("Removed ledger metadata listeners on ledger {} : {}", - ledgerId, listenerSet); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("listeners", listenerSet) + .log("Removed ledger metadata listeners on ledger"); for (LedgerMetadataListener l : listenerSet) { l.onChanged(ledgerId, null); } listeners.remove(ledgerId, listenerSet); } - } else if (LOG.isDebugEnabled()) { - LOG.debug("No ledger metadata listeners to remove from ledger {} after it's deleted.", - ledgerId); + } else { + log.debug() + .attr("ledgerId", ledgerId) + .log("No ledger metadata listeners to remove after ledger deleted"); } break; case NodeDataChanged: new ReadLedgerMetadataTask(ledgerId).run(); break; default: - if (LOG.isDebugEnabled()) { - LOG.debug("Received event {} on {}.", event.getType(), event.getPath()); - } + log.debug() + .attr("eventType", event.getType()) + .attr("path", event.getPath()) + .log("Received event"); break; } } @@ -291,8 +289,9 @@ public void processResult(int rc, String path, Object ctx, String name) { if (rc == Code.OK.intValue()) { promise.complete(new Versioned<>(metadata, new LongVersion(0))); } else if (rc == Code.NODEEXISTS.intValue()) { - LOG.info("Ledger metadata for {} appears to already exist, checking cToken", - ledgerId); + log.info() + .attr("ledgerId", ledgerId) + .log("Ledger metadata appears to already exist, checking cToken"); if (metadata.getMetadataFormatVersion() > 2) { CompletableFuture> readFuture = readLedgerMetadata(ledgerId); readFuture.handle((readMetadata, exception) -> { @@ -300,7 +299,9 @@ public void processResult(int rc, String path, Object ctx, String name) { if (readMetadata.getValue().getCToken() == cToken) { FutureUtils.complete(promise, new Versioned<>(metadata, new LongVersion(0))); } else { - LOG.warn("Failed to create ledger metadata for {} which already exists", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Failed to create ledger metadata which already exists"); promise.completeExceptionally(new BKException.BKLedgerExistException()); } } else if (exception instanceof KeeperException.NoNodeException) { @@ -310,23 +311,32 @@ public void processResult(int rc, String path, Object ctx, String name) { // and then it got removed. It's also possible that we actually lost the race // and then it got removed. I'd argue that returning an error here is the right // path since recreating it is likely to cause problems. - LOG.warn("Ledger {} appears to have already existed and then been removed, failing" - + " with LedgerExistException", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Ledger appears to have already existed" + + " and then been removed, failing" + + " with LedgerExistException"); promise.completeExceptionally(new BKException.BKLedgerExistException()); } else { - LOG.error("Could not validate node for ledger {} after LedgerExistsException", ledgerId, - exception); + log.error() + .attr("ledgerId", ledgerId) + .exception(exception) + .log("Could not validate node for ledger after LedgerExistsException"); promise.completeExceptionally(new BKException.ZKException(exception)); } return null; }); } else { - LOG.warn("Failed to create ledger metadata for {} which already exists", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Failed to create ledger metadata which already exists"); promise.completeExceptionally(new BKException.BKLedgerExistException()); } } else { - LOG.error("Could not create node for ledger {}", ledgerId, - KeeperException.create(Code.get(rc), path)); + log.error() + .attr("ledgerId", ledgerId) + .exception(KeeperException.create(Code.get(rc), path)) + .log("Could not create node for ledger"); promise.completeExceptionally( new BKException.ZKException(KeeperException.create(Code.get(rc), path))); } @@ -351,12 +361,14 @@ public CompletableFuture removeLedgerMetadata(final long ledgerId, final V CompletableFuture promise = new CompletableFuture<>(); int znodeVersion = -1; if (Version.NEW == version) { - LOG.error("Request to delete ledger {} metadata with version set to the initial one", ledgerId); + log.error() + .attr("ledgerId", ledgerId) + .log("Request to delete ledger metadata with version set to the initial one"); promise.completeExceptionally(new BKException.BKMetadataVersionException()); return promise; } else if (Version.ANY != version) { if (!(version instanceof LongVersion)) { - LOG.info("Not an instance of ZKVersion: {}", ledgerId); + log.info().attr("ledgerId", ledgerId).log("Not an instance of ZKVersion"); promise.completeExceptionally(new BKException.BKMetadataVersionException()); return promise; } else { @@ -368,20 +380,21 @@ public CompletableFuture removeLedgerMetadata(final long ledgerId, final V @Override public void processResult(int rc, String path, Object ctx) { if (rc == KeeperException.Code.NONODE.intValue()) { - LOG.warn("Ledger node does not exist in ZooKeeper: ledgerId={}. Returning success.", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Ledger node does not exist in ZooKeeper. Returning success."); FutureUtils.complete(promise, null); } else if (rc == KeeperException.Code.OK.intValue()) { // removed listener on ledgerId Set listenerSet = listeners.remove(ledgerId); if (null != listenerSet) { - if (LOG.isDebugEnabled()) { - LOG.debug( - "Remove registered ledger metadata listeners on ledger {} after ledger is deleted.", - ledgerId); - } - } else if (LOG.isDebugEnabled()) { - LOG.debug("No ledger metadata listeners to remove from ledger {} when it's being deleted.", - ledgerId); + log.debug() + .attr("ledgerId", ledgerId) + .log("Remove registered ledger metadata listeners after ledger is deleted"); + } else { + log.debug() + .attr("ledgerId", ledgerId) + .log("No ledger metadata listeners to remove when ledger is being deleted"); } FutureUtils.complete(promise, null); } else { @@ -407,9 +420,10 @@ public void processResult(int rc, String path, Object ctx) { @Override public void registerLedgerMetadataListener(long ledgerId, LedgerMetadataListener listener) { if (null != listener) { - if (LOG.isDebugEnabled()) { - LOG.debug("Registered ledger metadata listener {} on ledger {}.", listener, ledgerId); - } + log.debug() + .attr("listener", listener) + .attr("ledgerId", ledgerId) + .log("Registered ledger metadata listener"); Set listenerSet = listeners.get(ledgerId); if (listenerSet == null) { Set newListenerSet = new HashSet(); @@ -433,9 +447,10 @@ public void unregisterLedgerMetadataListener(long ledgerId, LedgerMetadataListen if (listenerSet != null) { synchronized (listenerSet) { if (listenerSet.remove(listener)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Unregistered ledger metadata listener {} on ledger {}.", listener, ledgerId); - } + log.debug() + .attr("listener", listener) + .attr("ledgerId", ledgerId) + .log("Unregistered ledger metadata listener"); } if (listenerSet.isEmpty()) { listeners.remove(ledgerId, listenerSet); @@ -450,13 +465,13 @@ private void cancelMetadataWatch(long ledgerId, Watcher watcher) { @Override public void processResult(int rc, String path, Object o) { if (rc != KeeperException.Code.OK.intValue()) { - LOG.error("Cancel watch ledger {} metadata failed.", ledgerId, - KeeperException.create(KeeperException.Code.get(rc), path)); + log.error() + .attr("ledgerId", ledgerId) + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Cancel watch ledger metadata failed"); return; } - if (LOG.isDebugEnabled()) { - LOG.debug("Cancel watch ledger {} metadata succeed.", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Cancel watch ledger metadata succeed"); } }, null); } @@ -472,22 +487,26 @@ protected CompletableFuture> readLedgerMetadata(final @Override public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) { if (rc == KeeperException.Code.NONODE.intValue()) { - if (LOG.isDebugEnabled()) { - LOG.debug("No such ledger: " + ledgerId, - KeeperException.create(KeeperException.Code.get(rc), path)); - } + log.debug() + .attr("ledgerId", ledgerId) + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("No such ledger"); promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException()); return; } if (rc != KeeperException.Code.OK.intValue()) { - LOG.error("Could not read metadata for ledger: " + ledgerId, - KeeperException.create(KeeperException.Code.get(rc), path)); + log.error() + .attr("ledgerId", ledgerId) + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Could not read metadata for ledger"); promise.completeExceptionally( new BKException.ZKException(KeeperException.create(Code.get(rc), path))); return; } if (stat == null) { - LOG.error("Could not parse ledger metadata for ledger: {}. Stat object is null", ledgerId); + log.error() + .attr("ledgerId", ledgerId) + .log("Could not parse ledger metadata for ledger. Stat object is null"); promise.completeExceptionally(new BKException.ZKException( new Exception("Could not parse ledger metadata for ledger: " + ledgerId + " . Stat object is null").fillInStackTrace())); @@ -499,7 +518,10 @@ public void processResult(int rc, String path, Object ctx, byte[] data, Stat sta LedgerMetadata metadata = serDe.parseConfig(data, ledgerId, Optional.of(stat.getCtime())); promise.complete(new Versioned<>(metadata, version)); } catch (Throwable t) { - LOG.error("Could not parse ledger metadata for ledger: {}", ledgerId, t); + log.error() + .attr("ledgerId", ledgerId) + .exception(t) + .log("Could not parse ledger metadata for ledger"); promise.completeExceptionally(new BKException.ZKException( new Exception("Could not parse ledger metadata for ledger: " + ledgerId, t).fillInStackTrace())); @@ -537,10 +559,12 @@ public void processResult(int rc, String path, Object ctx, Stat stat) { // update metadata version promise.complete(new Versioned<>(metadata, new LongVersion(stat.getVersion()))); } else if (KeeperException.Code.NONODE.intValue() == rc) { - LOG.warn("Ledger node does not exist in ZooKeeper: ledgerId={}", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Ledger node does not exist in ZooKeeper"); promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException()); } else { - LOG.warn("Conditional update ledger metadata failed: {}", KeeperException.Code.get(rc)); + log.warn() + .attr("errorCode", KeeperException.Code.get(rc)) + .log("Conditional update ledger metadata failed"); promise.completeExceptionally( new BKException.ZKException(KeeperException.create(Code.get(rc), path))); } @@ -591,9 +615,7 @@ public void operationComplete(int rc, List ledgerNodes) { } Set zkActiveLedgers = ledgerListToSet(ledgerNodes, path); - if (LOG.isDebugEnabled()) { - LOG.debug("Processing ledgers: {}", zkActiveLedgers); - } + log.debug().attr("ledgers", zkActiveLedgers).log("Processing ledgers"); // no ledgers found, return directly if (zkActiveLedgers.size() == 0) { @@ -675,7 +697,7 @@ protected NavigableSet ledgerListToSet(List ledgerNodes, String pa // convert the node path to ledger id according to different ledger manager implementation zkActiveLedgers.add(getLedgerId(path + "/" + ledgerNode)); } catch (IOException e) { - LOG.warn("Error extracting ledgerId from ZK ledger node: " + ledgerNode); + log.warn().attr("ledgerNode", ledgerNode).log("Error extracting ledgerId from ZK ledger node"); // This is a pretty bad error as it indicates a ledger node in ZK // has an incorrect format. For now just continue and consider // this as a non-existent ledger. @@ -690,7 +712,7 @@ public void close() { try { scheduler.shutdown(); } catch (Exception e) { - LOG.warn("Error when closing zookeeper based ledger manager: ", e); + log.warn().exception(e).log("Error when closing zookeeper based ledger manager"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/FlatLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/FlatLedgerManager.java index a40a775ed41..5ce6a0dcc08 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/FlatLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/FlatLedgerManager.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.NoSuchElementException; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.util.StringUtils; @@ -28,8 +29,6 @@ import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Manage all ledgers in a single zk node. @@ -39,9 +38,9 @@ * Each ledger node is prefixed with 'L'. *

*/ +@CustomLog class FlatLedgerManager extends AbstractZkLedgerManager { - static final Logger LOG = LoggerFactory.getLogger(FlatLedgerManager.class); // path prefix to store ledger znodes private final String ledgerPrefix; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java index d5c0fa1ff9f..b12822c7aa9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java @@ -18,14 +18,13 @@ package org.apache.bookkeeper.meta; import java.io.IOException; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.meta.LedgerManager.LedgerRangeIterator; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.util.StringUtils; import org.apache.zookeeper.AsyncCallback.VoidCallback; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HierarchicalLedgerManager makes use of both LongHierarchicalLedgerManager and LegacyHierarchicalLedgerManager @@ -39,8 +38,8 @@ * @see LongHierarchicalLedgerManager * @see LegacyHierarchicalLedgerManager */ +@CustomLog class HierarchicalLedgerManager extends AbstractHierarchicalLedgerManager { - static final Logger LOG = LoggerFactory.getLogger(HierarchicalLedgerManager.class); LegacyHierarchicalLedgerManager legacyLM; LongHierarchicalLedgerManager longLM; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java index 5aa0dd7c339..bcbbf8473a1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java @@ -39,6 +39,7 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.client.LedgerMetadataBuilder; import org.apache.bookkeeper.client.LedgerMetadataUtils; import org.apache.bookkeeper.client.api.DigestType; @@ -46,14 +47,12 @@ import org.apache.bookkeeper.client.api.LedgerMetadata.State; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Serialization and deserialization for LedgerMetadata. */ +@CustomLog public class LedgerMetadataSerDe { - private static final Logger log = LoggerFactory.getLogger(LedgerMetadataSerDe.class); /** * Text based manual serialization. @@ -140,15 +139,13 @@ public byte[] serialize(LedgerMetadata metadata) throws IOException { default: throw new IllegalArgumentException("Invalid format version " + formatVersion); } - if (log.isDebugEnabled()) { - String serializedStr; - if (formatVersion > METADATA_FORMAT_VERSION_2) { - serializedStr = Base64.getEncoder().encodeToString(serialized); - } else { - serializedStr = new String(serialized, UTF_8); - } - log.debug("Serialized with format {}: {}", formatVersion, serializedStr); - } + final byte[] finalSerialized = serialized; + log.debug(e -> e + .attr("formatVersion", formatVersion) + .attr("serialized", formatVersion > METADATA_FORMAT_VERSION_2 + ? Base64.getEncoder().encodeToString(finalSerialized) + : new String(finalSerialized, UTF_8)) + .log("Serialized metadata")); return serialized; } @@ -339,18 +336,16 @@ private static void serializePassword(byte[] password, LedgerMetadataFormat.Buil public LedgerMetadata parseConfig(byte[] bytes, long ledgerId, Optional metadataStoreCtime) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Deserializing {}", Base64.getEncoder().encodeToString(bytes)); - } + log.debug(e -> e + .attr("serialized", Base64.getEncoder().encodeToString(bytes)) + .log("Deserializing metadata")); try (ByteArrayInputStream is = new ByteArrayInputStream(bytes)) { int metadataFormatVersion = readHeader(is); - if (log.isDebugEnabled()) { - String contentStr = ""; - if (metadataFormatVersion <= METADATA_FORMAT_VERSION_2) { - contentStr = ", content: " + new String(bytes, UTF_8); - } - log.debug("Format version {} detected{}", metadataFormatVersion, contentStr); - } + log.debug(e -> e + .attr("formatVersion", metadataFormatVersion) + .attr("content", metadataFormatVersion <= METADATA_FORMAT_VERSION_2 + ? new String(bytes, UTF_8) : "") + .log("Format version detected")); switch (metadataFormatVersion) { case METADATA_FORMAT_VERSION_3: diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LegacyHierarchicalLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LegacyHierarchicalLedgerManager.java index 52bd4588817..7bc6789b563 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LegacyHierarchicalLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LegacyHierarchicalLedgerManager.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.NavigableSet; import java.util.NoSuchElementException; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.util.StringUtils; @@ -31,8 +32,6 @@ import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Hierarchical Ledger Manager which manages ledger meta in zookeeper using 2-level hierarchical znodes. @@ -45,10 +44,9 @@ * (ledgersRootPath)/00/0000/L0001. So each znode could have at most 10000 ledgers, which avoids * errors during garbage collection due to lists of children that are too long. */ +@CustomLog class LegacyHierarchicalLedgerManager extends AbstractHierarchicalLedgerManager { - static final Logger LOG = LoggerFactory.getLogger(LegacyHierarchicalLedgerManager.class); - static final String IDGEN_ZNODE = "idgen"; private static final String MAX_ID_SUFFIX = "9999"; private static final String MIN_ID_SUFFIX = "0000"; @@ -275,10 +273,11 @@ LedgerRange getLedgerRangeByLevel(final String level1, final String level2) throw new IOException("Error when get child nodes from zk", e); } NavigableSet zkActiveLedgers = ledgerListToSet(ledgerNodes, nodePath); - if (LOG.isDebugEnabled()) { - LOG.debug("All active ledgers from ZK for hash node " - + level1 + "/" + level2 + " : " + zkActiveLedgers); - } + log.debug() + .attr("level1", level1) + .attr("level2", level2) + .attr("ledgers", zkActiveLedgers) + .log("All active ledgers from ZK for hash node"); return new LedgerRange(zkActiveLedgers.subSet(getStartLedgerIdByLevel(level1, level2), true, getEndLedgerIdByLevel(level1, level2), true)); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongHierarchicalLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongHierarchicalLedgerManager.java index ca9216d8baa..bba325b9d63 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongHierarchicalLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongHierarchicalLedgerManager.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.util.StringUtils; @@ -32,8 +33,6 @@ import org.apache.zookeeper.AsyncCallback.VoidCallback; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooKeeper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * LongHierarchical Ledger Manager which manages ledger meta in zookeeper using 5-level hierarchical znodes. @@ -55,10 +54,9 @@ * 0001, which is stored in (ledgersRootPath)/000/0000/0000/0000/L0001. So each znode could have at most * 10000 ledgers, which avoids errors during garbage collection due to lists of children that are too long. */ +@CustomLog class LongHierarchicalLedgerManager extends AbstractHierarchicalLedgerManager { - static final Logger LOG = LoggerFactory.getLogger(LongHierarchicalLedgerManager.class); - static final String IDGEN_ZNODE = "idgen-long"; /** @@ -166,9 +164,7 @@ List getChildrenAt(String path) throws IOException { Collections.sort(children); return children; } catch (KeeperException.NoNodeException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("NoNodeException at path {}, assumed race with deletion", path); - } + log.debug().attr("path", path).log("NoNodeException at path, assumed race with deletion"); return new ArrayList<>(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -186,9 +182,10 @@ class LeafIterator implements LedgerRangeIterator { LeafIterator(String path) throws IOException { List ledgerLeafNodes = getChildrenAt(path); Set ledgerIds = ledgerListToSet(ledgerLeafNodes, path); - if (LOG.isDebugEnabled()) { - LOG.debug("All active ledgers from ZK for hash node {}: {}", path, ledgerIds); - } + log.debug() + .attr("path", path) + .attr("ledgerIds", ledgerIds) + .log("All active ledgers from ZK for hash node"); if (!ledgerIds.isEmpty()) { range = new LedgerRange(ledgerIds); } // else, hasNext() should return false so that advance will skip us and move on diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongZkLedgerIdGenerator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongZkLedgerIdGenerator.java index 3e9a0611c56..2ddce54c630 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongZkLedgerIdGenerator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LongZkLedgerIdGenerator.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.util.ZkUtils; @@ -31,8 +32,6 @@ import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ZooKeeper based ledger id generator class, which using EPHEMERAL_SEQUENTIAL @@ -54,8 +53,8 @@ *

The reason for treating ids which are less than Integer.MAX_INT differently is to maintain backwards * compatibility. This is a drop-in replacement for ZkLedgerIdGenerator. */ +@CustomLog public class LongZkLedgerIdGenerator implements LedgerIdGenerator { - private static final Logger LOG = LoggerFactory.getLogger(LongZkLedgerIdGenerator.class); private ZooKeeper zk; private String ledgerIdGenPath; private ZkLedgerIdGenerator shortIdGen; @@ -99,20 +98,21 @@ public void operationComplete(int rc, Long result) { Long newHighBits = highBits + 1; createHOBPathAndGenerateId(ledgerPrefix, newHighBits.intValue(), cb); } catch (KeeperException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.ZKException, null); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.InterruptedException, null); } catch (IOException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.IllegalOpException, null); } } else { - LOG.error("Failed to create long ledger ID path", - KeeperException.create(KeeperException.Code.get(rc))); + log.error() + .exception(KeeperException.create(KeeperException.Code.get(rc))) + .log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.ZKException, null); } } @@ -132,16 +132,12 @@ private String formatHalfId(int i) { private void createHOBPathAndGenerateId(String ledgerPrefix, int hob, final GenericCallback cb) throws KeeperException, InterruptedException, IOException { try { - if (LOG.isDebugEnabled()) { - LOG.debug("Creating HOB path: {}", ledgerPrefix + formatHalfId(hob)); - } + log.debug().attr("path", ledgerPrefix + formatHalfId(hob)).log("Creating HOB path"); zk.create(ledgerPrefix + formatHalfId(hob), new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } catch (KeeperException.NodeExistsException e) { // It's fine if we lost a race to create the node (NodeExistsException). // All other exceptions should continue unwinding. - if (LOG.isDebugEnabled()) { - LOG.debug("Tried to create High-order-bits node, but it already existed!", e); - } + log.debug().exception(e).log("Tried to create High-order-bits node, but it already existed"); } // We just created a new HOB directory. Invalidate the directory cache invalidateDirectoryCache(); @@ -213,16 +209,12 @@ private void generateLongLedgerId(final GenericCallback cb) throws KeeperE for (int i = 0; i < highOrderDirs.length - 3; i++) { String path = ledgerPrefix + formatHalfId(((Long) highOrderDirs[i]).intValue()); - if (LOG.isDebugEnabled()) { - LOG.debug("DELETING HIGH ORDER DIR: {}", path); - } + log.debug().attr("path", path).log("Deleting high order dir"); try { zk.delete(path, 0); } catch (KeeperException e) { // We don't care if we fail. Just warn about it. - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to delete {}", path); - } + log.debug().attr("path", path).log("Failed to delete"); } } } @@ -237,16 +229,16 @@ public void processResult(int rc, String path, Object ctx, String name) { setLedgerIdGenPathStatus(HighOrderLedgerIdGenPathStatus.PRESENT); generateLongLedgerId(cb); } catch (KeeperException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); setLedgerIdGenPathStatus(HighOrderLedgerIdGenPathStatus.UNKNOWN); cb.operationComplete(BKException.Code.ZKException, null); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); setLedgerIdGenPathStatus(HighOrderLedgerIdGenPathStatus.UNKNOWN); cb.operationComplete(BKException.Code.InterruptedException, null); } catch (IOException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); setLedgerIdGenPathStatus(HighOrderLedgerIdGenPathStatus.UNKNOWN); cb.operationComplete(BKException.Code.IllegalOpException, null); } @@ -316,14 +308,14 @@ public void operationComplete(int rc, Long result) { generateLongLedgerId(cb); } } catch (KeeperException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.ZKException, null); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.InterruptedException, null); } catch (IOException e) { - LOG.error("Failed to create long ledger ID path", e); + log.error().exception(e).log("Failed to create long ledger ID path"); cb.operationComplete(BKException.Code.IllegalOpException, null); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java index f4ccd519de0..482b0520a57 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java @@ -37,7 +37,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.common.concurrent.FutureUtils; @@ -73,8 +73,6 @@ import org.apache.zookeeper.ZKUtil; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * MetaStore Based Ledger Manager Factory. @@ -84,11 +82,9 @@ * * @deprecated since 4.7.0 */ -@Slf4j +@CustomLog public class MSLedgerManagerFactory extends AbstractZkLedgerManagerFactory { - private static final Logger LOG = LoggerFactory.getLogger(MSLedgerManagerFactory.class); - private static final int MS_CONNECT_BACKOFF_MS = 200; public static final int CUR_VERSION = 1; @@ -161,7 +157,7 @@ static SortedSet entries2Ledgers(Iterator entries) { try { ledgers.add(key2LedgerId(item.getKey())); } catch (NumberFormatException nfe) { - LOG.warn("Found invalid ledger key {}", item.getKey()); + log.warn().attr("key", item.getKey()).log("Found invalid ledger key"); } } return ledgers; @@ -238,15 +234,11 @@ protected class ReadLedgerMetadataTask implements Runnable { @Override public void run() { if (null != listeners.get(ledgerId)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Re-read ledger metadata for {}.", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Re-read ledger metadata"); readLedgerMetadata(ledgerId).whenComplete( (metadata, exception) -> handleMetadata(metadata, exception)); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger metadata listener for ledger {} is already removed.", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ledger metadata listener is already removed"); } } @@ -254,9 +246,10 @@ private void handleMetadata(Versioned metadata, Throwable except if (exception == null) { final Set listenerSet = listeners.get(ledgerId); if (null != listenerSet) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger metadata is changed for {} : {}.", ledgerId, metadata.getValue()); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("metadata", metadata.getValue()) + .log("Ledger metadata is changed"); scheduler.submit(() -> { synchronized (listenerSet) { for (LedgerMetadataListener listener : listenerSet) { @@ -270,14 +263,16 @@ private void handleMetadata(Versioned metadata, Throwable except // the ledger is removed, do nothing Set listenerSet = listeners.remove(ledgerId); if (null != listenerSet) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removed ledger metadata listener set on ledger {} as its ledger is deleted : {}", - ledgerId, listenerSet.size()); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("listenerCount", listenerSet.size()) + .log("Removed ledger metadata listener set as ledger is deleted"); } } else { - LOG.warn("Failed on read ledger metadata of ledger {}: {}", - ledgerId, BKException.getExceptionCode(exception)); + log.warn() + .attr("ledgerId", ledgerId) + .attr("errorCode", BKException.getExceptionCode(exception)) + .log("Failed on read ledger metadata"); scheduler.schedule(this, MS_CONNECT_BACKOFF_MS, TimeUnit.MILLISECONDS); } } @@ -292,7 +287,10 @@ private void handleMetadata(Versioned metadata, Throwable except try { ledgerTable = metastore.createScannableTable(TABLE_NAME); } catch (MetastoreException mse) { - LOG.error("Failed to instantiate table " + TABLE_NAME + " in metastore " + metastore.getName()); + log.error() + .attr("table", TABLE_NAME) + .attr("metastore", metastore.getName()) + .log("Failed to instantiate table in metastore"); throw new RuntimeException("Failed to instantiate table " + TABLE_NAME + " in metastore " + metastore.getName()); } @@ -326,7 +324,7 @@ public void process(MSWatchedEvent e){ break; default: - LOG.warn("Unknown type: {}", e.getType()); + log.warn().attr("type", e.getType()).log("Unknown type"); break; } } @@ -334,7 +332,10 @@ public void process(MSWatchedEvent e){ @Override public void registerLedgerMetadataListener(long ledgerId, LedgerMetadataListener listener) { if (null != listener) { - LOG.info("Registered ledger metadata listener {} on ledger {}.", listener, ledgerId); + log.info() + .attr("listener", listener) + .attr("ledgerId", ledgerId) + .log("Registered ledger metadata listener"); Set listenerSet = listeners.get(ledgerId); if (listenerSet == null) { Set newListenerSet = new HashSet(); @@ -358,7 +359,10 @@ public void unregisterLedgerMetadataListener(long ledgerId, LedgerMetadataListen if (listenerSet != null) { synchronized (listenerSet) { if (listenerSet.remove(listener)) { - LOG.info("Unregistered ledger metadata listener {} on ledger {}.", listener, ledgerId); + log.info() + .attr("listener", listener) + .attr("ledgerId", ledgerId) + .log("Unregistered ledger metadata listener"); } if (listenerSet.isEmpty()) { listeners.remove(ledgerId, listenerSet); @@ -372,7 +376,7 @@ public void close() { try { scheduler.shutdown(); } catch (Exception e) { - LOG.warn("Error when closing MsLedgerManager : ", e); + log.warn().exception(e).log("Error when closing MsLedgerManager"); } ledgerTable.close(); } @@ -391,9 +395,10 @@ public void complete(int rc, Version version, Object ctx) { promise.completeExceptionally(new BKException.MetaStoreException()); return; } - if (LOG.isDebugEnabled()) { - LOG.debug("Create ledger {} with version {} successfully.", lid, version); - } + log.debug() + .attr("ledgerId", lid) + .attr("version", version) + .log("Create ledger successfully"); promise.complete(new Versioned<>(metadata, version)); } }; @@ -418,7 +423,7 @@ public CompletableFuture removeLedgerMetadata(final long ledgerId, final V public void complete(int rc, Void value, Object ctx) { int bkRc; if (MSException.Code.NoKey.getCode() == rc) { - LOG.warn("Ledger entry does not exist in meta table: ledgerId={}", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Ledger entry does not exist in meta table"); promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException()); } else if (MSException.Code.OK.getCode() == rc) { FutureUtils.complete(promise, null); @@ -439,14 +444,18 @@ public CompletableFuture> readLedgerMetadata(final lon @Override public void complete(int rc, Versioned value, Object ctx) { if (MSException.Code.NoKey.getCode() == rc) { - LOG.error("No ledger metadata found for ledger " + ledgerId + " : ", - MSException.create(MSException.Code.get(rc), "No key " + key + " found.")); + log.error() + .attr("ledgerId", ledgerId) + .exception(MSException.create(MSException.Code.get(rc), "No key " + key + " found.")) + .log("No ledger metadata found"); promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException()); return; } if (MSException.Code.OK.getCode() != rc) { - LOG.error("Could not read metadata for ledger " + ledgerId + " : ", - MSException.create(MSException.Code.get(rc), "Failed to get key " + key)); + log.error() + .attr("ledgerId", ledgerId) + .exception(MSException.create(MSException.Code.get(rc), "Failed to get key " + key)) + .log("Could not read metadata for ledger"); promise.completeExceptionally(new BKException.MetaStoreException()); return; } @@ -455,7 +464,10 @@ public void complete(int rc, Versioned value, Object ctx) { value.getValue().getField(META_FIELD), ledgerId, Optional.empty()); promise.complete(new Versioned<>(metadata, value.getVersion())); } catch (IOException e) { - LOG.error("Could not parse ledger metadata for ledger " + ledgerId + " : ", e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Could not parse ledger metadata for ledger"); promise.completeExceptionally(new BKException.MetaStoreException()); } } @@ -479,25 +491,29 @@ public CompletableFuture> writeLedgerMetadata(long led Value data = new Value().setField(META_FIELD, bytes); - if (LOG.isDebugEnabled()) { - LOG.debug("Writing ledger {} metadata, version {}", new Object[] { ledgerId, currentVersion }); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("version", currentVersion) + .log("Writing ledger metadata"); final String key = ledgerId2Key(ledgerId); MetastoreCallback msCallback = new MetastoreCallback() { @Override public void complete(int rc, Version version, Object ctx) { if (MSException.Code.BadVersion.getCode() == rc) { - LOG.info("Bad version provided to update metadata for ledger {}", ledgerId); + log.info().attr("ledgerId", ledgerId).log("Bad version provided to update metadata for ledger"); promise.completeExceptionally(new BKException.BKMetadataVersionException()); } else if (MSException.Code.NoKey.getCode() == rc) { - LOG.warn("Ledger {} doesn't exist when writing its ledger metadata.", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Ledger doesn't exist when writing its ledger metadata"); promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException()); } else if (MSException.Code.OK.getCode() == rc) { promise.complete(new Versioned<>(metadata, version)); } else { - LOG.warn("Conditional update ledger metadata failed: ", - MSException.create(MSException.Code.get(rc), "Failed to put key " + key)); + log.warn() + .exception(MSException.create(MSException.Code.get(rc), "Failed to put key " + key)) + .log("Conditional update ledger metadata failed"); promise.completeExceptionally(new BKException.MetaStoreException()); } } @@ -559,7 +575,7 @@ public void complete(int rc, Iterator entries, Object ctx) { try { ledgers.add(key2LedgerId(item.getKey())); } catch (NumberFormatException nfe) { - LOG.warn("Found invalid ledger key {}", item.getKey()); + log.warn().attr("key", item.getKey()).log("Found invalid ledger key"); } } @@ -578,8 +594,9 @@ public void complete(int rc, Iterator entries, Object ctx) { @Override public void processResult(int rc, String path, Object ctx) { if (successRc != rc) { - LOG.error("Failed when processing range " - + rangeToString(startLedger, true, endLedger, true)); + log.error() + .attr("range", rangeToString(startLedger, true, endLedger, true)) + .log("Failed when processing range"); finalCb.processResult(failureRc, null, context); return; } @@ -602,7 +619,7 @@ class MSLedgerRangeIterator implements LedgerRangeIterator { @Override public void complete(int rc, MetastoreCursor newCursor, Object ctx) { if (MSException.Code.OK.getCode() != rc) { - LOG.error("Error opening cursor for ledger range iterator {}", rc); + log.error().attr("rc", rc).log("Error opening cursor for ledger range iterator"); } else { cursor = newCursor; } @@ -617,7 +634,7 @@ public boolean hasNext() throws IOException { try { openCursorLatch.await(); } catch (InterruptedException ie) { - LOG.error("Interrupted waiting for cursor to open", ie); + log.error().exception(ie).log("Interrupted waiting for cursor to open"); Thread.currentThread().interrupt(); throw new IOException("Interrupted waiting to read range", ie); } @@ -637,7 +654,7 @@ public LedgerRange next() throws IOException { } return new LedgerRange(ledgerIds); } catch (MSException mse) { - LOG.error("Exception occurred reading from metastore", mse); + log.error().exception(mse).log("Exception occurred reading from metastore"); throw new IOException("Couldn't read from metastore", mse); } } @@ -763,7 +780,7 @@ public void format(AbstractConfiguration conf, LayoutManager layoutManager) } catch (MSException mse) { throw new IOException("Exception when cleaning up table " + TABLE_NAME, mse); } - LOG.info("Finished cleaning up table {}.", TABLE_NAME); + log.info().attr("table", TABLE_NAME).log("Finished cleaning up table"); // Delete and recreate the LAYOUT information. Class factoryClass; try { @@ -790,8 +807,10 @@ public boolean validateAndNukeExistingCluster(AbstractConfiguration conf, Lay List ledgersRootPathChildrenList = zk.getChildren(zkLedgersRootPath, false); for (String ledgersRootPathChildren : ledgersRootPathChildrenList) { if ((!MsLedgerManager.isSpecialZnode(ledgersRootPathChildren))) { - log.error("Found unexpected znode : {} under ledgersRootPath : {} so exiting nuke operation", - ledgersRootPathChildren, zkLedgersRootPath); + log.error() + .attr("znode", ledgersRootPathChildren) + .attr("ledgersRootPath", zkLedgersRootPath) + .log("Found unexpected znode under ledgersRootPath, exiting nuke operation"); return false; } } @@ -805,8 +824,10 @@ public boolean validateAndNukeExistingCluster(AbstractConfiguration conf, Lay if (MsLedgerManager.isSpecialZnode(ledgersRootPathChildren)) { ZKUtil.deleteRecursive(zk, zkLedgersRootPath + "/" + ledgersRootPathChildren); } else { - log.error("Found unexpected znode : {} under ledgersRootPath : {} so exiting nuke operation", - ledgersRootPathChildren, zkLedgersRootPath); + log.error() + .attr("znode", ledgersRootPathChildren) + .attr("ledgersRootPath", zkLedgersRootPath) + .log("Found unexpected znode under ledgersRootPath, exiting nuke operation"); return false; } } @@ -814,8 +835,10 @@ public boolean validateAndNukeExistingCluster(AbstractConfiguration conf, Lay // finally deleting the ledgers rootpath zk.delete(zkLedgersRootPath, -1); - log.info("Successfully nuked existing cluster, ZKServers: {} ledger root path: {}", - zkServers, zkLedgersRootPath); + log.info() + .attr("zkServers", zkServers) + .attr("ledgerRootPath", zkLedgersRootPath) + .log("Successfully nuked existing cluster"); return true; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerIdGenerator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerIdGenerator.java index 852c88a4ccd..4db55c62753 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerIdGenerator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerIdGenerator.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.util.ZkUtils; @@ -29,8 +30,6 @@ import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ZooKeeper based ledger id generator class, which using EPHEMERAL_SEQUENTIAL @@ -39,8 +38,8 @@ * (zero) padding, i.e. "<path>0000000001", so ledger id space is * fundamentally limited to 9 billion. */ +@CustomLog public class ZkLedgerIdGenerator implements LedgerIdGenerator { - static final Logger LOG = LoggerFactory.getLogger(ZkLedgerIdGenerator.class); static final String LEDGER_ID_GEN_PREFIX = "ID-"; @@ -80,8 +79,9 @@ public static void generateLedgerIdImpl(final GenericCallback cb, ZooKeepe @Override public void processResult(int rc, String path, Object ctx, final String idPathName) { if (rc != KeeperException.Code.OK.intValue()) { - LOG.error("Could not generate new ledger id", - KeeperException.create(KeeperException.Code.get(rc), path)); + log.error() + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Could not generate new ledger id"); cb.operationComplete(BKException.Code.ZKException, null); return; } @@ -98,7 +98,10 @@ public void processResult(int rc, String path, Object ctx, final String idPathNa cb.operationComplete(BKException.Code.OK, ledgerId); } } catch (IOException e) { - LOG.error("Could not extract ledger-id from id gen path:" + path, e); + log.error() + .attr("path", path) + .exception(e) + .log("Could not extract ledger-id from id gen path"); cb.operationComplete(BKException.Code.ZKException, null); return; } @@ -108,12 +111,11 @@ public void processResult(int rc, String path, Object ctx, final String idPathNa @Override public void processResult(int rc, String path, Object ctx) { if (rc != KeeperException.Code.OK.intValue()) { - LOG.warn("Exception during deleting znode for id generation : ", - KeeperException.create(KeeperException.Code.get(rc), path)); + log.warn() + .exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Exception during deleting znode for id generation"); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Deleting znode for id generation : {}", idPathName); - } + log.debug().attr("path", idPathName).log("Deleting znode for id generation"); } } }, null); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java index 4118e191319..7bc6ccf9b82 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java @@ -41,6 +41,7 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.CustomLog; import org.apache.bookkeeper.common.concurrent.FutureUtils; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.meta.zk.ZKMetadataDriverBase; @@ -68,8 +69,6 @@ import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ZooKeeper implementation of underreplication manager. @@ -86,8 +85,8 @@ * e.g. For ledger id 0xcafebeef0000feed, the path is * cafe/beef/0000/feed/ */ +@CustomLog public class ZkLedgerUnderreplicationManager implements LedgerUnderreplicationManager { - static final Logger LOG = LoggerFactory.getLogger(ZkLedgerUnderreplicationManager.class); static final String LAYOUT = "BASIC"; static final int LAYOUT_VERSION = 1; @@ -131,11 +130,12 @@ public ZkLedgerUnderreplicationManager(AbstractConfiguration conf, ZooKeeper zkc throws UnavailableException, InterruptedException, ReplicationException.CompatibilityException { this.conf = conf; if (conf.getZkReplicationTaskRateLimit() > 0) { - LOG.info("Throttling acquire task rate is configured to {} permits per second", - conf.getZkReplicationTaskRateLimit()); + log.info() + .attr("permitsPerSecond", conf.getZkReplicationTaskRateLimit()) + .log("Throttling acquire task rate is configured"); rateLimiter = RateLimiter.create(conf.getZkReplicationTaskRateLimit()); } else { - LOG.info("Throttling acquire task rate is disabled"); + log.info("Throttling acquire task rate is disabled"); rateLimiter = null; } rootPath = ZKMetadataDriverBase.resolveZkLedgersRootPath(conf); @@ -281,9 +281,7 @@ public UnderreplicatedLedger getLedgerUnreplicationInfo(long ledgerId) try { data = zkc.getData(znode, false, null); } catch (KeeperException.NoNodeException nne) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} is not marked underreplicated", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ledger is not marked underreplicated"); return null; } TextFormat.merge(new String(data, UTF_8), builder); @@ -307,9 +305,10 @@ public UnderreplicatedLedger getLedgerUnreplicationInfo(long ledgerId) @Override public CompletableFuture markLedgerUnderreplicatedAsync(long ledgerId, Collection missingReplicas) { - if (LOG.isDebugEnabled()) { - LOG.debug("markLedgerUnderreplicated(ledgerId={}, missingReplica={})", ledgerId, missingReplicas); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("missingReplicas", missingReplicas) + .log("markLedgerUnderreplicated"); final List zkAcls = ZkUtils.getACLs(conf); final String znode = getUrLedgerZnode(ledgerId); final CompletableFuture createFuture = new CompletableFuture<>(); @@ -399,9 +398,7 @@ private void handleLedgerUnderreplicatedAlreadyMarked(final String znode, @Override public void markLedgerReplicated(long ledgerId) throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("markLedgerReplicated(ledgerId={})", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("markLedgerReplicated"); try { Lock l = heldLocks.get(ledgerId); if (l != null) { @@ -435,7 +432,7 @@ public void markLedgerReplicated(long ledgerId) throws ReplicationException.Unav // for rereplication again. Leave the underreplicated // znode in place, so the ledger is checked. } catch (KeeperException ke) { - LOG.error("Error deleting underreplicated ledger znode", ke); + log.error().exception(ke).log("Error deleting underreplicated ledger znode"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -537,9 +534,10 @@ private long getLedgerToRereplicateFromHierarchy(String parent, long depth) Stat stat = zkc.exists(parent + "/" + tryChild, false); if (stat == null) { - if (LOG.isDebugEnabled()) { - LOG.debug("{}/{} doesn't exist", parent, tryChild); - } + log.debug() + .attr("parent", parent) + .attr("child", tryChild) + .log("Node doesn't exist"); children.remove(tryChild); continue; } @@ -584,9 +582,7 @@ private long getLedgerToRereplicateFromHierarchy(String parent, long depth) @Override public long pollLedgerToRereplicate() throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("pollLedgerToRereplicate()"); - } + log.debug("pollLedgerToRereplicate()"); try { return getLedgerToRereplicateFromHierarchy(urLedgerPath, 0); } catch (KeeperException ke) { @@ -599,9 +595,7 @@ public long pollLedgerToRereplicate() throws ReplicationException.UnavailableExc @Override public long getLedgerToRereplicate() throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("getLedgerToRereplicate()"); - } + log.debug("getLedgerToRereplicate()"); while (true) { if (rateLimiter != null) { rateLimiter.acquire(); @@ -610,7 +604,7 @@ public long getLedgerToRereplicate() throws ReplicationException.UnavailableExce Watcher w = new Watcher() { @Override public void process(WatchedEvent e) { - LOG.info("Latch countdown due to ZK event: " + e); + log.info().attr("event", e).log("Latch countdown due to ZK event"); changedLatch.countDown(); } }; @@ -642,9 +636,7 @@ private void waitIfLedgerReplicationDisabled() throws UnavailableException, @Override public void releaseUnderreplicatedLedger(long ledgerId) throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("releaseLedger(ledgerId={})", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("releaseLedger"); try { Lock l = heldLocks.get(ledgerId); if (l != null) { @@ -653,7 +645,7 @@ public void releaseUnderreplicatedLedger(long ledgerId) throws ReplicationExcept } catch (KeeperException.NoNodeException nne) { // this is ok } catch (KeeperException ke) { - LOG.error("Error deleting underreplicated ledger lock", ke); + log.error().exception(ke).log("Error deleting underreplicated ledger lock"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -664,9 +656,7 @@ public void releaseUnderreplicatedLedger(long ledgerId) throws ReplicationExcept @Override public void close() throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("close()"); - } + log.debug("close()"); try { for (Map.Entry e : heldLocks.entrySet()) { zkc.delete(e.getValue().getLockZNode(), -1); @@ -674,7 +664,7 @@ public void close() throws ReplicationException.UnavailableException { } catch (KeeperException.NoNodeException nne) { // this is ok } catch (KeeperException ke) { - LOG.error("Error deleting underreplicated ledger lock", ke); + log.error().exception(ke).log("Error deleting underreplicated ledger lock"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -686,19 +676,17 @@ public void close() throws ReplicationException.UnavailableException { public void disableLedgerReplication() throws ReplicationException.UnavailableException { List zkAcls = ZkUtils.getACLs(conf); - if (LOG.isDebugEnabled()) { - LOG.debug("disableLedegerReplication()"); - } + log.debug("disableLedegerReplication()"); try { String znode = basePath + '/' + BookKeeperConstants.DISABLE_NODE; zkc.create(znode, "".getBytes(UTF_8), zkAcls, CreateMode.PERSISTENT); - LOG.info("Auto ledger re-replication is disabled!"); + log.info("Auto ledger re-replication is disabled!"); } catch (KeeperException.NodeExistsException ke) { - LOG.warn("AutoRecovery is already disabled!", ke); + log.warn().exception(ke).log("AutoRecovery is already disabled!"); throw new ReplicationException.UnavailableException( "AutoRecovery is already disabled!", ke); } catch (KeeperException ke) { - LOG.error("Exception while stopping auto ledger re-replication", ke); + log.error().exception(ke).log("Exception while stopping auto ledger re-replication"); throw ReplicationException.fromKeeperException("Exception while stopping auto ledger re-replication", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -710,18 +698,16 @@ public void disableLedgerReplication() @Override public void enableLedgerReplication() throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("enableLedegerReplication()"); - } + log.debug("enableLedegerReplication()"); try { zkc.delete(basePath + '/' + BookKeeperConstants.DISABLE_NODE, -1); - LOG.info("Resuming automatic ledger re-replication"); + log.info("Resuming automatic ledger re-replication"); } catch (KeeperException.NoNodeException ke) { - LOG.warn("AutoRecovery is already enabled!", ke); + log.warn().exception(ke).log("AutoRecovery is already enabled!"); throw new ReplicationException.UnavailableException( "AutoRecovery is already enabled!", ke); } catch (KeeperException ke) { - LOG.error("Exception while resuming ledger replication", ke); + log.error().exception(ke).log("Exception while resuming ledger replication"); throw ReplicationException.fromKeeperException("Exception while resuming auto ledger re-replication", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -733,15 +719,12 @@ public void enableLedgerReplication() @Override public boolean isLedgerReplicationEnabled() throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("isLedgerReplicationEnabled()"); - } + log.debug("isLedgerReplicationEnabled()"); try { return null == zkc.exists(basePath + '/' + BookKeeperConstants.DISABLE_NODE, false); } catch (KeeperException ke) { - LOG.error("Error while checking the state of " - + "ledger re-replication", ke); + log.error().exception(ke).log("Error while checking the state of ledger re-replication"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -753,14 +736,12 @@ public boolean isLedgerReplicationEnabled() @Override public void notifyLedgerReplicationEnabled(final GenericCallback cb) throws ReplicationException.UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("notifyLedgerReplicationEnabled()"); - } + log.debug("notifyLedgerReplicationEnabled()"); Watcher w = new Watcher() { @Override public void process(WatchedEvent e) { if (e.getType() == Watcher.Event.EventType.NodeDeleted) { - LOG.info("LedgerReplication is enabled externally through Zookeeper, " + log.info("LedgerReplication is enabled externally through Zookeeper, " + "since DISABLE_NODE ZNode is deleted"); cb.operationComplete(0, null); } @@ -769,14 +750,13 @@ public void process(WatchedEvent e) { try { if (null == zkc.exists(basePath + '/' + BookKeeperConstants.DISABLE_NODE, w)) { - LOG.info("LedgerReplication is enabled externally through Zookeeper, " + log.info("LedgerReplication is enabled externally through Zookeeper, " + "since DISABLE_NODE ZNode is deleted"); cb.operationComplete(0, null); return; } } catch (KeeperException ke) { - LOG.error("Error while checking the state of " - + "ledger re-replication", ke); + log.error().exception(ke).log("Error while checking the state of ledger re-replication"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -826,21 +806,21 @@ public void acquireUnderreplicatedLedger(long ledgerId) @Override public boolean initializeLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("initializeLostBookieRecoveryDelay()"); - } + log.debug("initializeLostBookieRecoveryDelay()"); try { zkc.create(lostBookieRecoveryDelayZnode, Integer.toString(lostBookieRecoveryDelay).getBytes(UTF_8), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } catch (KeeperException.NodeExistsException ke) { - LOG.info("lostBookieRecoveryDelay Znode is already present, so using " + log.info("lostBookieRecoveryDelay Znode is already present, so using " + "existing lostBookieRecoveryDelay Znode value"); return false; } catch (KeeperException.NoNodeException nne) { - LOG.error("lostBookieRecoveryDelay Znode not found. Please verify if Auditor has been initialized.", nne); + log.error() + .exception(nne) + .log("lostBookieRecoveryDelay Znode not found. Please verify if Auditor has been initialized."); return false; } catch (KeeperException ke) { - LOG.error("Error while initializing LostBookieRecoveryDelay", ke); + log.error().exception(ke).log("Error while initializing LostBookieRecoveryDelay"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -851,9 +831,7 @@ public boolean initializeLostBookieRecoveryDelay(int lostBookieRecoveryDelay) th @Override public void setLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("setLostBookieRecoveryDelay()"); - } + log.debug("setLostBookieRecoveryDelay()"); try { if (zkc.exists(lostBookieRecoveryDelayZnode, false) != null) { zkc.setData(lostBookieRecoveryDelayZnode, Integer.toString(lostBookieRecoveryDelay).getBytes(UTF_8), @@ -863,7 +841,7 @@ public void setLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws Unava Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } catch (KeeperException ke) { - LOG.error("Error while setting LostBookieRecoveryDelay ", ke); + log.error().exception(ke).log("Error while setting LostBookieRecoveryDelay"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -873,14 +851,12 @@ public void setLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws Unava @Override public int getLostBookieRecoveryDelay() throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("getLostBookieRecoveryDelay()"); - } + log.debug("getLostBookieRecoveryDelay()"); try { byte[] data = zkc.getData(lostBookieRecoveryDelayZnode, false, null); return Integer.parseInt(new String(data, UTF_8)); } catch (KeeperException ke) { - LOG.error("Error while getting LostBookieRecoveryDelay ", ke); + log.error().exception(ke).log("Error while getting LostBookieRecoveryDelay"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -890,9 +866,7 @@ public int getLostBookieRecoveryDelay() throws UnavailableException { @Override public void notifyUnderReplicationLedgerChanged(GenericCallback cb) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("notifyUnderReplicationLedgerChanged()"); - } + log.debug("notifyUnderReplicationLedgerChanged()"); Watcher w = new Watcher() { @Override public void process(WatchedEvent e) { @@ -904,7 +878,7 @@ public void process(WatchedEvent e) { try { zkc.addWatch(urLedgerPath, w, AddWatchMode.PERSISTENT_RECURSIVE); } catch (KeeperException ke) { - LOG.error("Error while checking the state of underReplicated ledgers", ke); + log.error().exception(ke).log("Error while checking the state of underReplicated ledgers"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -914,9 +888,7 @@ public void process(WatchedEvent e) { @Override public void notifyLostBookieRecoveryDelayChanged(GenericCallback cb) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("notifyLostBookieRecoveryDelayChanged()"); - } + log.debug("notifyLostBookieRecoveryDelayChanged()"); Watcher w = new Watcher() { @Override public void process(WatchedEvent e) { @@ -931,7 +903,7 @@ public void process(WatchedEvent e) { return; } } catch (KeeperException ke) { - LOG.error("Error while checking the state of lostBookieRecoveryDelay", ke); + log.error().exception(ke).log("Error while checking the state of lostBookieRecoveryDelay"); throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); @@ -952,15 +924,15 @@ public String getReplicationWorkerIdRereplicatingLedger(long ledgerId) } catch (KeeperException.NoNodeException e) { // this is ok. } catch (KeeperException e) { - LOG.error("Error while getting ReplicationWorkerId rereplicating Ledger", e); + log.error().exception(e).log("Error while getting ReplicationWorkerId rereplicating Ledger"); throw ReplicationException.fromKeeperException( "Error while getting ReplicationWorkerId rereplicating Ledger", e); } catch (InterruptedException e) { - LOG.error("Got interrupted while getting ReplicationWorkerId rereplicating Ledger", e); + log.error().exception(e).log("Got interrupted while getting ReplicationWorkerId rereplicating Ledger"); Thread.currentThread().interrupt(); throw new ReplicationException.UnavailableException("Interrupted while contacting zookeeper", e); } catch (ParseException e) { - LOG.error("Error while parsing ZK data of lock", e); + log.error().exception(e).log("Error while parsing ZK data of lock"); throw new ReplicationException.UnavailableException("Error while parsing ZK data of lock", e); } return replicationWorkerId; @@ -968,9 +940,7 @@ public String getReplicationWorkerIdRereplicatingLedger(long ledgerId) @Override public void setCheckAllLedgersCTime(long checkAllLedgersCTime) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("setCheckAllLedgersCTime"); - } + log.debug("setCheckAllLedgersCTime"); try { List zkAcls = ZkUtils.getACLs(conf); CheckAllLedgersFormat.Builder builder = CheckAllLedgersFormat.newBuilder(); @@ -991,16 +961,14 @@ public void setCheckAllLedgersCTime(long checkAllLedgersCTime) throws Unavailabl @Override public long getCheckAllLedgersCTime() throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("setCheckAllLedgersCTime"); - } + log.debug("getCheckAllLedgersCTime"); try { byte[] data = zkc.getData(checkAllLedgersCtimeZnode, false, null); CheckAllLedgersFormat checkAllLedgersFormat = CheckAllLedgersFormat.parseFrom(data); return checkAllLedgersFormat.hasCheckAllLedgersCTime() ? checkAllLedgersFormat.getCheckAllLedgersCTime() : -1; } catch (KeeperException.NoNodeException ne) { - LOG.warn("checkAllLedgersCtimeZnode is not yet available"); + log.warn("checkAllLedgersCtimeZnode is not yet available"); return -1; } catch (KeeperException ke) { throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); @@ -1014,9 +982,7 @@ public long getCheckAllLedgersCTime() throws UnavailableException { @Override public void setPlacementPolicyCheckCTime(long placementPolicyCheckCTime) throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("setPlacementPolicyCheckCTime"); - } + log.debug("setPlacementPolicyCheckCTime"); try { List zkAcls = ZkUtils.getACLs(conf); PlacementPolicyCheckFormat.Builder builder = PlacementPolicyCheckFormat.newBuilder(); @@ -1038,16 +1004,14 @@ public void setPlacementPolicyCheckCTime(long placementPolicyCheckCTime) throws @Override public long getPlacementPolicyCheckCTime() throws UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("getPlacementPolicyCheckCTime"); - } + log.debug("getPlacementPolicyCheckCTime"); try { byte[] data = zkc.getData(placementPolicyCheckCtimeZnode, false, null); PlacementPolicyCheckFormat placementPolicyCheckFormat = PlacementPolicyCheckFormat.parseFrom(data); return placementPolicyCheckFormat.hasPlacementPolicyCheckCTime() ? placementPolicyCheckFormat.getPlacementPolicyCheckCTime() : -1; } catch (KeeperException.NoNodeException ne) { - LOG.warn("placementPolicyCheckCtimeZnode is not yet available"); + log.warn("placementPolicyCheckCtimeZnode is not yet available"); return -1; } catch (KeeperException ke) { throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); @@ -1071,9 +1035,7 @@ public void setReplicasCheckCTime(long replicasCheckCTime) throws UnavailableExc } else { zkc.create(replicasCheckCtimeZnode, replicasCheckFormatByteArray, zkAcls, CreateMode.PERSISTENT); } - if (LOG.isDebugEnabled()) { - LOG.debug("setReplicasCheckCTime completed successfully"); - } + log.debug("setReplicasCheckCTime completed successfully"); } catch (KeeperException ke) { throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); } catch (InterruptedException ie) { @@ -1087,12 +1049,10 @@ public long getReplicasCheckCTime() throws UnavailableException { try { byte[] data = zkc.getData(replicasCheckCtimeZnode, false, null); ReplicasCheckFormat replicasCheckFormat = ReplicasCheckFormat.parseFrom(data); - if (LOG.isDebugEnabled()) { - LOG.debug("getReplicasCheckCTime completed successfully"); - } + log.debug("getReplicasCheckCTime completed successfully"); return replicasCheckFormat.hasReplicasCheckCTime() ? replicasCheckFormat.getReplicasCheckCTime() : -1; } catch (KeeperException.NoNodeException ne) { - LOG.warn("replicasCheckCtimeZnode is not yet available"); + log.warn("replicasCheckCtimeZnode is not yet available"); return -1; } catch (KeeperException ke) { throw ReplicationException.fromKeeperException("Error contacting zookeeper", ke); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/metastore/MetastoreUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/metastore/MetastoreUtils.java index 1f326b1eec1..a9169e296c4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/metastore/MetastoreUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/metastore/MetastoreUtils.java @@ -22,18 +22,16 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.metastore.MSException.Code; import org.apache.bookkeeper.versioning.Version; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provides utilities for metastore. */ +@CustomLog public class MetastoreUtils { - private static final Logger logger = LoggerFactory.getLogger(MetastoreUtils.class); - static class MultiMetastoreCallback implements MetastoreCallback { int rc = Code.OK.getCode(); @@ -105,13 +103,15 @@ public static void cleanTable(MetastoreTable table, int numEntriesPerScan) SyncMetastoreCallback openCb = new SyncMetastoreCallback(); table.openCursor(MetastoreTable.NON_FIELDS, openCb, null); MetastoreCursor cursor = openCb.getResult(); - logger.info("Open cursor for table {} to clean entries.", table.getName()); + log.info().attr("table", table.getName()).log("Open cursor to clean entries"); List keysToClean = new ArrayList(numEntriesPerScan); int numEntriesRemoved = 0; while (cursor.hasMoreEntries()) { - logger.info("Fetching next {} entries from table {} to clean.", - numEntriesPerScan, table.getName()); + log.info() + .attr("numEntries", numEntriesPerScan) + .attr("table", table.getName()) + .log("Fetching next entries to clean"); Iterator iter = cursor.readEntries(numEntriesPerScan); keysToClean.clear(); while (iter.hasNext()) { @@ -123,7 +123,7 @@ public static void cleanTable(MetastoreTable table, int numEntriesPerScan) continue; } - logger.info("Issuing deletes to delete keys {}", keysToClean); + log.info().attr("keys", keysToClean).log("Issuing deletes"); // issue deletes to delete batch of keys MultiMetastoreCallback mcb = new MultiMetastoreCallback(keysToClean.size()); for (String key : keysToClean) { @@ -131,9 +131,12 @@ public static void cleanTable(MetastoreTable table, int numEntriesPerScan) } mcb.waitUntilAllFinished(); numEntriesRemoved += keysToClean.size(); - logger.info("Removed {} entries from table {}.", numEntriesRemoved, table.getName()); + log.info() + .attr("numEntriesRemoved", numEntriesRemoved) + .attr("table", table.getName()) + .log("Removed entries"); } - logger.info("Finished cleaning up table {}.", table.getName()); + log.info().attr("table", table.getName()).log("Finished cleaning up table"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/DNS.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/DNS.java index 68ff6621265..8e5d341a5ed 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/DNS.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/DNS.java @@ -31,17 +31,15 @@ import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * A class that provides direct and reverse lookup functionalities, allowing * the querying of specific network interfaces or nameservers. */ +@CustomLog public class DNS { - private static final Logger LOG = LoggerFactory.getLogger(DNS.class); - /** * The cached hostname -initially null. */ @@ -176,7 +174,10 @@ public static String[] getIPs(String strInterface, netIf = getSubinterface(strInterface); } } catch (SocketException e) { - LOG.warn("I/O error finding interface {}: {}", strInterface, e.getMessage()); + log.warn() + .attr("interface", strInterface) + .exceptionMessage(e) + .log("I/O error finding interface"); return new String[]{cachedHostAddress}; } if (netIf == null) { @@ -241,7 +242,7 @@ public static String[] getHosts(String strInterface, String nameserver) } } if (hosts.isEmpty()) { - LOG.warn("Unable to determine hostname for interface " + strInterface); + log.warn().attr("interface", strInterface).log("Unable to determine hostname for interface"); return new String[]{cachedHostname}; } else { return hosts.toArray(new String[hosts.size()]); @@ -260,8 +261,7 @@ private static String resolveLocalHostname() { try { localhost = InetAddress.getLocalHost().getCanonicalHostName(); } catch (UnknownHostException e) { - LOG.warn("Unable to determine local hostname " - + "-falling back to \"" + LOCALHOST + "\"", e); + log.warn().exception(e).log("Unable to determine local hostname - falling back to localhost"); localhost = LOCALHOST; } return localhost; @@ -284,15 +284,16 @@ private static String resolveLocalHostIPAddress() { try { address = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { - LOG.warn("Unable to determine address of the host" - + "-falling back to \"" + LOCALHOST + "\" address", e); + log.warn().exception(e).log("Unable to determine address of the host - falling back to localhost address"); try { address = InetAddress.getByName(LOCALHOST).getHostAddress(); } catch (UnknownHostException noLocalHostAddressException) { //at this point, deep trouble - LOG.error("Unable to determine local loopback address " - + "of \"" + LOCALHOST + "\" " - + "-this system's network configuration is unsupported", e); + log.error() + .exception(e) + .log("Unable to determine local loopback address" + + " - this system's network configuration" + + " is unsupported"); address = null; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java index 82890dedc18..a0722f6c857 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java @@ -27,8 +27,7 @@ import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * The class represents a cluster of computer with a tree hierarchical @@ -40,10 +39,10 @@ * or racks. * */ +@CustomLog public class NetworkTopologyImpl implements NetworkTopology { public static final int DEFAULT_HOST_LEVEL = 2; - public static final Logger LOG = LoggerFactory.getLogger(NetworkTopologyImpl.class); public static final String NODE_SEPARATOR = ","; public static final String INVERSE = "~"; @@ -414,18 +413,22 @@ public void add(Node node) { netlock.writeLock().lock(); try { if ((depthOfAllLeaves != -1) && (depthOfAllLeaves != newDepth)) { - LOG.error("Error: can't add leaf node {} at depth {} to topology:\n{}", node, newDepth, oldTopoStr); + log.error() + .attr("node", node) + .attr("depth", newDepth) + .attr("topology", oldTopoStr) + .log("Error: can't add leaf node at depth to topology"); throw new InvalidTopologyException("Invalid network topology. " + "You cannot have a rack and a non-rack node at the same level of the network topology."); } Node rack = getNodeForNetworkLocation(node); if (rack != null && !(rack instanceof InnerNode)) { - LOG.error("Unexpected data node {} at an illegal network location", node); + log.error().attr("node", node).log("Unexpected data node at an illegal network location"); throw new IllegalArgumentException("Unexpected data node " + node + " at an illegal network location"); } if (clusterMap.add(node)) { - LOG.info("Adding a new node: " + NodeBase.getPath(node)); + log.info().attr("node", NodeBase.getPath(node)).log("Adding a new node"); if (rack == null) { numOfRacks++; } @@ -435,9 +438,7 @@ public void add(Node node) { } } } - if (LOG.isDebugEnabled()) { - LOG.debug("NetworkTopology became:\n" + this); - } + log.debug().attr("topology", this.toString()).log("NetworkTopology became"); } finally { netlock.writeLock().unlock(); } @@ -497,7 +498,7 @@ public void remove(Node node) { } else if (node instanceof InnerNode) { throw new IllegalArgumentException("Not allow to remove an inner node: " + NodeBase.getPath(node)); } - LOG.info("Removing a node: " + NodeBase.getPath(node)); + log.info().attr("node", NodeBase.getPath(node)).log("Removing a node"); netlock.writeLock().lock(); try { if (clusterMap.remove(node)) { @@ -509,9 +510,7 @@ public void remove(Node node) { depthOfAllLeaves = -1; } } - if (LOG.isDebugEnabled()) { - LOG.debug("NetworkTopology became:\n" + this); - } + log.debug().attr("topology", this.toString()).log("NetworkTopology became"); } finally { netlock.writeLock().unlock(); } @@ -637,11 +636,11 @@ public int getDistance(Node node1, Node node2) { netlock.readLock().unlock(); } if (n1 == null) { - LOG.warn("The cluster does not contain node: {}", NodeBase.getPath(node1)); + log.warn().attr("node", NodeBase.getPath(node1)).log("The cluster does not contain node"); return Integer.MAX_VALUE; } if (n2 == null) { - LOG.warn("The cluster does not contain node: {}", NodeBase.getPath(node2)); + log.warn().attr("node", NodeBase.getPath(node2)).log("The cluster does not contain node"); return Integer.MAX_VALUE; } return dis + 2; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/ScriptBasedMapping.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/ScriptBasedMapping.java index 5ae894e386f..708c7622235 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/ScriptBasedMapping.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/ScriptBasedMapping.java @@ -22,11 +22,10 @@ import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; +import lombok.CustomLog; import org.apache.bookkeeper.util.Shell.ShellCommandExecutor; import org.apache.commons.configuration2.Configuration; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class implements the {@link DNSToSwitchMapping} interface using a @@ -126,10 +125,10 @@ public void setConf(Configuration conf) { * This is the uncached script mapping that is fed into the cache managed * by the superclass {@link CachedDNSToSwitchMapping}. */ + @CustomLog private static final class RawScriptBasedMapping extends AbstractDNSToSwitchMapping { private String scriptName; private int maxArgs; //max hostnames per call of the script - private static final Logger LOG = LoggerFactory.getLogger(RawScriptBasedMapping.class); /* * extract 'scriptName' and 'maxArgs' parameters from the conf and throw @@ -172,8 +171,10 @@ protected void validateConf() { try { s.execute(); } catch (Exception e) { - LOG.error("Conf validation failed. Got exception for sanity check of script: " + this.scriptName, - e); + log.error() + .attr("script", this.scriptName) + .exception(e) + .log("Conf validation failed. Got exception for sanity check of script"); throw new RuntimeException( "Conf validation failed. Got exception for sanity check of script: " + this.scriptName, e); } @@ -209,8 +210,11 @@ public List resolve(List names) { if (m.size() != names.size()) { // invalid number of entries returned by the script - LOG.error("Script " + scriptName + " returned " + m.size() + " values when " - + names.size() + " were expected."); + log.error() + .attr("script", scriptName) + .attr("returnedCount", m.size()) + .attr("expectedCount", names.size()) + .log("Script returned unexpected number of values"); return null; } } else { @@ -238,8 +242,11 @@ private String runResolveCommand(List args) { StringBuilder allOutput = new StringBuilder(); int numProcessed = 0; if (maxArgs < MIN_ALLOWABLE_ARGS) { - LOG.warn("Invalid value " + maxArgs + " for " + SCRIPT_ARG_COUNT_KEY - + "; must be >= " + MIN_ALLOWABLE_ARGS); + log.warn() + .attr("maxArgs", maxArgs) + .attr("configKey", SCRIPT_ARG_COUNT_KEY) + .attr("minAllowable", MIN_ALLOWABLE_ARGS) + .log("Invalid value for script arg count; must be >= minimum"); return null; } @@ -262,7 +269,10 @@ private String runResolveCommand(List args) { s.execute(); allOutput.append(s.getOutput()).append(" "); } catch (Exception e) { - LOG.warn("Exception running: {} Exception message: {}", s, e.getMessage()); + log.warn() + .attr("command", s) + .exceptionMessage(e) + .log("Exception running command"); return null; } loopCount++; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java index 1319a8a802b..99212a3eddb 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/StabilizeNetworkTopology.java @@ -25,16 +25,14 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * This is going to provide a stabilize network topology regarding to flapping zookeeper registration. */ +@CustomLog public class StabilizeNetworkTopology implements NetworkTopology { - private static final Logger logger = LoggerFactory.getLogger(StabilizeNetworkTopology.class); - static class NodeStatus { long lastPresentTime; boolean tentativeToRemove; @@ -88,8 +86,11 @@ public void run(Timeout timeout) throws Exception { } else if (status.isTentativeToRemove()) { long millisSinceLastSeen = System.currentTimeMillis() - status.getLastPresentTime(); if (millisSinceLastSeen >= stabilizePeriodMillis) { - logger.info("Node {} (seen @ {}) becomes stale for {} ms, remove it from the topology.", - node, status.getLastPresentTime(), millisSinceLastSeen); + log.info() + .attr("node", node) + .attr("lastPresentTime", status.getLastPresentTime()) + .attr("millisSinceLastSeen", millisSinceLastSeen) + .log("Node becomes stale, remove it from the topology"); impl.remove(node); nodeStatuses.remove(node, status); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AddCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AddCompletion.java index c21226dd36b..69409138b0c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AddCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AddCompletion.java @@ -22,11 +22,13 @@ package org.apache.bookkeeper.proto; import io.netty.util.Recycler; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.net.BookieId; import org.slf4j.MDC; +@CustomLog class AddCompletion extends CompletionValue implements BookkeeperInternalCallbacks.WriteCallback { static AddCompletion acquireAddCompletion(final CompletionKey key, @@ -134,9 +136,7 @@ public void handleV3Response( private void handleResponse(long ledgerId, long entryId, BookkeeperProtocol.StatusCode status) { - if (LOG.isDebugEnabled()) { - logResponse(status, "ledger", ledgerId, "entry", entryId); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.WriteException); writeComplete(rc, ledgerId, entryId, perChannelBookieClient.bookieId, ctx); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AuthHandler.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AuthHandler.java index a11fad102dd..ed2aa014b18 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AuthHandler.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/AuthHandler.java @@ -34,6 +34,7 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicLong; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.auth.AuthToken; import org.apache.bookkeeper.auth.BookieAuthProvider; @@ -42,11 +43,9 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.AuthMessage; import org.apache.bookkeeper.util.ByteBufList; import org.apache.bookkeeper.util.NettyChannelUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class AuthHandler { - static final Logger LOG = LoggerFactory.getLogger(AuthHandler.class); static class ServerSideHandler extends ChannelInboundHandlerAdapter { volatile boolean authenticated = false; @@ -144,8 +143,9 @@ && checkAuthPlugin(req.getAuthRequest(), ctx.channel())) { private boolean checkAuthPlugin(AuthMessage am, final Channel src) { if (!am.hasAuthPluginName() || !am.getAuthPluginName().equals(authProviderFactory.getPluginName())) { - LOG.error("Received message from incompatible auth plugin. Local = {}, Remote = {}, Channel = {}", - authProviderFactory.getPluginName(), am.getAuthPluginName(), src); + log.error().attr("localPlugin", authProviderFactory.getPluginName()) + .attr("remotePlugin", am.getAuthPluginName()).attr("channel", src) + .log("Received message from incompatible auth plugin"); return false; } return true; @@ -167,7 +167,7 @@ static class AuthResponseCallbackLegacy implements AuthCallbacks.GenericCallback @Override public void operationComplete(int rc, AuthToken newam) { if (rc != BKException.Code.OK) { - LOG.error("Error processing auth message, closing connection"); + log.error("Error processing auth message, closing connection"); channel.close(); return; } @@ -196,7 +196,7 @@ public void operationComplete(int rc, AuthToken newam) { .setHeader(req.getHeader()); if (rc != BKException.Code.OK) { - LOG.error("Error processing auth message, closing connection"); + log.error("Error processing auth message, closing connection"); builder.setStatus(BookkeeperProtocol.StatusCode.EUA); NettyChannelUtil.writeAndFlushWithClosePromise( @@ -219,11 +219,9 @@ class AuthHandshakeCompleteCallback implements AuthCallbacks.GenericCallback newTaskQueue(int maxPendingTasks) { try { CpuAffinity.acquireCore(); } catch (Throwable t) { - LOG.warn("Failed to acquire CPU core for thread {} {}", - Thread.currentThread().getName(), t.getMessage(), t); + log.warn() + .exception(t) + .attr("threadName", Thread.currentThread().getName()) + .log("Failed to acquire CPU core for thread"); } }); } @@ -260,7 +260,7 @@ public Collection getProtocolPrincipals() { result.addAll(Arrays.asList(certificates)); return result; } catch (SSLPeerUnverifiedException err) { - LOG.error("Failed to get peer certificates", err); + log.error().exception(err).log("Failed to get peer certificates"); return Collections.emptyList(); } @@ -273,7 +273,7 @@ public void disconnect() { if (c != null) { c.close(); } - LOG.info("authplugin disconnected channel {}", channel); + log.info().attr("channel", channel).log("authplugin disconnected channel"); } @Override @@ -283,7 +283,10 @@ public BookKeeperPrincipal getAuthorizedId() { @Override public void setAuthorizedId(BookKeeperPrincipal principal) { - LOG.info("connection {} authenticated as {}", channel, principal); + log.info() + .attr("channel", channel) + .attr("principal", principal) + .log("connection authenticated"); authorizedId = principal; } @@ -365,7 +368,7 @@ protected void initChannel(SocketChannel ch) throws Exception { }); // Bind and start to accept incoming connections - LOG.info("Binding bookie-rpc endpoint to {}", address); + log.info().attr("address", address).log("Binding bookie-rpc endpoint"); Channel listen = bootstrap.bind(address.getAddress(), address.getPort()).sync().channel(); if (listen.localAddress() instanceof InetSocketAddress) { @@ -429,7 +432,7 @@ protected void initChannel(LocalChannel ch) throws Exception { pipeline.addLast("contextHandler", contextHandler); } }); - LOG.info("Binding jvm bookie-rpc endpoint to {}", bookieId.toString()); + log.info().attr("bookieId", bookieId.toString()).log("Binding jvm bookie-rpc endpoint"); // use the same address 'name', so clients can find local Bookie still discovering them using ZK jvmBootstrap.bind(new LocalAddress(bookieId.toString())).sync(); LocalBookiesRegistry.registerLocalBookieAddress(bookieId); @@ -441,7 +444,7 @@ void start() throws InterruptedException { } void shutdown() { - LOG.info("Shutting down BookieNettyServer"); + log.info("Shutting down BookieNettyServer"); isRunning.set(false); if (!isClosed.compareAndSet(false, true)) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java index 0c3b7bf8e8e..b1427b09371 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java @@ -36,19 +36,18 @@ import io.netty.util.ReferenceCountUtil; import java.io.IOException; import java.security.NoSuchAlgorithmException; +import lombok.CustomLog; import org.apache.bookkeeper.proto.BookieProtocol.PacketHeader; import org.apache.bookkeeper.proto.BookkeeperProtocol.OperationType; import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.checksum.MacDigestManager; import org.apache.bookkeeper.util.ByteBufList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A class for encoding and decoding the Bookkeeper protocol. */ +@CustomLog public class BookieProtoEncoding { - private static final Logger LOG = LoggerFactory.getLogger(BookieProtoEncoding.class); /** * Threshold under which an entry is considered to be "small". @@ -351,7 +350,7 @@ public Object encode(Object msg, ByteBufAllocator allocator) buf.writeBytes(am.toByteArray()); return buf; } else { - LOG.error("Cannot encode unknown response type {}", msg.getClass().getName()); + log.error().attr("type", msg.getClass().getName()).log("Cannot encode unknown response type"); return msg; } } finally { @@ -509,9 +508,10 @@ public RequestEncoder(ExtensionRegistry extensionRegistry) { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - if (LOG.isTraceEnabled()) { - LOG.trace("Encode request {} to channel {}.", msg, ctx.channel()); - } + log.trace() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Encode request to channel"); if (msg instanceof ByteBuf || msg instanceof ByteBufList) { ctx.write(msg, promise); } else if (msg instanceof BookkeeperProtocol.Request) { @@ -519,7 +519,10 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) } else if (msg instanceof BookieProtocol.Request) { ctx.write(reqPreV3.encode(msg, ctx.alloc()), promise); } else { - LOG.error("Invalid request to encode to {}: {}", ctx.channel(), msg.getClass().getName()); + log.error() + .attr("channel", ctx.channel()) + .attr("type", msg.getClass().getName()) + .log("Invalid request to encode"); ctx.write(msg, promise); } } @@ -542,12 +545,16 @@ public static class RequestDecoder extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - if (LOG.isTraceEnabled()) { - LOG.trace("Received request {} from channel {} to decode.", msg, ctx.channel()); - } + log.trace() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Received request from channel to decode"); try { if (!(msg instanceof ByteBuf)) { - LOG.error("Received invalid request {} from channel {} to decode.", msg, ctx.channel()); + log.error() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Received invalid request from channel to decode"); ctx.fireChannelRead(msg); return; } @@ -587,9 +594,10 @@ public static class ResponseEncoder extends ChannelOutboundHandlerAdapter { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - if (LOG.isTraceEnabled()) { - LOG.trace("Encode response {} to channel {}.", msg, ctx.channel()); - } + log.trace() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Encode response to channel"); if (msg instanceof ByteBuf) { ctx.write(msg, promise); @@ -598,7 +606,10 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) } else if (msg instanceof BookieProtocol.Response) { ctx.write(repPreV3.encode(msg, ctx.alloc()), promise); } else { - LOG.error("Invalid response to encode to {}: {}", ctx.channel(), msg.getClass().getName()); + log.error() + .attr("channel", ctx.channel()) + .attr("type", msg.getClass().getName()) + .log("Invalid response to encode"); ctx.write(msg, promise); } } @@ -627,12 +638,16 @@ public static class ResponseDecoder extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - if (LOG.isTraceEnabled()) { - LOG.trace("Received response {} from channel {} to decode.", msg, ctx.channel()); - } + log.trace() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Received response from channel to decode"); try { if (!(msg instanceof ByteBuf)) { - LOG.error("Received invalid response {} from channel {} to decode.", msg, ctx.channel()); + log.error() + .attr("msg", msg) + .attr("channel", ctx.channel()) + .log("Received invalid response from channel to decode"); ctx.fireChannelRead(msg); return; } @@ -650,9 +665,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception if (result instanceof Response && OperationType.START_TLS == ((Response) result).getHeader().getOperation()) { usingV3Protocol = false; - if (LOG.isDebugEnabled()) { - LOG.debug("Degrade bookkeeper to v2 after starting TLS."); - } + log.debug("Degrade bookkeeper to v2 after starting TLS."); } } catch (InvalidProtocolBufferException e) { usingV3Protocol = false; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestHandler.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestHandler.java index 3d906dba449..999cca3a61d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestHandler.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestHandler.java @@ -25,14 +25,14 @@ import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.group.ChannelGroup; import java.nio.channels.ClosedChannelException; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.processor.RequestProcessor; /** * Serverside handler for bookkeeper requests. */ -@Slf4j +@CustomLog public class BookieRequestHandler extends ChannelInboundHandlerAdapter { private static final int DEFAULT_PENDING_RESPONSE_SIZE = 256; @@ -56,7 +56,7 @@ public ChannelHandlerContext ctx() { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { - log.info("Channel connected {}", ctx.channel()); + log.info().attr("channel", ctx.channel()).log("Channel connected"); this.ctx = ctx; super.channelActive(ctx); } @@ -68,16 +68,22 @@ public void channelRegistered(ChannelHandlerContext ctx) throws Exception { @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.info("Channels disconnected: {}", ctx.channel()); + log.info().attr("channel", ctx.channel()).log("Channels disconnected"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { if (cause instanceof ClosedChannelException) { - log.info("Client died before request could be completed on {}", ctx.channel(), cause); + log.info() + .exception(cause) + .attr("channel", ctx.channel()) + .log("Client died before request could be completed"); return; } - log.error("Unhandled exception occurred in I/O thread or handler on {}", ctx.channel(), cause); + log.error() + .exception(cause) + .attr("channel", ctx.channel()) + .log("Unhandled exception occurred in I/O thread or handler"); ctx.close(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java index 7b55545b5d2..1688a04a85a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java @@ -42,6 +42,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import lombok.AccessLevel; +import lombok.CustomLog; import lombok.Getter; import org.apache.bookkeeper.auth.AuthProviderFactoryFactory; import org.apache.bookkeeper.auth.AuthToken; @@ -55,17 +56,14 @@ import org.apache.bookkeeper.tls.SecurityHandlerFactory; import org.apache.bookkeeper.tls.SecurityHandlerFactory.NodeType; import org.apache.bookkeeper.util.NettyChannelUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.slf4j.MDC; /** * An implementation of the RequestProcessor interface. */ @Getter(AccessLevel.PACKAGE) +@CustomLog public class BookieRequestProcessor implements RequestProcessor { - - private static final Logger LOG = LoggerFactory.getLogger(BookieRequestProcessor.class); public static final String TLS_HANDLER_NAME = "tls"; /** @@ -187,8 +185,10 @@ public BookieRequestProcessor(ServerConfiguration serverCfg, Bookie bookie, Stat if (serverCfg.getCloseChannelOnResponseTimeout()) { onResponseTimeout = (ch) -> { - LOG.warn("closing channel {} because it was non-writable for longer than {} ms", - ch, waitTimeoutOnBackpressureMillis); + log.warn() + .attr("channel", ch) + .attr("timeoutMs", waitTimeoutOnBackpressureMillis) + .log("closing channel because it was non-writable for too long"); ch.close(); }; } else { @@ -212,12 +212,15 @@ protected void onAddRequestStart(Channel channel) { if (!addsSemaphore.tryAcquire()) { final long throttlingStartTimeNanos = MathUtils.nowInNano(); channel.config().setAutoRead(false); - LOG.info("Too many add requests in progress, disabling autoread on channel {}", channel); + log.info().attr("channel", channel).log("Too many add requests in progress, disabling autoread"); requestStats.blockAddRequest(); addsSemaphore.acquireUninterruptibly(); channel.config().setAutoRead(true); final long delayNanos = MathUtils.elapsedNanos(throttlingStartTimeNanos); - LOG.info("Re-enabled autoread on channel {} after AddRequest delay of {} nanos", channel, delayNanos); + log.info() + .attr("channel", channel) + .attr("delayNanos", delayNanos) + .log("Re-enabled autoread on channel after AddRequest delay"); requestStats.unblockAddRequest(delayNanos); } } @@ -236,12 +239,15 @@ protected void onReadRequestStart(Channel channel) { if (!readsSemaphore.tryAcquire()) { final long throttlingStartTimeNanos = MathUtils.nowInNano(); channel.config().setAutoRead(false); - LOG.info("Too many read requests in progress, disabling autoread on channel {}", channel); + log.info().attr("channel", channel).log("Too many read requests in progress, disabling autoread"); requestStats.blockReadRequest(); readsSemaphore.acquireUninterruptibly(); channel.config().setAutoRead(true); final long delayNanos = MathUtils.elapsedNanos(throttlingStartTimeNanos); - LOG.info("Re-enabled autoread on channel {} after ReadRequest delay of {} nanos", channel, delayNanos); + log.info() + .attr("channel", channel) + .attr("delayNanos", delayNanos) + .log("Re-enabled autoread on channel after ReadRequest delay"); requestStats.unblockReadRequest(delayNanos); } } @@ -267,7 +273,7 @@ int maxReadsInProgressCount() { @Override public void close() { - LOG.info("Closing RequestProcessor"); + log.info("Closing RequestProcessor"); shutdownExecutor(writeThreadPool); shutdownExecutor(readThreadPool); if (serverCfg.getNumLongPollWorkerThreads() > 0 || readThreadPool == null) { @@ -275,7 +281,7 @@ public void close() { } shutdownExecutor(highPriorityThreadPool); requestTimer.stop(); - LOG.info("Closed RequestProcessor"); + log.info("Closed RequestProcessor"); } private OrderedExecutor createExecutor( @@ -326,7 +332,9 @@ public void processRequest(Object msg, BookieRequestHandler requestHandler) { processForceLedgerRequestV3(r, requestHandler); break; case AUTH: - LOG.info("Ignoring auth operation from client {}", channel.remoteAddress()); + log.info() + .attr("clientAddress", channel.remoteAddress()) + .log("Ignoring auth operation from client"); BookkeeperProtocol.AuthMessage message = BookkeeperProtocol.AuthMessage .newBuilder() .setAuthPluginName(AuthProviderFactoryFactory.AUTHENTICATION_DISABLED_PLUGIN_NAME) @@ -355,7 +363,7 @@ public void processRequest(Object msg, BookieRequestHandler requestHandler) { processGetListOfEntriesOfLedgerProcessorV3(r, requestHandler); break; default: - LOG.info("Unknown operation type {}", header.getOperation()); + log.info().attr("operationType", header.getOperation()).log("Unknown operation type"); final BookkeeperProtocol.Response response = BookkeeperProtocol.Response.newBuilder().setHeader(r.getHeader()) .setStatus(BookkeeperProtocol.StatusCode.EBADREQ) @@ -386,8 +394,8 @@ public void processRequest(Object msg, BookieRequestHandler requestHandler) { processReadRequest((BookieProtocol.BatchedReadRequest) r, requestHandler); break; case BookieProtocol.AUTH: - LOG.info("Ignoring auth operation from client {}", - requestHandler.ctx().channel().remoteAddress()); + log.info().attr("clientAddress", requestHandler.ctx().channel().remoteAddress()) + .log("Ignoring auth operation from client"); BookkeeperProtocol.AuthMessage message = BookkeeperProtocol.AuthMessage .newBuilder() .setAuthPluginName(AuthProviderFactoryFactory.AUTHENTICATION_DISABLED_PLUGIN_NAME) @@ -399,7 +407,7 @@ public void processRequest(Object msg, BookieRequestHandler requestHandler) { writeAndFlush(channel, response); break; default: - LOG.error("Unknown op type {}, sending error", r.getOpCode()); + log.error().attr("opCode", r.getOpCode()).log("Unknown op type, sending error"); final BookieProtocol.Response errResponse = ResponseBuilder .buildErrorResponse(BookieProtocol.EBADREQ, r); writeAndFlush(channel, errResponse); @@ -456,10 +464,9 @@ private void processAddRequestV3(final BookkeeperProtocol.Request r, final Booki try { threadPool.executeOrdered(r.getAddRequest().getLedgerId(), write); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to process request to add entry at {}:{}. Too many pending requests", - r.getAddRequest().getLedgerId(), r.getAddRequest().getEntryId()); - } + log.debug().attr("ledgerId", r.getAddRequest().getLedgerId()) + .attr("entryId", r.getAddRequest().getEntryId()) + .log("Failed to process request to add entry. Too many pending requests"); getRequestStats().getAddEntryRejectedCounter().inc(); BookkeeperProtocol.AddResponse.Builder addResponse = BookkeeperProtocol.AddResponse.newBuilder() .setLedgerId(r.getAddRequest().getLedgerId()) @@ -492,10 +499,8 @@ private void processForceLedgerRequestV3(final BookkeeperProtocol.Request r, try { threadPool.executeOrdered(r.getForceLedgerRequest().getLedgerId(), forceLedger); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to process request to force ledger {}. Too many pending requests", - r.getForceLedgerRequest().getLedgerId()); - } + log.debug().attr("ledgerId", r.getForceLedgerRequest().getLedgerId()) + .log("Failed to process request to force ledger. Too many pending requests"); BookkeeperProtocol.ForceLedgerResponse.Builder forceLedgerResponse = BookkeeperProtocol.ForceLedgerResponse.newBuilder() .setLedgerId(r.getForceLedgerRequest().getLedgerId()) @@ -546,10 +551,9 @@ private void processReadRequestV3(final BookkeeperProtocol.Request r, final Book try { threadPool.executeOrdered(r.getReadRequest().getLedgerId(), read); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to process request to read entry at {}:{}. Too many pending requests", - r.getReadRequest().getLedgerId(), r.getReadRequest().getEntryId()); - } + log.debug().attr("ledgerId", r.getReadRequest().getLedgerId()) + .attr("entryId", r.getReadRequest().getEntryId()) + .log("Failed to process request to read entry. Too many pending requests"); getRequestStats().getReadEntryRejectedCounter().inc(); BookkeeperProtocol.ReadResponse.Builder readResponse = BookkeeperProtocol.ReadResponse.newBuilder() .setLedgerId(r.getReadRequest().getLedgerId()) @@ -577,11 +581,11 @@ private void processStartTLSRequestV3(final BookkeeperProtocol.Request r, final Channel c = requestHandler.ctx().channel(); if (shFactory == null) { - LOG.error("Got StartTLS request but TLS not configured"); + log.error("Got StartTLS request but TLS not configured"); response.setStatus(BookkeeperProtocol.StatusCode.EBADREQ); writeAndFlush(c, response.build()); } else { - LOG.info("Starting TLS handshake with client on channel {}", c); + log.info().attr("channel", c).log("Starting TLS handshake with client"); // there is no need to execute in a different thread as this operation is light SslHandler sslHandler = shFactory.newTLSHandler(); if (c.pipeline().names().contains(BookieNettyServer.CONSOLIDATION_HANDLER_NAME)) { @@ -607,12 +611,13 @@ public void operationComplete(Future future) throws Exception { * future.isSuccess() only checks if the result field is not null */ if (future.isSuccess() && authHandler.isAuthenticated()) { - LOG.info("Session is protected by: {}", sslHandler.engine().getSession().getCipherSuite()); + log.info().attr("cipherSuite", sslHandler.engine().getSession().getCipherSuite()) + .log("Session is protected"); } else { if (future.isSuccess()) { - LOG.error("TLS Handshake failed: Could not authenticate."); + log.error("TLS Handshake failed: Could not authenticate."); } else { - LOG.error("TLS Handshake failure: ", future.cause()); + log.error().exception(future.cause()).log("TLS Handshake failure"); } final BookkeeperProtocol.Response errResponse = BookkeeperProtocol.Response.newBuilder() .setHeader(r.getHeader()) @@ -668,10 +673,10 @@ private void processAddRequest(final BookieProtocol.ParsedAddRequest r, final Bo try { threadPool.executeOrdered(r.getLedgerId(), write); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to process request to add entry at {}:{}. Too many pending requests", r.ledgerId, - r.entryId); - } + log.debug() + .attr("ledgerId", r.ledgerId) + .attr("entryId", r.entryId) + .log("Failed to process request to add entry. Too many pending requests"); getRequestStats().getAddEntryRejectedCounter().inc(); write.sendWriteReqResponse( @@ -710,10 +715,10 @@ private void processReadRequest(final BookieProtocol.ReadRequest r, final Bookie try { threadPool.executeOrdered(r.getLedgerId(), read); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to process request to read entry at {}:{}. Too many pending requests", r.ledgerId, - r.entryId); - } + log.debug() + .attr("ledgerId", r.ledgerId) + .attr("entryId", r.entryId) + .log("Failed to process request to read entry. Too many pending requests"); getRequestStats().getReadEntryRejectedCounter().inc(); read.sendResponse( BookieProtocol.ETOOMANYREQUESTS, diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java index da2cbd86e1f..daf233a60ee 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java @@ -29,6 +29,7 @@ import java.lang.Thread.UncaughtExceptionHandler; import java.net.UnknownHostException; import java.util.Arrays; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieCriticalThread; import org.apache.bookkeeper.bookie.BookieException; @@ -48,13 +49,12 @@ import org.apache.bookkeeper.tls.SecurityHandlerFactory; import org.apache.bookkeeper.tls.SecurityProviderFactoryFactory; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implements the server-side part of the BookKeeper protocol. * */ +@CustomLog public class BookieServer { final ServerConfiguration conf; BookieNettyServer nettyServer; @@ -62,7 +62,6 @@ public class BookieServer { private final Bookie bookie; DeathWatcher deathWatcher; UncleanShutdownDetection uncleanShutdownDetection; - private static final Logger LOG = LoggerFactory.getLogger(BookieServer.class); int exitCode = ExitCode.OK; @@ -87,9 +86,9 @@ public BookieServer(ServerConfiguration conf, String configAsString; try { configAsString = conf.asJson(); - LOG.info(configAsString); + log.info(configAsString); } catch (ParseJsonException pe) { - LOG.error("Got ParseJsonException while converting Config to JSONString", pe); + log.error().exception(pe).log("Got ParseJsonException while converting Config to JSONString"); } this.statsLogger = statsLogger; @@ -176,9 +175,7 @@ public BookieRequestProcessor getBookieRequestProcessor() { */ @VisibleForTesting public void suspendProcessing() { - if (LOG.isDebugEnabled()) { - LOG.debug("Suspending bookie server, port is {}", conf.getBookiePort()); - } + log.debug().attr("port", conf.getBookiePort()).log("Suspending bookie server"); nettyServer.suspendProcessing(); } @@ -187,14 +184,12 @@ public void suspendProcessing() { */ @VisibleForTesting public void resumeProcessing() { - if (LOG.isDebugEnabled()) { - LOG.debug("Resuming bookie server, port is {}", conf.getBookiePort()); - } + log.debug().attr("port", conf.getBookiePort()).log("Resuming bookie server"); nettyServer.resumeProcessing(); } public synchronized void shutdown() { - LOG.info("Shutting down BookieServer"); + log.info("Shutting down BookieServer"); this.nettyServer.shutdown(); if (!running) { return; @@ -221,7 +216,7 @@ private void validateUser(ServerConfiguration conf) throws BookieException { "System cannot start because current user isn't in permittedStartupUsers." + " Current user: " + currentUser + " permittedStartupUsers: " + Arrays.toString(propertyValue); - LOG.error(errorMsg); + log.error(errorMsg); throw new BookieException.BookieUnauthorizedAccessException(errorMsg); } } @@ -261,8 +256,10 @@ private class DeathWatcher extends BookieCriticalThread { // set a default uncaught exception handler to shutdown the bookie server // when it notices the bookie is not running any more. setUncaughtExceptionHandler((thread, cause) -> { - LOG.info("BookieDeathWatcher exited loop due to uncaught exception from thread {}", - thread.getName(), cause); + log.info() + .exception(cause) + .attr("threadName", thread.getName()) + .log("BookieDeathWatcher exited loop due to uncaught exception"); shutdown(); }); } @@ -277,7 +274,7 @@ public void run() { Thread.currentThread().interrupt(); } if (!isBookieRunning()) { - LOG.info("BookieDeathWatcher noticed the bookie is not running any more, exiting the watch loop!"); + log.info("BookieDeathWatcher noticed the bookie is not running any more, exiting the watch loop!"); // death watcher has noticed that bookie is not running any more // throw an exception to fail the death watcher thread and it will // trigger the uncaught exception handler to handle this "bookie not running" situation. diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookkeeperInternalCallbacks.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookkeeperInternalCallbacks.java index 6760003521a..05929b4ad75 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookkeeperInternalCallbacks.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookkeeperInternalCallbacks.java @@ -28,6 +28,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; import org.apache.bookkeeper.client.LedgerEntry; @@ -40,17 +41,14 @@ import org.apache.bookkeeper.util.ByteBufList; import org.apache.bookkeeper.versioning.Versioned; import org.apache.zookeeper.AsyncCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Declaration of a callback interfaces used in bookkeeper client library but * not exposed to the client application. */ +@CustomLog public class BookkeeperInternalCallbacks { - static final Logger LOG = LoggerFactory.getLogger(BookkeeperInternalCallbacks.class); - /** * Callback for calls from BookieClient objects. Such calls are for replies * of write operations (operations to add an entry to a ledger). @@ -146,8 +144,10 @@ public static class FutureGetListOfEntriesOfLedger extends CompletableFuture mdcContextMap; protected PerChannelBookieClient perChannelBookieClient; - static final Logger LOG = LoggerFactory.getLogger(CompletionValue.class); - public CompletionValue(String operationName, Object ctx, long ledgerId, long entryId, PerChannelBookieClient perChannelBookieClient) { @@ -91,20 +89,26 @@ void timeout() { TimeUnit.NANOSECONDS); errorOut(BKException.Code.TimeoutException); } - - protected void logResponse(BookkeeperProtocol.StatusCode status, Object... extraInfo) { - if (LOG.isDebugEnabled()) { - LOG.debug("Got {} response from bookie:{} rc:{}, {}", operationName, - perChannelBookieClient.bookieId, status, Joiner.on(":").join(extraInfo)); - } + protected Event logEvent(BookkeeperProtocol.StatusCode status) { + return log.debug() + .attr("operation", operationName) + .attr("bookieId", perChannelBookieClient.bookieId) + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("status", status); } protected int convertStatus(BookkeeperProtocol.StatusCode status, int defaultStatus) { // convert to BKException code int rcToRet = statusCodeToExceptionCode(status); if (rcToRet == BKException.Code.UNINITIALIZED) { - LOG.error("{} for failed on bookie {} code {}", - operationName, perChannelBookieClient.bookieId, status); + log.error() + .attr("operation", operationName) + .attr("bookieId", perChannelBookieClient.bookieId) + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("statusCode", status) + .log("Operation failed on bookie"); return defaultStatus; } else { return rcToRet; @@ -157,11 +161,11 @@ protected void errorOutAndRunCallback(final Runnable callback) { if (c != null && c.remoteAddress() != null) { bAddress = c.remoteAddress().toString(); } - if (LOG.isDebugEnabled()) { - LOG.debug("Could not write {} request to bookie {} for ledger {}, entry {}", - operationName, bAddress, - ledgerId, entryId); - } + log.debug() + .attr("operation", operationName) + .attr("bookieAddress", bAddress) + .attr("ledgerId", ledgerId).attr("entryId", entryId) + .log("Could not write request to bookie"); callback.run(); }); } @@ -169,7 +173,7 @@ protected void errorOutAndRunCallback(final Runnable callback) { public void handleV2Response( long ledgerId, long entryId, BookkeeperProtocol.StatusCode status, BookieProtocol.Response response) { - LOG.warn("Unhandled V2 response {}", response); + log.warn().attr("response", response).log("Unhandled V2 response"); } public abstract void handleV3Response( diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DefaultPerChannelBookieClientPool.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DefaultPerChannelBookieClientPool.java index ed2be1088c5..8d59c6eebe4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DefaultPerChannelBookieClientPool.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/DefaultPerChannelBookieClientPool.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.net.BookieId; @@ -31,18 +32,15 @@ import org.apache.bookkeeper.tls.SecurityException; import org.apache.bookkeeper.tls.SecurityHandlerFactory; import org.apache.bookkeeper.tls.SecurityProviderFactoryFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provide a simple round-robin style channel pool. We could improve it later to do more * fantastic things. */ +@CustomLog class DefaultPerChannelBookieClientPool implements PerChannelBookieClientPool, GenericCallback { - static final Logger LOG = LoggerFactory.getLogger(DefaultPerChannelBookieClientPool.class); - final PerChannelBookieClientFactory factory; final BookieId address; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerCompletion.java index e0717056f43..0e964c06589 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerCompletion.java @@ -61,9 +61,7 @@ public void handleV3Response(BookkeeperProtocol.Response response) { ? forceLedgerResponse.getStatus() : response.getStatus(); long ledgerId = forceLedgerResponse.getLedgerId(); - if (LOG.isDebugEnabled()) { - logResponse(status, "ledger", ledgerId); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.WriteException); cb.forceLedgerComplete(rc, ledgerId, perChannelBookieClient.bookieId, ctx); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerProcessorV3.java index d6b6ae3b086..0c1a55e02ab 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ForceLedgerProcessorV3.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkArgument; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.net.BookieId; @@ -31,12 +32,10 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.Request; import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class ForceLedgerProcessorV3 extends PacketProcessorBaseV3 implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(ForceLedgerProcessorV3.class); public ForceLedgerProcessorV3(Request request, BookieRequestHandler requestHandler, BookieRequestProcessor requestProcessor) { @@ -100,7 +99,10 @@ private ForceLedgerResponse getForceLedgerResponse() { requestProcessor.getBookie().forceLedger(ledgerId, wcb, requestHandler); status = StatusCode.EOK; } catch (Throwable t) { - logger.error("Unexpected exception while forcing ledger {} : ", ledgerId, t); + log.error() + .exception(t) + .attr("ledgerId", ledgerId) + .log("Unexpected exception while forcing ledger"); // some bad request which cause unexpected exception status = StatusCode.EBADREQ; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoCompletion.java index e502749d791..83feb969f1c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoCompletion.java @@ -72,9 +72,10 @@ public void handleV3Response(BookkeeperProtocol.Response response) { long freeDiskSpace = getBookieInfoResponse.getFreeDiskSpace(); long totalDiskSpace = getBookieInfoResponse.getTotalDiskCapacity(); - if (LOG.isDebugEnabled()) { - logResponse(status, "freeDisk", freeDiskSpace, "totalDisk", totalDiskSpace); - } + logEvent(status) + .attr("totalDiskSpace", totalDiskSpace) + .attr("freeDiskSpace", freeDiskSpace) + .log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.ReadException); cb.getBookieInfoComplete(rc, diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoProcessorV3.java index cc223a1831a..875a91fe012 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetBookieInfoProcessorV3.java @@ -22,20 +22,19 @@ import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookkeeperProtocol.GetBookieInfoRequest; import org.apache.bookkeeper.proto.BookkeeperProtocol.GetBookieInfoResponse; import org.apache.bookkeeper.proto.BookkeeperProtocol.Request; import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A processor class for v3 bookie metadata packets. */ +@CustomLog public class GetBookieInfoProcessorV3 extends PacketProcessorBaseV3 implements Runnable { - private static final Logger LOG = LoggerFactory.getLogger(GetBookieInfoProcessorV3.class); public GetBookieInfoProcessorV3(Request request, BookieRequestHandler requestHandler, BookieRequestProcessor requestProcessor) { @@ -56,9 +55,7 @@ private GetBookieInfoResponse getGetBookieInfoResponse() { return getBookieInfoResponse.build(); } - if (LOG.isDebugEnabled()) { - LOG.debug("Received new getBookieInfo request: {}", request); - } + log.debug().attr("request", request).log("Received new getBookieInfo request"); StatusCode status = StatusCode.EOK; long freeDiskSpace = 0L, totalDiskSpace = 0L; try { @@ -70,14 +67,15 @@ private GetBookieInfoResponse getGetBookieInfoResponse() { totalDiskSpace = requestProcessor.getBookie().getTotalDiskSpace(); getBookieInfoResponse.setTotalDiskCapacity(totalDiskSpace); } - if (LOG.isDebugEnabled()) { - LOG.debug("FreeDiskSpace info is " + freeDiskSpace + " totalDiskSpace is: " + totalDiskSpace); - } + log.debug() + .attr("freeDiskSpace", freeDiskSpace) + .attr("totalDiskSpace", totalDiskSpace) + .log("FreeDiskSpace info"); requestProcessor.getRequestStats().getGetBookieInfoStats() .registerSuccessfulEvent(MathUtils.elapsedNanos(startTimeNanos), TimeUnit.NANOSECONDS); } catch (IOException e) { status = StatusCode.EIO; - LOG.error("IOException while getting freespace/totalspace", e); + log.error().exception(e).log("IOException while getting freespace/totalspace"); requestProcessor.getRequestStats().getGetBookieInfoStats() .registerFailedEvent(MathUtils.elapsedNanos(startTimeNanos), TimeUnit.NANOSECONDS); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerCompletion.java index fea19b83d3a..d500604ae86 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerCompletion.java @@ -69,9 +69,7 @@ public void handleV3Response(BookkeeperProtocol.Response response) { getListOfEntriesOfLedgerResponse.getAvailabilityOfEntriesOfLedger().asReadOnlyByteBuffer()); } - if (LOG.isDebugEnabled()) { - logResponse(status, "ledgerId", ledgerId); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.ReadException); AvailabilityOfEntriesOfLedger availabilityOfEntriesOfLedger = null; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerProcessorV3.java index e5897574a02..b54a368f09c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/GetListOfEntriesOfLedgerProcessorV3.java @@ -23,6 +23,7 @@ import com.google.protobuf.ByteString; import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookkeeperProtocol.GetListOfEntriesOfLedgerRequest; @@ -31,15 +32,12 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; import org.apache.bookkeeper.util.AvailabilityOfEntriesOfLedger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A processor class for v3 entries of a ledger packets. */ +@CustomLog public class GetListOfEntriesOfLedgerProcessorV3 extends PacketProcessorBaseV3 implements Runnable { - - private static final Logger LOG = LoggerFactory.getLogger(GetListOfEntriesOfLedgerProcessorV3.class); protected final GetListOfEntriesOfLedgerRequest getListOfEntriesOfLedgerRequest; protected final long ledgerId; @@ -64,9 +62,7 @@ private GetListOfEntriesOfLedgerResponse getListOfEntriesOfLedgerResponse() { return getListOfEntriesOfLedgerResponse.build(); } - if (LOG.isDebugEnabled()) { - LOG.debug("Received new getListOfEntriesOfLedger request: {}", request); - } + log.debug().attr("request", request).log("Received new getListOfEntriesOfLedger request"); StatusCode status = StatusCode.EOK; AvailabilityOfEntriesOfLedger availabilityOfEntriesOfLedger = null; try { @@ -77,10 +73,15 @@ private GetListOfEntriesOfLedgerResponse getListOfEntriesOfLedgerResponse() { } catch (Bookie.NoLedgerException e) { status = StatusCode.ENOLEDGER; - LOG.error("No ledger found while performing getListOfEntriesOfLedger from ledger: {}", ledgerId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .log("No ledger found while performing getListOfEntriesOfLedger"); } catch (IOException e) { status = StatusCode.EIO; - LOG.error("IOException while performing getListOfEntriesOfLedger from ledger: {}", ledgerId); + log.error() + .attr("ledgerId", ledgerId) + .log("IOException while performing getListOfEntriesOfLedger from ledger"); } if (status == StatusCode.EOK) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java index 658c37c5949..014065cf051 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java @@ -26,6 +26,7 @@ import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.LastAddConfirmedUpdateNotification; @@ -33,16 +34,13 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.ReadResponse; import org.apache.bookkeeper.proto.BookkeeperProtocol.Request; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Processor handling long poll read entry request. */ +@CustomLog class LongPollReadEntryProcessorV3 extends ReadEntryProcessorV3 implements Watcher { - private static final Logger logger = LoggerFactory.getLogger(LongPollReadEntryProcessorV3.class); - private final Long previousLAC; private Optional lastAddConfirmedUpdateTime = Optional.empty(); @@ -83,8 +81,10 @@ protected ReadResponse readEntry(ReadResponse.Builder readResponseBuilder, if (RequestUtils.shouldPiggybackEntry(readRequest)) { if (!readRequest.hasPreviousLAC() || (BookieProtocol.LAST_ADD_CONFIRMED != entryId)) { // This is not a valid request - client bug? - logger.error("Incorrect read request, entry piggyback requested incorrectly for ledgerId {} entryId {}", - ledgerId, entryId); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Incorrect read request, entry piggyback requested incorrectly"); return buildResponse(readResponseBuilder, StatusCode.EBADREQ, startTimeSw); } else { long knownLAC = requestProcessor.bookie.readLastAddConfirmed(ledgerId); @@ -95,27 +95,30 @@ protected ReadResponse readEntry(ReadResponse.Builder readResponseBuilder, if (lastAddConfirmedUpdateTime.isPresent()) { readResponseBuilder.setLacUpdateTimestamp(lastAddConfirmedUpdateTime.get()); } - if (logger.isDebugEnabled()) { - logger.debug("ReadLAC Piggy Back reading entry:{} from ledger: {}", entryId, ledgerId); - } + log.debug() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("ReadLAC Piggy Back reading entry"); try { return super.readEntry(readResponseBuilder, entryId, true, startTimeSw); } catch (Bookie.NoEntryException e) { requestProcessor.getRequestStats().getReadLastEntryNoEntryErrorCounter().inc(); - logger.info( - "No entry found while piggyback reading entry {} from ledger {} : previous lac = {}", - entryId, ledgerId, previousLAC); + log.info() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .attr("previousLAC", previousLAC) + .log("No entry found while piggyback reading entry"); // piggy back is best effort and this request can fail genuinely because of striping // entries across the ensemble return buildResponse(readResponseBuilder, StatusCode.EOK, startTimeSw); } } else { if (knownLAC < previousLAC) { - if (logger.isDebugEnabled()) { - logger.debug("Found smaller lac when piggy back reading lac and entry from ledger {} :" - + " previous lac = {}, known lac = {}", - ledgerId, previousLAC, knownLAC); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("previousLAC", previousLAC) + .attr("knownLAC", knownLAC) + .log("Found smaller lac when piggy back reading lac and entry"); } return buildResponse(readResponseBuilder, StatusCode.EOK, startTimeSw); } @@ -134,9 +137,7 @@ private ReadResponse buildErrorResponse(StatusCode statusCode, Stopwatch sw) { private ReadResponse getLongPollReadResponse() { if (!shouldReadEntry() && readRequest.hasTimeOut()) { - if (logger.isTraceEnabled()) { - logger.trace("Waiting For LAC Update {}", previousLAC); - } + log.trace().attr("previousLAC", previousLAC).log("Waiting For LAC Update"); final Stopwatch startTimeSw = Stopwatch.createStarted(); @@ -144,12 +145,17 @@ private ReadResponse getLongPollReadResponse() { try { watched = requestProcessor.getBookie().waitForLastAddConfirmedUpdate(ledgerId, previousLAC, this); } catch (Bookie.NoLedgerException e) { - logger.info("No ledger found while longpoll reading ledger {}, previous lac = {}.", - ledgerId, previousLAC); + log.info() + .attr("ledgerId", ledgerId) + .attr("previousLAC", previousLAC) + .log("No ledger found while longpoll reading"); return buildErrorResponse(StatusCode.ENOLEDGER, startTimeSw); } catch (IOException ioe) { - logger.error("IOException while longpoll reading ledger {}, previous lac = {} : ", - ledgerId, previousLAC, ioe); + log.error() + .exception(ioe) + .attr("ledgerId", ledgerId) + .attr("previousLAC", previousLAC) + .log("IOException while longpoll reading"); return buildErrorResponse(StatusCode.EIO, startTimeSw); } @@ -158,9 +164,10 @@ private ReadResponse getLongPollReadResponse() { if (watched) { // successfully registered watcher to lac updates - if (logger.isTraceEnabled()) { - logger.trace("Waiting For LAC Update {}: Timeout {}", previousLAC, readRequest.getTimeOut()); - } + log.trace() + .attr("previousLAC", previousLAC) + .attr("timeout", readRequest.getTimeOut()) + .log("Waiting For LAC Update"); synchronized (this) { expirationTimerTask = requestTimer.newTimeout(timeout -> { requestProcessor.getBookie().cancelWaitForLastAddConfirmedUpdate(ledgerId, this); @@ -190,10 +197,8 @@ public void update(LastAddConfirmedUpdateNotification newLACNotification) { if (newLACNotification.getLastAddConfirmed() != Long.MAX_VALUE && !lastAddConfirmedUpdateTime.isPresent()) { lastAddConfirmedUpdateTime = Optional.of(newLACNotification.getTimestamp()); } - if (logger.isTraceEnabled()) { - logger.trace("Last Add Confirmed Advanced to {} for request {}", - newLACNotification.getLastAddConfirmed(), request); - } + log.trace().attr("lastAddConfirmed", newLACNotification.getLastAddConfirmed()) + .attr("request", request).log("Last Add Confirmed Advanced"); scheduleDeferredRead(false); } newLACNotification.recycle(); @@ -201,9 +206,10 @@ public void update(LastAddConfirmedUpdateNotification newLACNotification) { private synchronized void scheduleDeferredRead(boolean timeout) { if (null == deferredTask) { - if (logger.isTraceEnabled()) { - logger.trace("Deferred Task, expired: {}, request: {}", timeout, request); - } + log.trace() + .attr("expired", timeout) + .attr("request", request) + .log("Deferred Task"); try { shouldReadEntry = true; deferredTask = longPollThreadPool.submit(this); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java index 1139fd3130e..bbbf730ecd9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java @@ -22,18 +22,17 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelPromise; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookieProtocol.Request; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.util.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A base class for bookeeper packet processors. */ +@CustomLog abstract class PacketProcessorBase implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(PacketProcessorBase.class); T request; BookieRequestHandler requestHandler; BookieRequestProcessor requestProcessor; @@ -57,10 +56,10 @@ protected boolean isVersionCompatible() { byte version = request.getProtocolVersion(); if (version < BookieProtocol.LOWEST_COMPAT_PROTOCOL_VERSION || version > BookieProtocol.CURRENT_PROTOCOL_VERSION) { - logger.error("Invalid protocol version, expected something between " - + BookieProtocol.LOWEST_COMPAT_PROTOCOL_VERSION - + " & " + BookieProtocol.CURRENT_PROTOCOL_VERSION - + ". got " + request.getProtocolVersion()); + log.error().attr("expectedMin", BookieProtocol.LOWEST_COMPAT_PROTOCOL_VERSION) + .attr("expectedMax", BookieProtocol.CURRENT_PROTOCOL_VERSION) + .attr("actual", request.getProtocolVersion()) + .log("Invalid protocol version"); return false; } return true; @@ -109,8 +108,10 @@ protected void sendResponse(int rc, Object response, OpStatsLogger statsLogger) } if (!channel.isWritable()) { - logger.warn("cannot write response to non-writable channel {} for request {}", channel, - StringUtils.requestToString(request)); + log.warn() + .attr("channel", channel) + .attr("request", StringUtils.requestToString(request)) + .log("cannot write response to non-writable channel"); requestProcessor.getRequestStats().getChannelWriteStats() .registerFailedEvent(MathUtils.elapsedNanos(writeNanos), TimeUnit.NANOSECONDS); statsLogger.registerFailedEvent(MathUtils.elapsedNanos(enqueueNanos), TimeUnit.NANOSECONDS); @@ -124,25 +125,22 @@ protected void sendResponse(int rc, Object response, OpStatsLogger statsLogger) } if (channel.isActive()) { - final ChannelPromise promise; - if (logger.isDebugEnabled()) { - promise = channel.newPromise().addListener(future -> { - if (!future.isSuccess()) { - logger.debug("Netty channel write exception. ", future.cause()); - } - }); - } else { - promise = channel.voidPromise(); - } + final ChannelPromise promise = channel.newPromise(); + + log.debug(e -> + promise.addListener(future -> { + if (!future.isSuccess()) { + e.exception(future.cause()).log("Netty channel write exception"); + } + }) + ); channel.writeAndFlush(response, promise); } else { if (response instanceof BookieProtocol.Response) { ((BookieProtocol.Response) response).release(); } - if (logger.isDebugEnabled()) { - logger.debug("Netty channel {} is inactive, " - + "hence bypassing netty channel writeAndFlush during sendResponse", channel); - } + log.debug().attr("channel", channel) + .log("Netty channel is inactive, hence bypassing netty channel writeAndFlush during sendResponse"); } if (BookieProtocol.EOK == rc) { statsLogger.registerSuccessfulEvent(MathUtils.elapsedNanos(enqueueNanos), TimeUnit.NANOSECONDS); @@ -166,8 +164,8 @@ protected void sendResponseAndWait(int rc, Object response, OpStatsLogger statsL Channel channel = requestHandler.ctx().channel(); ChannelFuture future = channel.writeAndFlush(response); future.addListener((ChannelFutureListener) f -> { - if (!f.isSuccess() && logger.isDebugEnabled()) { - logger.debug("Netty channel write exception. ", f.cause()); + if (!f.isSuccess()) { + log.debug().exception(f.cause()).log("Netty channel write exception"); } if (BookieProtocol.EOK == rc) { statsLogger.registerSuccessfulEvent( @@ -179,9 +177,7 @@ protected void sendResponseAndWait(int rc, Object response, OpStatsLogger statsL processor.onReadRequestFinish(); }); } catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Netty channel write exception. ", e); - } + log.debug().exception(e).log("Netty channel write exception"); if (BookieProtocol.EOK == rc) { statsLogger.registerSuccessfulEvent( MathUtils.elapsedNanos(capturedEnqueueNanos), TimeUnit.NANOSECONDS); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBaseV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBaseV3.java index 96f76bef7e0..b9f257ceca9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBaseV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBaseV3.java @@ -24,7 +24,7 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import java.util.concurrent.TimeUnit; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookkeeperProtocol.BKPacketHeader; import org.apache.bookkeeper.proto.BookkeeperProtocol.ProtocolVersion; @@ -36,7 +36,7 @@ /** * A base class for bookkeeper protocol v3 packet processors. */ -@Slf4j +@CustomLog public abstract class PacketProcessorBaseV3 implements Runnable { final Request request; @@ -78,8 +78,10 @@ protected void sendResponse(StatusCode code, Object response, OpStatsLogger stat } if (!channel.isWritable()) { - log.warn("cannot write response to non-writable channel {} for request {}", channel, - StringUtils.requestToString(request)); + log.warn() + .attr("channel", channel) + .attr("request", StringUtils.requestToString(request)) + .log("cannot write response to non-writable channel"); requestProcessor.getRequestStats().getChannelWriteStats() .registerFailedEvent(MathUtils.elapsedNanos(writeNanos), TimeUnit.NANOSECONDS); statsLogger.registerFailedEvent(MathUtils.elapsedNanos(enqueueNanos), TimeUnit.NANOSECONDS); @@ -108,8 +110,8 @@ public void operationComplete(ChannelFuture future) throws Exception { } }); } else { - log.debug("Netty channel {} is inactive, " - + "hence bypassing netty channel writeAndFlush during sendResponse", channel); + log.debug().attr("channel", channel) + .log("Netty channel is inactive, hence bypassing netty channel writeAndFlush during sendResponse"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java index 25abe5e7031..fed67ffae72 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java @@ -22,6 +22,7 @@ import com.google.protobuf.ByteString; import com.google.protobuf.ExtensionRegistry; import com.google.protobuf.UnsafeByteOperations; +import io.github.merlimat.slog.Logger; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; @@ -131,8 +132,6 @@ import org.apache.bookkeeper.util.StringUtils; import org.apache.bookkeeper.util.collections.ConcurrentOpenHashMap; import org.apache.bookkeeper.util.collections.SynchronizedHashMultiMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.slf4j.MDC; /** @@ -146,7 +145,7 @@ @Sharable public class PerChannelBookieClient extends ChannelInboundHandlerAdapter { - static final Logger LOG = LoggerFactory.getLogger(PerChannelBookieClient.class); + private final Logger log; // this set contains the bookie error return codes that we do not consider for a bookie to be "faulty" protected static final Set EXPECTED_BK_OPERATION_ERRORS = Collections.unmodifiableSet(Sets @@ -374,6 +373,11 @@ public PerChannelBookieClient(ClientConfiguration conf, OrderedExecutor executor this.maxFrameSize = conf.getNettyMaxFrameSizeBytes(); this.conf = conf; this.bookieId = bookieId; + this.log = Logger.get(PerChannelBookieClient.class) + .with() + .attr("bookieId", bookieId) + .attr("channel", () -> channel) + .build(); this.bookieAddressResolver = bookieAddressResolver; this.executor = executor; if (LocalBookiesRegistry.isLocalBookie(bookieId)) { @@ -471,13 +475,15 @@ public void disconnect() { if (c != null) { c.close().addListener(x -> makeWritable()); } - LOG.info("authplugin disconnected channel {}", channel); + log.info("authplugin disconnected"); } @Override public void setAuthorizedId(BookKeeperPrincipal principal) { authorizedId = principal; - LOG.info("connection {} authenticated as {}", channel, principal); + log.info() + .attr("principal", principal) + .log("connection authenticated"); } @Override @@ -517,15 +523,12 @@ protected long getNumPendingCompletionRequests() { protected ChannelFuture connect() { final long startTime = MathUtils.nowInNano(); - if (LOG.isDebugEnabled()) { - LOG.debug("Connecting to bookie: {}", bookieId); - } + log.debug("Connecting to bookie"); BookieSocketAddress addr; try { addr = bookieAddressResolver.resolve(bookieId); } catch (BookieAddressResolver.BookieIdNotResolvedException err) { - LOG.error("Cannot connect to {} as endpoint resolution failed (probably bookie is down) err {}", - bookieId, err.toString()); + log.error().exception(err).log("Cannot connect as endpoint resolution failed (probably bookie is down)"); return processBookieNotResolvedError(startTime, err); } @@ -720,7 +723,7 @@ void writeLac(final long ledgerId, final byte[] masterKey, final long lac, ByteB void forceLedger(final long ledgerId, ForceLedgerCallback cb, Object ctx) { if (useV2WireProtocol) { - LOG.error("force is not allowed with v2 protocol"); + log.error("force is not allowed with v2 protocol"); executor.executeOrdered(ledgerId, () -> { cb.forceLedgerComplete(BKException.Code.IllegalOpException, ledgerId, bookieId, ctx); }); @@ -778,7 +781,7 @@ void addEntry(final long ledgerId, byte[] masterKey, final long entryId, Referen Runnable cleanupActionAfterWrite = null; if (useV2WireProtocol) { if (writeFlags.contains(WriteFlag.DEFERRED_SYNC)) { - LOG.error("invalid writeflags {} for v2 protocol", writeFlags); + log.error().attr("writeFlags", writeFlags).log("invalid writeflags for v2 protocol"); cb.writeComplete(BKException.Code.IllegalOpException, ledgerId, entryId, bookieId, ctx); return; } @@ -1074,8 +1077,9 @@ public void checkTimeoutOnPendingOperations() { timedOutOperations += completionObjectsV2Conflicts.removeIf(timeoutCheck); if (timedOutOperations > 0) { - LOG.info("Timed-out {} operations to channel {} for {}", - timedOutOperations, channel, bookieId); + log.info() + .attr("timedOutOperations", timedOutOperations) + .log("Timed-out operations"); } } @@ -1087,7 +1091,7 @@ public void disconnect() { } public void disconnect(boolean wait) { - LOG.info("Disconnecting the per channel bookie client for {}", bookieId); + log.info("Disconnecting the per channel bookie client"); closeInternal(false, wait); } @@ -1099,7 +1103,7 @@ public void close() { } public void close(boolean wait) { - LOG.info("Closing the per channel bookie client for {}", bookieId); + log.info("Closing the per channel bookie client"); closeLock.writeLock().lock(); try { if (ConnectionState.CLOSED == state) { @@ -1141,9 +1145,7 @@ private void closeInternal(boolean permanent, boolean wait) { } private ChannelFuture closeChannel(Channel c) { - if (LOG.isDebugEnabled()) { - LOG.debug("Closing channel {}", c); - } + log.debug().attr("channel", c).log("Closing channel"); return c.close().addListener(x -> makeWritable()); } @@ -1168,7 +1170,7 @@ private void writeAndFlush(final Channel channel, final boolean allowFastFail, final Runnable cleanupActionFailedBeforeWrite, final Runnable cleanupActionAfterWrite) { if (channel == null) { - LOG.warn("Operation {} failed: channel == null", StringUtils.requestToString(request)); + log.warn().attr("request", StringUtils.requestToString(request)).log("Operation failed: channel == null"); errorOut(key); if (cleanupActionFailedBeforeWrite != null) { cleanupActionFailedBeforeWrite.run(); @@ -1183,8 +1185,8 @@ private void writeAndFlush(final Channel channel, } if (allowFastFail && !isWritable) { - LOG.warn("Operation {} failed: TooManyRequestsException", - StringUtils.requestToString(request)); + log.warn().attr("request", StringUtils.requestToString(request)) + .log("Operation failed: TooManyRequestsException"); errorOut(key, BKException.Code.TooManyRequestsException); if (cleanupActionFailedBeforeWrite != null) { @@ -1208,7 +1210,7 @@ private void writeAndFlush(final Channel channel, try { future.get(); } catch (Exception ex) { - LOG.warn("Failed to request to the bookie: {}", bookieId, ex); + log.warn().exception(ex).log("Failed to request to the bookie"); } nettyOpLogger.registerFailedEvent(MathUtils.elapsedNanos(startTime), TimeUnit.NANOSECONDS); errorOut(key); @@ -1221,7 +1223,10 @@ private void writeAndFlush(final Channel channel, }); channel.writeAndFlush(request, promise); } catch (Throwable e) { - LOG.warn("Operation {} failed", StringUtils.requestToString(request), e); + log.warn() + .exception(e) + .attr("request", StringUtils.requestToString(request)) + .log("Operation failed"); errorOut(key); if (cleanupActionFailedBeforeWrite != null) { cleanupActionFailedBeforeWrite.run(); @@ -1230,9 +1235,7 @@ private void writeAndFlush(final Channel channel, } void errorOut(final CompletionKey key) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removing completion key: {}", key); - } + log.debug().attr("completionKey", key).log("Removing completion key"); CompletionValue completion = completionObjects.remove(key); if (completion != null) { completion.errorOut(); @@ -1243,9 +1246,7 @@ void errorOut(final CompletionKey key) { } void errorOut(final CompletionKey key, final int rc) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removing completion key: {}", key); - } + log.debug().attr("completionKey", key).log("Removing completion key"); CompletionValue completion = completionObjects.remove(key); if (completion != null) { completion.errorOut(rc); @@ -1301,7 +1302,7 @@ void recordError() { */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - LOG.info("Disconnected from bookie channel {}", ctx.channel()); + log.info().attr("channel", ctx.channel()).log("Disconnected from bookie channel"); if (ctx.channel() != null) { closeChannel(ctx.channel()); if (ctx.channel().pipeline().get(SslHandler.class) != null) { @@ -1334,13 +1335,13 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { exceptionCounter.inc(); if (cause instanceof CorruptedFrameException || cause instanceof TooLongFrameException) { - LOG.error("Corrupted frame received from bookie: {}", ctx.channel()); + log.error().attr("channel", ctx.channel()).log("Corrupted frame received from bookie"); ctx.close(); return; } if (cause instanceof AuthHandler.AuthenticationException) { - LOG.error("Error authenticating connection", cause); + log.error().exception(cause).log("Error authenticating connection"); errorOutOutstandingEntries(BKException.Code.UnauthorizedAccessException); Channel c = ctx.channel(); if (c != null) { @@ -1353,7 +1354,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E // see https://stackoverflow.com/a/62465859 for details about the reason // therefore catch SSLException to also cover TLSv1.3 if (cause instanceof DecoderException && cause.getCause() instanceof SSLException) { - LOG.error("TLS handshake failed", cause); + log.error().exception(cause).log("TLS handshake failed"); errorOutPendingOps(BKException.Code.SecurityException); Channel c = ctx.channel(); if (c != null) { @@ -1366,9 +1367,15 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E if (cause instanceof NativeIoException) { // Stack trace is not very interesting for native IO exceptio, the important part is in // the exception message - LOG.warn("Exception caught on:{} cause: {}", ctx.channel(), cause.getMessage()); + log.warn() + .attr("channel", ctx.channel()) + .attr("cause", cause.getMessage()) + .log("Exception caught"); } else { - LOG.warn("Exception caught on:{} cause:", ctx.channel(), cause); + log.warn() + .exception(cause) + .attr("channel", ctx.channel()) + .log("Exception caught"); } ctx.close(); return; @@ -1376,12 +1383,10 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E synchronized (this) { if (state == ConnectionState.CLOSED) { - if (LOG.isDebugEnabled()) { - LOG.debug("Unexpected exception caught by bookie client channel handler, " - + "but the client is closed, so it isn't important", cause); - } + log.debug().exception(cause) + .log("Unexpected exception caught by bookie client channel handler, but the client is closed"); } else { - LOG.error("Unexpected exception caught by bookie client channel handler", cause); + log.error().exception(cause).log("Unexpected exception caught by bookie client channel handler"); } } @@ -1421,10 +1426,9 @@ private void readV2Response(final BookieProtocol.Response response) { if (null == completionValue) { // Unexpected response, so log it. The txnId should have been present. - if (LOG.isDebugEnabled()) { - LOG.debug("Unexpected response received from bookie : " + bookieId + " for type : " + operationType - + " and ledger:entry : " + response.ledgerId + ":" + response.entryId); - } + log.debug().attr("operationType", operationType) + .attr("ledgerId", response.ledgerId).attr("entryId", response.entryId) + .log("Unexpected response received from bookie"); response.release(); } else { long orderingKey = completionValue.ledgerId; @@ -1539,10 +1543,9 @@ private void readV3Response(final Response response) { if (null == completionValue) { // Unexpected response, so log it. The txnId should have been present. - if (LOG.isDebugEnabled()) { - LOG.debug("Unexpected response received from bookie : " + bookieId + " for type : " - + header.getOperation() + " and txnId : " + header.getTxnId()); - } + log.debug().attr("operationType", header.getOperation()) + .attr("txnId", header.getTxnId()) + .log("Unexpected response received from bookie"); } else { long orderingKey = completionValue.ledgerId; executor.executeOrdered(orderingKey, new Runnable() { @@ -1578,7 +1581,10 @@ void initTLSHandshake() { } else { throw new RuntimeException("Unexpected socket address type"); } - LOG.info("Starting TLS handshake with {}:{}", address.getHostString(), address.getPort()); + log.info() + .attr("host", address.getHostString()) + .attr("port", address.getPort()) + .log("Starting TLS handshake"); SslHandler sslHandler = parentObj.shFactory.newTLSHandler(address.getHostName(), address.getPort()); String sslHandlerName = parentObj.shFactory.getHandlerName(); if (channel.pipeline().names().contains(CONSOLIDATION_HANDLER_NAME)) { @@ -1595,7 +1601,8 @@ public void operationComplete(Future future) throws Exception { synchronized (PerChannelBookieClient.this) { if (future.isSuccess() && state == ConnectionState.CONNECTING) { - LOG.error("Connection state changed before TLS handshake completed {}/{}", bookieId, state); + log.error().attr("state", state) + .log("Connection state changed before TLS handshake completed"); rc = BKException.Code.BookieHandleNotAvailableException; closeChannel(channel); channel = null; @@ -1604,7 +1611,7 @@ public void operationComplete(Future future) throws Exception { } } else if (future.isSuccess() && state == ConnectionState.START_TLS) { rc = BKException.Code.OK; - LOG.info("Successfully connected to bookie using TLS: " + bookieId); + log.info("Successfully connected to bookie using TLS"); state = ConnectionState.CONNECTED; AuthHandler.ClientSideHandler authHandler = future.get().pipeline() @@ -1613,22 +1620,20 @@ public void operationComplete(Future future) throws Exception { activeTlsChannelCounter.inc(); } else if (future.isSuccess() && (state == ConnectionState.CLOSED || state == ConnectionState.DISCONNECTED)) { - LOG.warn("Closed before TLS handshake completed, clean up: {}, current state {}", - channel, state); + log.warn() + .attr("state", state) + .log("Closed before TLS handshake completed, clean up"); closeChannel(channel); rc = BKException.Code.BookieHandleNotAvailableException; channel = null; } else if (future.isSuccess() && state == ConnectionState.CONNECTED) { - if (LOG.isDebugEnabled()) { - LOG.debug("Already connected with another channel({}), " - + "so close the new channel({})", - channel, channel); - } + log.debug("Already connected with another channel, so close the new channel"); closeChannel(channel); return; // pendingOps should have been completed when other channel connected } else { - LOG.error("TLS handshake failed with bookie: {}/{}, current state {} : ", - channel, bookieId, state, future.cause()); + log.error() + .exception(future.cause()) + .attr("state", state).log("TLS handshake failed with bookie"); rc = BKException.Code.SecurityException; closeChannel(channel); channel = null; @@ -1742,9 +1747,10 @@ class ConnectionFutureListener implements ChannelFutureListener { @Override public void operationComplete(ChannelFuture future) { - if (LOG.isDebugEnabled()) { - LOG.debug("Channel connected ({}) {}", future.isSuccess(), future.channel()); - } + log.debug() + .attr("success", future.isSuccess()) + .attr("channel", future.channel()) + .log("Channel connected"); int rc; Queue> oldPendingOps; @@ -1763,18 +1769,20 @@ public void operationComplete(ChannelFuture future) { rc = BKException.Code.OK; channel = future.channel(); if (shFactory != null) { - LOG.info("Successfully connected to bookie: {} {} initiate TLS", bookieId, future.channel()); + log.info() + .attr("channel", future.channel()) + .log("Successfully connected to bookie, initiate TLS"); makeWritable(); initiateTLS(); return; } else { - LOG.info("Successfully connected to bookie: {} {}", bookieId, future.channel()); + log.info().attr("channel", future.channel()).log("Successfully connected to bookie"); state = ConnectionState.CONNECTED; activeNonTlsChannelCounter.inc(); } } else if (future.isSuccess() && state == ConnectionState.START_TLS) { rc = BKException.Code.OK; - LOG.info("Successfully connected to bookie using TLS: " + bookieId); + log.info("Successfully connected to bookie using TLS"); state = ConnectionState.CONNECTED; AuthHandler.ClientSideHandler authHandler = future.channel().pipeline() @@ -1783,28 +1791,34 @@ public void operationComplete(ChannelFuture future) { activeTlsChannelCounter.inc(); } else if (future.isSuccess() && (state == ConnectionState.CLOSED || state == ConnectionState.DISCONNECTED)) { - LOG.warn("Closed before connection completed, clean up: {}, current state {}", - future.channel(), state); + log.warn() + .attr("channel", future.channel()) + .attr("state", state) + .log("Closed before connection completed, clean up"); closeChannel(future.channel()); rc = BKException.Code.BookieHandleNotAvailableException; channel = null; } else if (future.isSuccess() && state == ConnectionState.CONNECTED) { - if (LOG.isDebugEnabled()) { - LOG.debug("Already connected with another channel({}), so close the new channel({})", channel, - future.channel()); - } + log.debug() + .attr("existingChannel", channel) + .attr("newChannel", future.channel()) + .log("Already connected with another channel, so close the new channel"); closeChannel(future.channel()); return; // pendingOps should have been completed when other channel connected } else { Throwable cause = future.cause(); if (cause instanceof UnknownHostException || cause instanceof NativeIoException) { // Don't log stack trace for common errors - logBookieUnavailable(() -> LOG.warn("Could not connect to bookie: {}/{}, current state {} : {}", - future.channel(), bookieId, state, future.cause().getMessage())); + logBookieUnavailable(() -> + log.warn().attr("channel", future.channel()) + .attr("state", state).attr("cause", future.cause().getMessage()) + .log("Could not connect to bookie")); } else { // Regular exceptions, include stack trace - logBookieUnavailable(() -> LOG.error("Could not connect to bookie: {}/{}, current state {} : ", - future.channel(), bookieId, state, future.cause())); + logBookieUnavailable(() -> + log.error().exception(future.cause()) + .attr("channel", future.channel()).attr("state", state) + .log("Could not connect to bookie")); } rc = BKException.Code.BookieHandleNotAvailableException; @@ -1847,7 +1861,7 @@ private void logBookieUnavailable(Runnable logger) { } private void initiateTLS() { - LOG.info("Initializing TLS to {}", channel); + log.info("Initializing TLS"); assert state == ConnectionState.CONNECTING; final long txnId = getTxnId(); final CompletionKey completionKey = new TxnCompletionKey(txnId, OperationType.START_TLS); @@ -1865,7 +1879,9 @@ private void initiateTLS() { } protected void failTLS(int rc) { - LOG.error("TLS failure on: {}, rc: {}", channel, rc); + log.error() + .attr("rc", rc) + .log("TLS failure"); Queue> oldPendingOps; synchronized (this) { disconnect(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadCompletion.java index d9639397b1a..b34d4e370a6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadCompletion.java @@ -109,10 +109,9 @@ private void handleReadResponse(long ledgerId, ByteBuf buffer, long maxLAC, // max known lac piggy-back from bookies long lacUpdateTimestamp) { // the timestamp when the lac is updated. - int readableBytes = buffer.readableBytes(); - if (LOG.isDebugEnabled()) { - logResponse(status, "ledger", ledgerId, "entry", entryId, "entryLength", readableBytes); - } + logEvent(status) + .attr("entryLength", buffer.readableBytes()) + .log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.ReadException); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java index 38088a5c44e..25c8bf3aa3a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java @@ -27,18 +27,17 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.common.concurrent.FutureEventListener; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.proto.BookieProtocol.ReadRequest; import org.apache.bookkeeper.stats.OpStatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class ReadEntryProcessor extends PacketProcessorBase { - private static final Logger LOG = LoggerFactory.getLogger(ReadEntryProcessor.class); protected ExecutorService fenceThreadPool; protected boolean throttleReadResponses; @@ -58,13 +57,9 @@ public static ReadEntryProcessor create(ReadRequest request, @Override protected void processPacket() { - if (LOG.isDebugEnabled()) { - LOG.debug("Received new read request: {}", request); - } + log.debug().attr("request", request).log("Received new read request"); if (!requestHandler.ctx().channel().isOpen()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Dropping read request for closed channel: {}", requestHandler.ctx().channel()); - } + log.debug().attr("channel", requestHandler.ctx().channel()).log("Dropping read request for closed channel"); requestProcessor.onReadRequestFinish(); recycle(); return; @@ -75,55 +70,67 @@ protected void processPacket() { try { CompletableFuture fenceResult = null; if (request.isFencing()) { - LOG.warn("Ledger: {} fenced by: {}", request.getLedgerId(), - requestHandler.ctx().channel().remoteAddress()); + log.warn().attr("ledgerId", request.getLedgerId()) + .attr("fencedBy", requestHandler.ctx().channel().remoteAddress()) + .log("Ledger fenced"); if (request.hasMasterKey()) { fenceResult = requestProcessor.getBookie().fenceLedger(request.getLedgerId(), request.getMasterKey()); } else { - LOG.error("Password not provided, Not safe to fence {}", request.getLedgerId()); + log.error().attr("ledgerId", request.getLedgerId()).log("Password not provided, Not safe to fence"); throw BookieException.create(BookieException.Code.UnauthorizedAccessException); } } data = readData(); - if (LOG.isDebugEnabled()) { - LOG.debug("##### Read entry ##### -- ref-count: {}", data.refCnt()); - } + log.debug().attr("refCount", data.refCnt()).log("Read entry"); if (fenceResult != null) { handleReadResultForFenceRead(fenceResult, data, startTimeNanos); return; } } catch (Bookie.NoLedgerException | BookieException.LedgerFencedAndDeletedException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Error reading {}", request, e); - } + log.debug() + .exception(e) + .attr("request", request) + .log("Error reading"); errorCode = BookieProtocol.ENOLEDGER; } catch (Bookie.NoEntryException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Error reading {}", request, e); - } + log.debug() + .exception(e) + .attr("request", request) + .log("Error reading"); errorCode = BookieProtocol.ENOENTRY; } catch (IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Error reading {}", request, e); - } + log.debug() + .exception(e) + .attr("request", request) + .log("Error reading"); errorCode = BookieProtocol.EIO; } catch (BookieException.DataUnknownException e) { - LOG.error("Ledger {} is in an unknown state", request.getLedgerId(), e); + log.error() + .exception(e) + .attr("ledgerId", request.getLedgerId()) + .log("Ledger is in an unknown state"); errorCode = BookieProtocol.EUNKNOWNLEDGERSTATE; } catch (BookieException e) { - LOG.error("Unauthorized access to ledger {}", request.getLedgerId(), e); + log.error() + .exception(e) + .attr("ledgerId", request.getLedgerId()) + .log("Unauthorized access to ledger"); errorCode = BookieProtocol.EUA; } catch (Throwable t) { - LOG.error("Unexpected exception reading at {}:{} : {}", request.getLedgerId(), request.getEntryId(), - t.getMessage(), t); + log.error() + .exception(t) + .attr("ledgerId", request.getLedgerId()) + .attr("entryId", request.getEntryId()) + .log("Unexpected exception reading"); errorCode = BookieProtocol.EBADREQ; } - if (LOG.isTraceEnabled()) { - LOG.trace("Read entry rc = {} for {}", errorCode, request); - } + log.trace() + .attr("rc", errorCode) + .attr("request", request) + .log("Read entry"); sendResponse(data, errorCode, startTimeNanos); } @@ -171,7 +178,7 @@ public void onSuccess(Boolean result) { @Override public void onFailure(Throwable t) { - LOG.error("Error processing fence request", t); + log.error().exception(t).log("Error processing fence request"); // if failed to fence, fail the read request to make it retry. sendResponse(data, BookieProtocol.EIO, startTimeNanos); } @@ -183,11 +190,20 @@ public void onFailure(Throwable t) { return; } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupting fence read entry {}", request, ie); + log.error() + .exception(ie) + .attr("request", request) + .log("Interrupting fence read entry"); } catch (ExecutionException ee) { - LOG.error("Failed to fence read entry {}", request, ee.getCause()); + log.error() + .exception(ee.getCause()) + .attr("request", request) + .log("Failed to fence read entry"); } catch (TimeoutException te) { - LOG.error("Timeout to fence read entry {}", request, te); + log.error() + .exception(te) + .attr("request", request) + .log("Timeout to fence read entry"); } sendResponse(data, BookieProtocol.EIO, startTimeNanos); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java index e4519ff20cf..7f26c8aca48 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java @@ -26,6 +26,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.common.concurrent.FutureEventListener; @@ -36,13 +37,10 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; import org.apache.bookkeeper.stats.OpStatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class ReadEntryProcessorV3 extends PacketProcessorBaseV3 { - private static final Logger LOG = LoggerFactory.getLogger(ReadEntryProcessorV3.class); - protected Stopwatch lastPhaseStartTime; private final ExecutorService fenceThreadPool; @@ -117,8 +115,11 @@ public void onSuccess(Boolean result) { @Override public void onFailure(Throwable t) { - LOG.error("Fence request for ledgerId {} entryId {} encountered exception", - ledgerId, entryId, t); + log.error() + .exception(t) + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Fence request encountered exception"); sendFenceResponse(readResponseBuilder, entryBody, false, startTimeSw); } }, fenceThreadPool); @@ -127,8 +128,11 @@ public void onFailure(Throwable t) { try { success = fenceResult.get(1000, TimeUnit.MILLISECONDS); } catch (Throwable t) { - LOG.error("Fence request for ledgerId {} entryId {} encountered exception : ", - readRequest.getLedgerId(), readRequest.getEntryId(), t); + log.error() + .exception(t) + .attr("ledgerId", readRequest.getLedgerId()) + .attr("entryId", readRequest.getEntryId()) + .log("Fence request encountered exception"); } sendFenceResponse(readResponseBuilder, entryBody, success, startTimeSw); } @@ -202,12 +206,15 @@ protected ReadResponse getReadResponse() { try { // handle fence request if (RequestUtils.isFenceRequest(readRequest)) { - LOG.info("Ledger fence request received for ledger: {} from address: {}", ledgerId, - channel.remoteAddress()); + log.info() + .attr("ledgerId", ledgerId) + .attr("address", channel.remoteAddress()) + .log("Ledger fence request received"); if (!readRequest.hasMasterKey()) { - LOG.error( - "Fence ledger request received without master key for ledger:{} from address: {}", - ledgerId, channel.remoteAddress()); + log.error() + .attr("ledgerId", ledgerId) + .attr("address", channel.remoteAddress()) + .log("Fence ledger request received without master key"); throw BookieException.create(BookieException.Code.UnauthorizedAccessException); } else { byte[] masterKey = readRequest.getMasterKey().toByteArray(); @@ -217,32 +224,48 @@ protected ReadResponse getReadResponse() { return readEntry(readResponse, entryId, startTimeSw); } catch (Bookie.NoLedgerException | BookieException.LedgerFencedAndDeletedException e) { if (RequestUtils.isFenceRequest(readRequest)) { - LOG.info("No ledger found(or it has been deleted) reading entry {} when fencing ledger {}", - entryId, ledgerId); + log.info() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("No ledger found (or it has been deleted) reading entry when fencing ledger"); } else if (entryId != BookieProtocol.LAST_ADD_CONFIRMED) { - LOG.info("No ledger found while reading entry: {} from ledger: {}", entryId, ledgerId); - } else if (LOG.isDebugEnabled()) { + log.info() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("No ledger found while reading entry from ledger"); + } else { // this is the case of a reader which is calling readLastAddConfirmed and the ledger is empty - LOG.debug("No ledger found while reading entry: {} from ledger: {}", entryId, ledgerId); + log.debug() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("No ledger found while reading entry from ledger"); } return buildResponse(readResponse, StatusCode.ENOLEDGER, startTimeSw); } catch (Bookie.NoEntryException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("No entry found while reading entry: {} from ledger: {}", entryId, ledgerId); - } + log.debug() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("No entry found while reading entry from ledger"); return buildResponse(readResponse, StatusCode.ENOENTRY, startTimeSw); } catch (IOException e) { - LOG.error("IOException while reading entry: {} from ledger {} ", entryId, ledgerId, e); + log.error() + .exception(e) + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("IOException while reading entry from ledger"); return buildResponse(readResponse, StatusCode.EIO, startTimeSw); } catch (BookieException.DataUnknownException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger has unknown state for entry: {} from ledger {}", entryId, ledgerId); - } + log.debug() + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Ledger has unknown state for entry"); return buildResponse(readResponse, StatusCode.EUNKNOWNLEDGERSTATE, startTimeSw); } catch (BookieException e) { - LOG.error( - "Unauthorized access to ledger:{} while reading entry:{} in request from address: {}", - ledgerId, entryId, channel.remoteAddress()); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("address", channel.remoteAddress()) + .log("Unauthorized access to ledger while reading entry"); return buildResponse(readResponse, StatusCode.EUA, startTimeSw); } } @@ -252,9 +275,7 @@ public void run() { requestProcessor.getRequestStats().getReadEntrySchedulingDelayStats().registerSuccessfulEvent( MathUtils.elapsedNanos(enqueueNanos), TimeUnit.NANOSECONDS); if (!requestHandler.ctx().channel().isOpen()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Dropping read request for closed channel: {}", requestHandler.ctx().channel()); - } + log.debug().attr("channel", requestHandler.ctx().channel()).log("Dropping read request for closed channel"); requestProcessor.onReadRequestFinish(); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacCompletion.java index a5eadbf49a7..f86afdd499f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacCompletion.java @@ -76,9 +76,7 @@ public void handleV3Response(BookkeeperProtocol.Response response) { lastEntryBuffer = Unpooled.wrappedBuffer(readLacResponse.getLastEntryBody().asReadOnlyByteBuffer()); } - if (LOG.isDebugEnabled()) { - logResponse(status, "ledgerId", ledgerId); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.ReadException); cb.readLacComplete(rc, ledgerId, lacBuffer.slice(), diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacProcessorV3.java index 66411819976..0fb27e938e5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadLacProcessorV3.java @@ -25,6 +25,7 @@ import io.netty.util.ReferenceCountUtil; import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.common.util.MathUtils; @@ -33,14 +34,12 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.Request; import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A read processor for v3 last add confirmed messages. */ +@CustomLog class ReadLacProcessorV3 extends PacketProcessorBaseV3 implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(ReadLacProcessorV3.class); public ReadLacProcessorV3(Request request, BookieRequestHandler requestHandler, BookieRequestProcessor requestProcessor) { @@ -60,7 +59,7 @@ private ReadLacResponse getReadLacResponse() { return readLacResponse.build(); } - logger.debug("Received ReadLac request: {}", request); + log.debug().attr("request", request).log("Received ReadLac request"); StatusCode status = StatusCode.EOK; ByteBuf lastEntry = null; ByteBuf lac = null; @@ -71,13 +70,22 @@ private ReadLacResponse getReadLacResponse() { } } catch (Bookie.NoLedgerException e) { status = StatusCode.ENOLEDGER; - logger.debug("No ledger found while performing readLac from ledger: {}", ledgerId, e); + log.debug() + .exception(e) + .attr("ledgerId", ledgerId) + .log("No ledger found while performing readLac"); } catch (BookieException.DataUnknownException e) { status = StatusCode.EUNKNOWNLEDGERSTATE; - logger.error("Ledger {} in unknown state and cannot serve reacLac requests", ledgerId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .log("Ledger in unknown state and cannot serve readLac requests"); } catch (BookieException | IOException e) { status = StatusCode.EIO; - logger.error("IOException while performing readLac from ledger: {}", ledgerId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .log("IOException while performing readLac from ledger"); } finally { ReferenceCountUtil.release(lac); } @@ -89,13 +97,22 @@ private ReadLacResponse getReadLacResponse() { } } catch (Bookie.NoLedgerException e) { status = StatusCode.ENOLEDGER; - logger.debug("No ledger found while trying to read last entry: {}", ledgerId, e); + log.debug() + .exception(e) + .attr("ledgerId", ledgerId) + .log("No ledger found while trying to read last entry"); } catch (BookieException.DataUnknownException e) { status = StatusCode.EUNKNOWNLEDGERSTATE; - logger.error("Ledger in an unknown state while trying to read last entry: {}", ledgerId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .log("Ledger in an unknown state while trying to read last entry"); } catch (BookieException | IOException e) { status = StatusCode.EIO; - logger.error("IOException while trying to read last entry: {}", ledgerId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .log("IOException while trying to read last entry"); } finally { ReferenceCountUtil.release(lastEntry); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/StartTLSCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/StartTLSCompletion.java index 71491ed4673..a90a1c90351 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/StartTLSCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/StartTLSCompletion.java @@ -21,8 +21,10 @@ package org.apache.bookkeeper.proto; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; +@CustomLog class StartTLSCompletion extends CompletionValue { final BookkeeperInternalCallbacks.StartTLSCallback cb; @@ -53,9 +55,7 @@ public void errorOut(final int rc) { public void handleV3Response(BookkeeperProtocol.Response response) { BookkeeperProtocol.StatusCode status = response.getStatus(); - if (LOG.isDebugEnabled()) { - logResponse(status); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.SecurityException); @@ -63,10 +63,10 @@ public void handleV3Response(BookkeeperProtocol.Response response) { cb.startTLSComplete(rc, null); if (perChannelBookieClient.state != PerChannelBookieClient.ConnectionState.START_TLS) { - LOG.error("Connection state changed before TLS response received"); + log.error("Connection state changed before TLS response received"); perChannelBookieClient.failTLS(BKException.Code.BookieHandleNotAvailableException); } else if (status != BookkeeperProtocol.StatusCode.EOK) { - LOG.error("Client received error {} during TLS negotiation", status); + log.error().attr("status", status).log("Client received error during TLS negotiation"); perChannelBookieClient.failTLS(BKException.Code.SecurityException); } else { perChannelBookieClient.initTLSHandshake(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessor.java index 7e8d0ff45e0..319def11306 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessor.java @@ -22,22 +22,20 @@ import io.netty.util.Recycler; import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.OperationRejectedException; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookieProtocol.ParsedAddRequest; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Processes add entry requests. */ +@CustomLog class WriteEntryProcessor extends PacketProcessorBase implements WriteCallback { - private static final Logger LOG = LoggerFactory.getLogger(WriteEntryProcessor.class); - long startTimeNanos; @Override @@ -58,7 +56,7 @@ public static WriteEntryProcessor create(ParsedAddRequest request, BookieRequest protected void processPacket() { if (requestProcessor.getBookie().isReadOnly() && !(request.isHighPriority() && requestProcessor.getBookie().isAvailableForHighPriorityWrites())) { - LOG.warn("BookieServer is running in readonly mode," + log.warn("BookieServer is running in readonly mode," + " so rejecting the request from the client!"); sendWriteReqResponse(BookieProtocol.EREADONLY, ResponseBuilder.buildErrorResponse(BookieProtocol.EREADONLY, request), @@ -83,23 +81,34 @@ protected void processPacket() { requestProcessor.getRequestStats().getAddEntryRejectedCounter().inc(); // Avoid to log each occurrence of this exception as this can happen when the ledger storage is // unable to keep up with the write rate. - if (LOG.isDebugEnabled()) { - LOG.debug("Operation rejected while writing {}", request, e); - } + log.debug() + .exception(e) + .attr("request", request) + .log("Operation rejected while writing"); rc = BookieProtocol.ETOOMANYREQUESTS; } catch (IOException e) { - LOG.error("Error writing {}", request, e); + log.error() + .exception(e) + .attr("request", request) + .log("Error writing"); rc = BookieProtocol.EIO; } catch (BookieException.LedgerFencedException | BookieException.LedgerFencedAndDeletedException lfe) { - LOG.warn("Write attempt on fenced/deleted ledger {} by client {}", request.getLedgerId(), - requestHandler.ctx().channel().remoteAddress()); + log.warn().attr("ledgerId", request.getLedgerId()) + .attr("clientAddress", requestHandler.ctx().channel().remoteAddress()) + .log("Write attempt on fenced/deleted ledger"); rc = BookieProtocol.EFENCED; } catch (BookieException e) { - LOG.error("Unauthorized access to ledger {}", request.getLedgerId(), e); + log.error() + .exception(e) + .attr("ledgerId", request.getLedgerId()) + .log("Unauthorized access to ledger"); rc = BookieProtocol.EUA; } catch (Throwable t) { - LOG.error("Unexpected exception while writing {}@{} : {}", - request.ledgerId, request.entryId, t.getMessage(), t); + log.error() + .exception(t) + .attr("ledgerId", request.ledgerId) + .attr("entryId", request.entryId) + .log("Unexpected exception while writing"); // some bad request which cause unexpected exception rc = BookieProtocol.EBADREQ; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java index 9c663269f85..6bebfcc4b9e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteEntryProcessorV3.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.util.EnumSet; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.OperationRejectedException; import org.apache.bookkeeper.client.api.WriteFlag; @@ -36,11 +37,9 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.Response; import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; import org.apache.bookkeeper.stats.OpStatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class WriteEntryProcessorV3 extends PacketProcessorBaseV3 { - private static final Logger logger = LoggerFactory.getLogger(WriteEntryProcessorV3.class); public WriteEntryProcessorV3(Request request, BookieRequestHandler requestHandler, BookieRequestProcessor requestProcessor) { @@ -67,7 +66,7 @@ private AddResponse getAddResponse() { if (requestProcessor.getBookie().isReadOnly() && !(RequestUtils.isHighPriority(request) && requestProcessor.getBookie().isAvailableForHighPriorityWrites())) { - logger.warn("BookieServer is running as readonly mode, so rejecting the request from the client!"); + log.warn("BookieServer is running as readonly mode, so rejecting the request from the client!"); addResponse.setStatus(StatusCode.EREADONLY); return addResponse.build(); } @@ -128,25 +127,38 @@ public void writeComplete(int rc, long ledgerId, long entryId, requestProcessor.getRequestStats().getAddEntryRejectedCounter().inc(); // Avoid to log each occurrence of this exception as this can happen when the ledger storage is // unable to keep up with the write rate. - if (logger.isDebugEnabled()) { - logger.debug("Operation rejected while writing {}", request, e); - } + log.debug() + .exception(e) + .attr("request", request) + .log("Operation rejected while writing"); status = StatusCode.ETOOMANYREQUESTS; } catch (IOException e) { - logger.error("Error writing entry:{} to ledger:{}", - entryId, ledgerId, e); + log.error() + .exception(e) + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Error writing entry to ledger"); status = StatusCode.EIO; } catch (BookieException.LedgerFencedException | BookieException.LedgerFencedAndDeletedException e) { - logger.error("Ledger fenced/deleted while writing entry:{} to ledger:{}", - entryId, ledgerId, e); + log.error() + .exception(e) + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Ledger fenced/deleted while writing entry to ledger"); status = StatusCode.EFENCED; } catch (BookieException e) { - logger.error("Unauthorized access to ledger:{} while writing entry:{}", - ledgerId, entryId, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Unauthorized access to ledger while writing entry"); status = StatusCode.EUA; } catch (Throwable t) { - logger.error("Unexpected exception while writing {}@{} : ", - entryId, ledgerId, t); + log.error() + .exception(t) + .attr("entryId", entryId) + .attr("ledgerId", ledgerId) + .log("Unexpected exception while writing"); // some bad request which cause unexpected exception status = StatusCode.EBADREQ; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacCompletion.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacCompletion.java index 9d4ca0c39a2..c5339dcd3e1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacCompletion.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacCompletion.java @@ -67,9 +67,7 @@ public void handleV3Response(BookkeeperProtocol.Response response) { ? writeLacResponse.getStatus() : response.getStatus(); long ledgerId = writeLacResponse.getLedgerId(); - if (LOG.isDebugEnabled()) { - logResponse(status, "ledger", ledgerId); - } + logEvent(status).log("Got response from bookie"); int rc = convertStatus(status, BKException.Code.WriteException); cb.writeLacComplete(rc, ledgerId, perChannelBookieClient.bookieId, ctx); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java index 5783da2e88b..b22fa5b8626 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/WriteLacProcessorV3.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.net.BookieId; @@ -32,12 +33,10 @@ import org.apache.bookkeeper.proto.BookkeeperProtocol.StatusCode; import org.apache.bookkeeper.proto.BookkeeperProtocol.WriteLacRequest; import org.apache.bookkeeper.proto.BookkeeperProtocol.WriteLacResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog class WriteLacProcessorV3 extends PacketProcessorBaseV3 implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(WriteLacProcessorV3.class); public WriteLacProcessorV3(Request request, BookieRequestHandler requestHandler, BookieRequestProcessor requestProcessor) { @@ -59,7 +58,7 @@ private WriteLacResponse getWriteLacResponse() { } if (requestProcessor.bookie.isReadOnly()) { - logger.warn("BookieServer is running as readonly mode, so rejecting the request from the client!"); + log.warn("BookieServer is running as readonly mode, so rejecting the request from the client!"); writeLacResponse.setStatus(StatusCode.EREADONLY); return writeLacResponse.build(); } @@ -106,25 +105,40 @@ public void writeComplete(int rc, long ledgerId, long entryId, BookieId addr, Ob writeCallback, requestHandler, masterKey); status = StatusCode.EOK; } catch (BookieException.LedgerFencedAndDeletedException e) { - logger.error("Error saving lac {} for ledger:{}, which has been deleted", - lac, ledgerId, e); + log.error() + .exception(e) + .attr("lastAddConfirmed", lac) + .attr("ledgerId", ledgerId) + .log("Error saving lac for ledger, which has been deleted"); status = StatusCode.ENOLEDGER; } catch (IOException e) { - logger.error("Error saving lac {} for ledger:{}", - lac, ledgerId, e); + log.error() + .exception(e) + .attr("lastAddConfirmed", lac) + .attr("ledgerId", ledgerId) + .log("Error saving lac for ledger"); status = StatusCode.EIO; } catch (InterruptedException e) { Thread.currentThread().interrupt(); - logger.error("Interrupted while saving lac {} for ledger:{}", - lac, ledgerId, e); + log.error() + .exception(e) + .attr("lastAddConfirmed", lac) + .attr("ledgerId", ledgerId) + .log("Interrupted while saving lac for ledger"); status = StatusCode.EIO; } catch (BookieException e) { - logger.error("Unauthorized access to ledger:{} while adding lac:{}", - ledgerId, lac, e); + log.error() + .exception(e) + .attr("ledgerId", ledgerId) + .attr("lastAddConfirmed", lac) + .log("Unauthorized access to ledger while adding lac"); status = StatusCode.EUA; } catch (Throwable t) { - logger.error("Unexpected exception while writing lac {} for ledger:{}", - lac, ledgerId, t); + log.error() + .exception(t) + .attr("lastAddConfirmed", lac) + .attr("ledgerId", ledgerId) + .log("Unexpected exception while writing lac for ledger"); // some bad request which cause unexpected exception status = StatusCode.EBADREQ; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java index 5343357198a..14bdae277b4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/CRC32CDigestManager.java @@ -21,9 +21,9 @@ import com.scurrilous.circe.checksum.Crc32cIntChecksum; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; -@Slf4j +@CustomLog class CRC32CDigestManager extends DigestManager { public CRC32CDigestManager(long ledgerId, boolean useV2Protocol, ByteBufAllocator allocator) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java index 1e78e4075eb..114df52de83 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/DigestManager.java @@ -26,6 +26,7 @@ import io.netty.util.concurrent.FastThreadLocal; import java.security.GeneralSecurityException; import java.security.NoSuchAlgorithmException; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException.BKDigestMatchException; import org.apache.bookkeeper.client.LedgerHandle; import org.apache.bookkeeper.proto.BookieProtoEncoding; @@ -33,8 +34,6 @@ import org.apache.bookkeeper.proto.DataFormats.LedgerMetadataFormat.DigestType; import org.apache.bookkeeper.util.ByteBufList; import org.apache.bookkeeper.util.ByteBufVisitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class takes an entry, attaches a digest to it and packages it with relevant @@ -43,8 +42,8 @@ * for the packet. Currently 3 types of digests are supported: MAC (based on SHA-1) and CRC32 and CRC32C. */ +@CustomLog public abstract class DigestManager { - private static final Logger logger = LoggerFactory.getLogger(DigestManager.class); public static final int METADATA_LENGTH = 32; public static final int LAC_METADATA_LENGTH = 16; @@ -228,10 +227,10 @@ private void verifyDigest(long entryId, ByteBuf dataReceived, boolean skipEntryI throws BKDigestMatchException { if ((METADATA_LENGTH + macCodeLength) > dataReceived.readableBytes()) { - logger.error("Data received is smaller than the minimum for this digest type. " - + " Either the packet it corrupt, or the wrong digest is configured. " - + " Digest type: {}, Packet Length: {}", - this.getClass().getName(), dataReceived.readableBytes()); + log.error().attr("digestType", this.getClass().getName()) + .attr("packetLength", dataReceived.readableBytes()) + .log("Data received is smaller than the minimum for this digest type." + + " Either the packet is corrupt, or the wrong digest is configured"); throw new BKDigestMatchException(); } int digest = update(0, dataReceived, 0, METADATA_LENGTH); @@ -242,7 +241,10 @@ private void verifyDigest(long entryId, ByteBuf dataReceived, boolean skipEntryI if (isInt32Digest()) { int receivedDigest = dataReceived.getInt(METADATA_LENGTH); if (receivedDigest != digest) { - logger.error("Digest mismatch for ledger-id: " + ledgerId + ", entry-id: " + entryId); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Digest mismatch"); throw new BKDigestMatchException(); } } else { @@ -251,7 +253,10 @@ private void verifyDigest(long entryId, ByteBuf dataReceived, boolean skipEntryI populateValueAndReset(digest, digestBuf); if (!ByteBufUtil.equals(digestBuf, 0, dataReceived, METADATA_LENGTH, macCodeLength)) { - logger.error("Mac mismatch for ledger-id: " + ledgerId + ", entry-id: " + entryId); + log.error() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .log("Mac mismatch"); throw new BKDigestMatchException(); } } @@ -260,14 +265,18 @@ private void verifyDigest(long entryId, ByteBuf dataReceived, boolean skipEntryI long actualEntryId = dataReceived.readLong(); if (actualLedgerId != ledgerId) { - logger.error("Ledger-id mismatch in authenticated message, expected: " + ledgerId + " , actual: " - + actualLedgerId); + log.error() + .attr("expectedLedgerId", ledgerId) + .attr("actualLedgerId", actualLedgerId) + .log("Ledger-id mismatch in authenticated message"); throw new BKDigestMatchException(); } if (!skipEntryIdCheck && actualEntryId != entryId) { - logger.error("Entry-id mismatch in authenticated message, expected: " + entryId + " , actual: " - + actualEntryId); + log.error() + .attr("expectedEntryId", entryId) + .attr("actualEntryId", actualEntryId) + .log("Entry-id mismatch in authenticated message"); throw new BKDigestMatchException(); } @@ -275,10 +284,10 @@ private void verifyDigest(long entryId, ByteBuf dataReceived, boolean skipEntryI public long verifyDigestAndReturnLac(ByteBuf dataReceived) throws BKDigestMatchException{ if ((LAC_METADATA_LENGTH + macCodeLength) > dataReceived.readableBytes()) { - logger.error("Data received is smaller than the minimum for this digest type." - + " Either the packet it corrupt, or the wrong digest is configured. " - + " Digest type: {}, Packet Length: {}", - this.getClass().getName(), dataReceived.readableBytes()); + log.error().attr("digestType", this.getClass().getName()) + .attr("packetLength", dataReceived.readableBytes()) + .log("Data received is smaller than the minimum for this digest type." + + " Either the packet is corrupt, or the wrong digest is configured"); throw new BKDigestMatchException(); } @@ -287,7 +296,7 @@ public long verifyDigestAndReturnLac(ByteBuf dataReceived) throws BKDigestMatchE if (isInt32Digest()) { int receivedDigest = dataReceived.getInt(LAC_METADATA_LENGTH); if (receivedDigest != digest) { - logger.error("Digest mismatch for ledger-id LAC: " + ledgerId); + log.error().attr("ledgerId", ledgerId).log("Digest mismatch for LAC"); throw new BKDigestMatchException(); } } else { @@ -296,7 +305,7 @@ public long verifyDigestAndReturnLac(ByteBuf dataReceived) throws BKDigestMatchE populateValueAndReset(digest, digestBuf); if (!ByteBufUtil.equals(digestBuf, 0, dataReceived, LAC_METADATA_LENGTH, macCodeLength)) { - logger.error("Mac mismatch for ledger-id LAC: " + ledgerId); + log.error().attr("ledgerId", ledgerId).log("Mac mismatch for LAC"); throw new BKDigestMatchException(); } } @@ -304,8 +313,10 @@ public long verifyDigestAndReturnLac(ByteBuf dataReceived) throws BKDigestMatchE long actualLedgerId = dataReceived.readLong(); long lac = dataReceived.readLong(); if (actualLedgerId != ledgerId) { - logger.error("Ledger-id mismatch in authenticated message, expected: " + ledgerId + " , actual: " - + actualLedgerId); + log.error() + .attr("expectedLedgerId", ledgerId) + .attr("actualLedgerId", actualLedgerId) + .log("Ledger-id mismatch in authenticated message"); throw new BKDigestMatchException(); } return lac; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java index f9fda5a531d..8d041795753 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/checksum/MacDigestManager.java @@ -28,16 +28,15 @@ import java.util.Arrays; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * A {@code SHA-1} based digest manager. * *

NOTE: This class is tended to be used by this project only. External users should not rely on it directly. */ +@CustomLog public class MacDigestManager extends DigestManager { - private static final Logger LOG = LoggerFactory.getLogger(MacDigestManager.class); public static final String DIGEST_ALGORITHM = "SHA-1"; public static final String KEY_ALGORITHM = "HmacSHA1"; @@ -65,7 +64,7 @@ protected Mac initialValue() { mac.init(keySpec); return mac; } catch (GeneralSecurityException gse) { - LOG.error("Couldn't not get mac instance", gse); + log.error().exception(gse).log("Couldn't not get mac instance"); return null; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java index 9c6be197550..5a5d49fd26f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java @@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -53,8 +54,6 @@ import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Auditor is a single entity in the entire Bookie cluster and will be watching @@ -65,8 +64,8 @@ * *

TODO: eliminate the direct usage of zookeeper here {@link https://github.com/apache/bookkeeper/issues/1332} */ +@CustomLog public class Auditor implements AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(Auditor.class); private final ServerConfiguration conf; private final BookKeeper bkc; private final boolean ownBkc; @@ -200,14 +199,16 @@ private void initialize(ServerConfiguration conf, BookKeeper bkc) this.ledgerUnderreplicationManager = ledgerManagerFactory .newLedgerUnderreplicationManager(); - LOG.info("AuthProvider used by the Auditor is {}", - admin.getConf().getClientAuthProviderFactoryClass()); + log.info() + .attr("authProvider", admin.getConf().getClientAuthProviderFactoryClass()) + .log("AuthProvider used by the Auditor"); if (this.ledgerUnderreplicationManager .initializeLostBookieRecoveryDelay(conf.getLostBookieRecoveryDelay())) { - LOG.info("Initializing lostBookieRecoveryDelay zNode to the conf value: {}", - conf.getLostBookieRecoveryDelay()); + log.info() + .attr("lostBookieRecoveryDelay", conf.getLostBookieRecoveryDelay()) + .log("Initializing lostBookieRecoveryDelay zNode to the conf value"); } else { - LOG.info("Valid lostBookieRecoveryDelay zNode is available, so not creating " + log.info("Valid lostBookieRecoveryDelay zNode is available, so not creating " + "lostBookieRecoveryDelay zNode as part of Auditor initialization "); } lostBookieRecoveryDelayBeforeChange = this.ledgerUnderreplicationManager.getLostBookieRecoveryDelay(); @@ -223,14 +224,14 @@ private void initialize(ServerConfiguration conf, BookKeeper bkc) private void submitShutdownTask() { synchronized (this) { - LOG.info("Executing submitShutdownTask"); + log.info("Executing submitShutdownTask"); if (executor.isShutdown()) { - LOG.info("executor is already shutdown"); + log.info("executor is already shutdown"); return; } executor.submit(() -> { synchronized (Auditor.this) { - LOG.info("Shutting down Auditor's Executor"); + log.info("Shutting down Auditor's Executor"); executor.shutdown(); } }); @@ -284,10 +285,10 @@ synchronized Future submitAuditTask() { } if (bookiesToBeAudited.size() > 1) { // if more than one bookie is down, start the audit immediately; - LOG.info("Multiple bookie failure; not delaying bookie audit. " - + "Bookies lost now: {}; All lost bookies: {}", - CollectionUtils.subtract(knownBookies, availableBookies), - bookiesToBeAudited); + log.info() + .attr("bookiesLostNow", CollectionUtils.subtract(knownBookies, availableBookies)) + .attr("allLostBookies", bookiesToBeAudited) + .log("Multiple bookie failure; not delaying bookie audit"); if (auditTask != null && auditTask.cancel(false)) { auditTask = null; auditorStats.getNumDelayedBookieAuditsCancelled().inc(); @@ -304,16 +305,18 @@ synchronized Future submitAuditTask() { bookiesToBeAudited.clear(); }, lostBookieRecoveryDelay, TimeUnit.SECONDS); auditorStats.getNumBookieAuditsDelayed().inc(); - LOG.info("Delaying bookie audit by {} secs for {}", lostBookieRecoveryDelay, - bookiesToBeAudited); + log.info() + .attr("delaySecs", lostBookieRecoveryDelay) + .attr("bookies", bookiesToBeAudited) + .log("Delaying bookie audit"); } } catch (BKException bke) { - LOG.error("Exception getting bookie list", bke); + log.error().exception(bke).log("Exception getting bookie list"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while watching available bookies ", ie); + log.error().exception(ie).log("Interrupted while watching available bookies"); } catch (UnavailableException ue) { - LOG.error("Exception while watching available bookies", ue); + log.error().exception(ue).log("Exception while watching available bookies"); } }); } @@ -333,7 +336,7 @@ synchronized Future submitLostBookieRecoveryDelayChangedEvent() { // if there is pending auditTask, cancel the task. So that it can be rescheduled // after new lostBookieRecoveryDelay period if (auditTask != null) { - LOG.info("lostBookieRecoveryDelay period has been changed so canceling the pending AuditTask"); + log.info("lostBookieRecoveryDelay period has been changed so canceling the pending AuditTask"); auditTask.cancel(false); auditorStats.getNumDelayedBookieAuditsCancelled().inc(); } @@ -342,17 +345,19 @@ synchronized Future submitLostBookieRecoveryDelayChangedEvent() { // signal to trigger the Audit immediately. if ((lostBookieRecoveryDelay == 0) || (lostBookieRecoveryDelay == lostBookieRecoveryDelayBeforeChange)) { - LOG.info( - "lostBookieRecoveryDelay has been set to 0 or reset to its previous value, " - + "so starting AuditTask. Current lostBookieRecoveryDelay: {}, " - + "previous lostBookieRecoveryDelay: {}", - lostBookieRecoveryDelay, lostBookieRecoveryDelayBeforeChange); + log.info() + .attr("currentDelay", lostBookieRecoveryDelay) + .attr("previousDelay", lostBookieRecoveryDelayBeforeChange) + .log("lostBookieRecoveryDelay has been set to 0" + + " or reset to its previous value," + + " so starting AuditTask"); auditorBookieCheckTask.startAudit(false); auditTask = null; bookiesToBeAudited.clear(); } else if (auditTask != null) { - LOG.info("lostBookieRecoveryDelay has been set to {}, so rescheduling AuditTask accordingly", - lostBookieRecoveryDelay); + log.info() + .attr("lostBookieRecoveryDelay", lostBookieRecoveryDelay) + .log("lostBookieRecoveryDelay changed, rescheduling AuditTask accordingly"); auditTask = executor.schedule(() -> { auditorBookieCheckTask.startAudit(false); auditTask = null; @@ -362,12 +367,12 @@ synchronized Future submitLostBookieRecoveryDelayChangedEvent() { } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while for LedgersReplication to be enabled ", ie); + log.error().exception(ie).log("Interrupted while waiting for LedgersReplication to be enabled"); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (UnavailableException ue) { - LOG.error("Exception while reading from ZK", ue); + log.error().exception(ue).log("Exception while reading from ZK"); } finally { if (lostBookieRecoveryDelay != -1) { lostBookieRecoveryDelayBeforeChange = lostBookieRecoveryDelay; @@ -377,7 +382,7 @@ synchronized Future submitLostBookieRecoveryDelayChangedEvent() { } public void start() { - LOG.info("I'm starting as Auditor Bookie. ID: {}", bookieIdentifier); + log.info().attr("bookieId", bookieIdentifier).log("I'm starting as Auditor Bookie"); // on startup watching available bookie and based on the // available bookies determining the bookie failures. synchronized (this) { @@ -396,11 +401,11 @@ public void start() { this.ledgerUnderreplicationManager .notifyLostBookieRecoveryDelayChanged(new LostBookieRecoveryDelayChangedCb()); } catch (BKException bke) { - LOG.error("Couldn't get bookie list, so exiting", bke); + log.error().exception(bke).log("Couldn't get bookie list, so exiting"); submitShutdownTask(); return; } catch (UnavailableException ue) { - LOG.error("Exception while registering for change notification, so exiting", ue); + log.error().exception(ue).log("Exception while registering for change notification, so exiting"); submitShutdownTask(); return; } @@ -418,11 +423,12 @@ protected void submitBookieCheckTask() { private void scheduleBookieCheckTask() { long bookieCheckInterval = conf.getAuditorPeriodicBookieCheckInterval(); if (bookieCheckInterval == 0) { - LOG.info("Auditor periodic bookie checking disabled, running once check now anyhow"); + log.info("Auditor periodic bookie checking disabled, running once check now anyhow"); submitBookieCheckTask(); } else { - LOG.info("Auditor periodic bookie checking enabled" + " 'auditorPeriodicBookieCheckInterval' {} seconds", - bookieCheckInterval); + log.info() + .attr("auditorPeriodicBookieCheckInterval", bookieCheckInterval) + .log("Auditor periodic bookie checking enabled"); executor.scheduleAtFixedRate(auditorBookieCheckTask, 0, bookieCheckInterval, TimeUnit.SECONDS); } } @@ -431,8 +437,7 @@ private void scheduleCheckAllLedgersTask() { long interval = conf.getAuditorPeriodicCheckInterval(); if (interval > 0) { - LOG.info("Auditor periodic ledger checking enabled" + " 'auditorPeriodicCheckInterval' {} seconds", - interval); + log.info().attr("auditorPeriodicCheckInterval", interval).log("Auditor periodic ledger checking enabled"); long checkAllLedgersLastExecutedCTime; long durationSinceLastExecutionInSecs; @@ -440,11 +445,11 @@ private void scheduleCheckAllLedgersTask() { try { checkAllLedgersLastExecutedCTime = ledgerUnderreplicationManager.getCheckAllLedgersCTime(); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return; } catch (UnavailableException ue) { - LOG.error("Got UnavailableException while trying to get checkAllLedgersCTime", ue); + log.error().exception(ue).log("Got UnavailableException while trying to get checkAllLedgersCTime"); checkAllLedgersLastExecutedCTime = -1; } if (checkAllLedgersLastExecutedCTime == -1) { @@ -460,14 +465,16 @@ private void scheduleCheckAllLedgersTask() { initialDelay = durationSinceLastExecutionInSecs > interval ? 0 : (interval - durationSinceLastExecutionInSecs); } - LOG.info( - "checkAllLedgers scheduling info. checkAllLedgersLastExecutedCTime: {} " - + "durationSinceLastExecutionInSecs: {} initialDelay: {} interval: {}", - checkAllLedgersLastExecutedCTime, durationSinceLastExecutionInSecs, initialDelay, interval); + log.info() + .attr("checkAllLedgersLastExecutedCTime", checkAllLedgersLastExecutedCTime) + .attr("durationSinceLastExecutionInSecs", durationSinceLastExecutionInSecs) + .attr("initialDelay", initialDelay) + .attr("interval", interval) + .log("checkAllLedgers scheduling info"); executor.scheduleAtFixedRate(auditorCheckAllLedgersTask, initialDelay, interval, TimeUnit.SECONDS); } else { - LOG.info("Periodic checking disabled"); + log.info("Periodic checking disabled"); } } @@ -475,8 +482,9 @@ private void schedulePlacementPolicyCheckTask() { long interval = conf.getAuditorPeriodicPlacementPolicyCheckInterval(); if (interval > 0) { - LOG.info("Auditor periodic placement policy check enabled" - + " 'auditorPeriodicPlacementPolicyCheckInterval' {} seconds", interval); + log.info() + .attr("auditorPeriodicPlacementPolicyCheckInterval", interval) + .log("Auditor periodic placement policy check enabled"); long placementPolicyCheckLastExecutedCTime; long durationSinceLastExecutionInSecs; @@ -484,11 +492,11 @@ private void schedulePlacementPolicyCheckTask() { try { placementPolicyCheckLastExecutedCTime = ledgerUnderreplicationManager.getPlacementPolicyCheckCTime(); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return; } catch (UnavailableException ue) { - LOG.error("Got UnavailableException while trying to get placementPolicyCheckCTime", ue); + log.error().exception(ue).log("Got UnavailableException while trying to get placementPolicyCheckCTime"); placementPolicyCheckLastExecutedCTime = -1; } if (placementPolicyCheckLastExecutedCTime == -1) { @@ -504,14 +512,16 @@ private void schedulePlacementPolicyCheckTask() { initialDelay = durationSinceLastExecutionInSecs > interval ? 0 : (interval - durationSinceLastExecutionInSecs); } - LOG.info( - "placementPolicyCheck scheduling info. placementPolicyCheckLastExecutedCTime: {} " - + "durationSinceLastExecutionInSecs: {} initialDelay: {} interval: {}", - placementPolicyCheckLastExecutedCTime, durationSinceLastExecutionInSecs, initialDelay, interval); + log.info() + .attr("placementPolicyCheckLastExecutedCTime", placementPolicyCheckLastExecutedCTime) + .attr("durationSinceLastExecutionInSecs", durationSinceLastExecutionInSecs) + .attr("initialDelay", initialDelay) + .attr("interval", interval) + .log("placementPolicyCheck scheduling info"); executor.scheduleAtFixedRate(auditorPlacementPolicyCheckTask, initialDelay, interval, TimeUnit.SECONDS); } else { - LOG.info("Periodic placementPolicy check disabled"); + log.info("Periodic placementPolicy check disabled"); } } @@ -519,22 +529,22 @@ private void scheduleReplicasCheckTask() { long interval = conf.getAuditorPeriodicReplicasCheckInterval(); if (interval <= 0) { - LOG.info("Periodic replicas check disabled"); + log.info("Periodic replicas check disabled"); return; } - LOG.info("Auditor periodic replicas check enabled" + " 'auditorReplicasCheckInterval' {} seconds", interval); + log.info().attr("auditorReplicasCheckInterval", interval).log("Auditor periodic replicas check enabled"); long replicasCheckLastExecutedCTime; long durationSinceLastExecutionInSecs; long initialDelay; try { replicasCheckLastExecutedCTime = ledgerUnderreplicationManager.getReplicasCheckCTime(); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return; } catch (UnavailableException ue) { - LOG.error("Got UnavailableException while trying to get replicasCheckCTime", ue); + log.error().exception(ue).log("Got UnavailableException while trying to get replicasCheckCTime"); replicasCheckLastExecutedCTime = -1; } if (replicasCheckLastExecutedCTime == -1) { @@ -549,10 +559,12 @@ private void scheduleReplicasCheckTask() { initialDelay = durationSinceLastExecutionInSecs > interval ? 0 : (interval - durationSinceLastExecutionInSecs); } - LOG.info( - "replicasCheck scheduling info. replicasCheckLastExecutedCTime: {} " - + "durationSinceLastExecutionInSecs: {} initialDelay: {} interval: {}", - replicasCheckLastExecutedCTime, durationSinceLastExecutionInSecs, initialDelay, interval); + log.info() + .attr("replicasCheckLastExecutedCTime", replicasCheckLastExecutedCTime) + .attr("durationSinceLastExecutionInSecs", durationSinceLastExecutionInSecs) + .attr("initialDelay", initialDelay) + .attr("interval", interval) + .log("replicasCheck scheduling info"); executor.scheduleAtFixedRate(auditorReplicasCheckTask, initialDelay, interval, TimeUnit.SECONDS); } @@ -564,10 +576,10 @@ public void operationComplete(int rc, Void result) { Auditor.this.ledgerUnderreplicationManager .notifyLostBookieRecoveryDelayChanged(LostBookieRecoveryDelayChangedCb.this); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (UnavailableException ae) { - LOG.error("Exception while registering for a LostBookieRecoveryDelay notification", ae); + log.error().exception(ae).log("Exception while registering for a LostBookieRecoveryDelay notification"); } Auditor.this.submitLostBookieRecoveryDelayChangedEvent(); } @@ -577,7 +589,7 @@ private void waitIfLedgerReplicationDisabled() throws UnavailableException, InterruptedException { if (!ledgerUnderreplicationManager.isLedgerReplicationEnabled()) { ReplicationEnableCb cb = new ReplicationEnableCb(); - LOG.info("LedgerReplication is disabled externally through Zookeeper, " + log.info("LedgerReplication is disabled externally through Zookeeper, " + "since DISABLE_NODE ZNode is created, so waiting until it is enabled"); ledgerUnderreplicationManager.notifyLedgerReplicationEnabled(cb); cb.await(); @@ -606,11 +618,11 @@ private void watchBookieChanges() throws BKException { * Shutdown the auditor. */ public void shutdown() { - LOG.info("Shutting down auditor"); + log.info("Shutting down auditor"); executor.shutdown(); try { while (!executor.awaitTermination(30, TimeUnit.SECONDS)) { - LOG.warn("Executor not shutting down, interrupting"); + log.warn("Executor not shutting down, interrupting"); executor.shutdownNow(); } @@ -632,9 +644,9 @@ public void shutdown() { } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.warn("Interrupted while shutting down auditor bookie", ie); + log.warn().exception(ie).log("Interrupted while shutting down auditor bookie"); } catch (UnavailableException | IOException | BKException bke) { - LOG.warn("Exception while shutting down auditor bookie", bke); + log.warn().exception(bke).log("Exception while shutting down auditor bookie"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorBookieCheckTask.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorBookieCheckTask.java index 0325e56b44d..82f8fb22dcd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorBookieCheckTask.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorBookieCheckTask.java @@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.common.concurrent.FutureUtils; @@ -34,11 +35,9 @@ import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.meta.LedgerUnderreplicationManager; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class AuditorBookieCheckTask extends AuditorTask { - private static final Logger LOG = LoggerFactory.getLogger(AuditorBookieCheckTask.class); private final BookieLedgerIndexer bookieLedgerIndexer; private final BiConsumer submitCheckTask; @@ -67,7 +66,7 @@ protected void runTask() { // let us not run this periodic bookie check now, if we // went ahead, we'll report under replication and the user // wanted to avoid that(with lostBookieRecoveryDelay option) - LOG.info("Audit already scheduled; skipping periodic bookie check"); + log.info("Audit already scheduled; skipping periodic bookie check"); auditorStats.getNumSkippingCheckTaskTimes().inc(); } } @@ -87,12 +86,12 @@ void startAudit(boolean shutDownTask) { auditBookies(); shutDownTask = false; } catch (BKException bke) { - LOG.error("Exception getting bookie list", bke); + log.error().exception(bke).log("Exception getting bookie list"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while watching available bookies ", ie); + log.error().exception(ie).log("Interrupted while watching available bookies"); } catch (ReplicationException.BKAuditException bke) { - LOG.error("Exception while watching available bookies", bke); + log.error().exception(bke).log("Exception while watching available bookies"); } if (shutDownTask) { submitShutdownTask(); @@ -104,15 +103,15 @@ void auditBookies() try { waitIfLedgerReplicationDisabled(); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return; } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication unavailable, skipping audit." + log.error("Underreplication unavailable, skipping audit." + "Will retry after a period"); return; } - LOG.info("Starting auditBookies"); + log.info("Starting auditBookies"); Stopwatch stopwatch = Stopwatch.createStarted(); // put exit cases here Map> ledgerDetails = generateBookie2LedgersIndex(); @@ -124,7 +123,7 @@ void auditBookies() return; } } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication unavailable, skipping audit." + log.error("Underreplication unavailable, skipping audit." + "Will retry after a period"); return; } @@ -149,7 +148,7 @@ void auditBookies() .registerSuccessfulEvent(stopwatch.elapsed(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS); } - LOG.info("Completed auditBookies"); + log.info("Completed auditBookies"); auditorStats.getAuditBookiesTime().registerSuccessfulEvent(stopwatch.stop().elapsed(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS); } @@ -161,8 +160,9 @@ private Map> generateBookie2LedgersIndex() private CompletableFuture handleLostBookiesAsync(Collection lostBookies, Map> ledgerDetails) { - LOG.info("Following are the failed bookies: {}," - + " and searching its ledgers for re-replication", lostBookies); + log.info() + .attr("lostBookies", lostBookies) + .log("Following are the failed bookies, searching their ledgers for re-replication"); return FutureUtils.processList( Lists.newArrayList(lostBookies), @@ -175,7 +175,7 @@ private CompletableFuture handleLostBookiesAsync(Collection lostBooki protected void waitIfLedgerReplicationDisabled() throws ReplicationException.UnavailableException, InterruptedException { if (!isLedgerReplicationEnabled()) { - LOG.info("LedgerReplication is disabled externally through Zookeeper, " + log.info("LedgerReplication is disabled externally through Zookeeper, " + "since DISABLE_NODE ZNode is created, so waiting until it is enabled"); ReplicationEnableCb cb = new ReplicationEnableCb(); ledgerUnderreplicationManager.notifyLedgerReplicationEnabled(cb); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorCheckAllLedgersTask.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorCheckAllLedgersTask.java index 261ccf7fe26..8fbbfdeb665 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorCheckAllLedgersTask.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorCheckAllLedgersTask.java @@ -30,6 +30,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -44,11 +45,9 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks; import org.apache.bookkeeper.replication.ReplicationException.UnavailableException; import org.apache.zookeeper.AsyncCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class AuditorCheckAllLedgersTask extends AuditorTask { - private static final Logger LOG = LoggerFactory.getLogger(AuditorBookieCheckTask.class); private final Semaphore openLedgerNoRecoverySemaphore; private final int openLedgerNoRecoverySemaphoreWaitTimeoutMSec; @@ -66,14 +65,14 @@ public class AuditorCheckAllLedgersTask extends AuditorTask { ledgerUnderreplicationManager, shutdownTaskHandler, hasAuditCheckTask); if (conf.getAuditorMaxNumberOfConcurrentOpenLedgerOperations() <= 0) { - LOG.error("auditorMaxNumberOfConcurrentOpenLedgerOperations should be greater than 0"); + log.error("auditorMaxNumberOfConcurrentOpenLedgerOperations should be greater than 0"); throw new UnavailableException("auditorMaxNumberOfConcurrentOpenLedgerOperations should be greater than 0"); } this.openLedgerNoRecoverySemaphore = new Semaphore(conf.getAuditorMaxNumberOfConcurrentOpenLedgerOperations()); if (conf.getAuditorAcquireConcurrentOpenLedgerOperationsTimeoutMSec() < 0) { - LOG.error("auditorAcquireConcurrentOpenLedgerOperationsTimeoutMSec should be greater than or equal to 0"); + log.error("auditorAcquireConcurrentOpenLedgerOperationsTimeoutMSec should be greater than or equal to 0"); throw new UnavailableException("auditorAcquireConcurrentOpenLedgerOperationsTimeoutMSec " + "should be greater than or equal to 0"); } @@ -93,7 +92,7 @@ public Thread newThread(Runnable r) { @Override protected void runTask() { if (hasBookieCheckTask()) { - LOG.info("Audit bookie task already scheduled; skipping periodic all ledgers check task"); + log.info("Audit bookie task already scheduled; skipping periodic all ledgers check task"); auditorStats.getNumSkippingCheckTaskTimes().inc(); return; } @@ -102,30 +101,30 @@ protected void runTask() { boolean checkSuccess = false; try { if (!isLedgerReplicationEnabled()) { - LOG.info("Ledger replication disabled, skipping checkAllLedgers"); + log.info("Ledger replication disabled, skipping checkAllLedgers"); checkSuccess = true; return; } - LOG.info("Starting checkAllLedgers"); + log.info("Starting checkAllLedgers"); checkAllLedgers(); long checkAllLedgersDuration = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS); - LOG.info("Completed checkAllLedgers in {} milliSeconds", checkAllLedgersDuration); + log.info().attr("durationMs", checkAllLedgersDuration).log("Completed checkAllLedgers"); auditorStats.getCheckAllLedgersTime() .registerSuccessfulEvent(checkAllLedgersDuration, TimeUnit.MILLISECONDS); checkSuccess = true; } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while running periodic check", ie); + log.error().exception(ie).log("Interrupted while running periodic check"); } catch (BKException bke) { - LOG.error("Exception running periodic check", bke); + log.error().exception(bke).log("Exception running periodic check"); } catch (IOException ioe) { - LOG.error("I/O exception running periodic check", ioe); + log.error().exception(ioe).log("I/O exception running periodic check"); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication manager unavailable running periodic check", ue); + log.error().exception(ue).log("Underreplication manager unavailable running periodic check"); } finally { if (!checkSuccess) { long checkAllLedgersDuration = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS); @@ -137,17 +136,17 @@ protected void runTask() { @Override public void shutdown() { - LOG.info("Shutting down AuditorCheckAllLedgersTask"); + log.info("Shutting down AuditorCheckAllLedgersTask"); ledgerCheckerExecutor.shutdown(); try { while (!ledgerCheckerExecutor.awaitTermination(30, TimeUnit.SECONDS)) { - LOG.warn("Executor for ledger checker not shutting down, interrupting"); + log.warn("Executor for ledger checker not shutting down, interrupting"); ledgerCheckerExecutor.shutdownNow(); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.warn("Interrupted while shutting down AuditorCheckAllLedgersTask", ie); + log.warn().exception(ie).log("Interrupted while shutting down AuditorCheckAllLedgersTask"); } } @@ -166,16 +165,16 @@ void checkAllLedgers() throws BKException, IOException, InterruptedException { BookkeeperInternalCallbacks.Processor checkLedgersProcessor = (ledgerId, callback) -> { try { if (!ledgerUnderreplicationManager.isLedgerReplicationEnabled()) { - LOG.info("Ledger rereplication has been disabled, aborting periodic check"); + log.info("Ledger rereplication has been disabled, aborting periodic check"); FutureUtils.complete(processFuture, null); return; } } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return; } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication manager unavailable running periodic check", ue); + log.error().exception(ue).log("Underreplication manager unavailable running periodic check"); FutureUtils.complete(processFuture, null); return; } @@ -183,13 +182,15 @@ void checkAllLedgers() throws BKException, IOException, InterruptedException { try { if (!openLedgerNoRecoverySemaphore.tryAcquire(openLedgerNoRecoverySemaphoreWaitTimeoutMSec, TimeUnit.MILLISECONDS)) { - LOG.warn("Failed to acquire semaphore for {} ms, ledgerId: {}", - openLedgerNoRecoverySemaphoreWaitTimeoutMSec, ledgerId); + log.warn() + .attr("timeoutMs", openLedgerNoRecoverySemaphoreWaitTimeoutMSec) + .attr("ledgerId", ledgerId) + .log("Failed to acquire semaphore"); FutureUtils.complete(processFuture, null); return; } } catch (InterruptedException e) { - LOG.error("Unable to acquire open ledger operation semaphore ", e); + log.error().exception(e).log("Unable to acquire open ledger operation semaphore"); Thread.currentThread().interrupt(); FutureUtils.complete(processFuture, null); return; @@ -214,12 +215,13 @@ void checkAllLedgers() throws BKException, IOException, InterruptedException { lh.closeAsync(); }); } else if (BKException.Code.NoSuchLedgerExistsOnMetadataServerException == rc) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger {} was deleted before we could check it", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ledger was deleted before we could check it"); callback.processResult(BKException.Code.OK, null, null); } else { - LOG.error("Couldn't open ledger {} to check : {}", ledgerId, BKException.getMessage(rc)); + log.error() + .attr("ledgerId", ledgerId) + .attr("error", BKException.getMessage(rc)) + .log("Couldn't open ledger to check"); callback.processResult(rc, null, null); } }, null); @@ -237,10 +239,10 @@ void checkAllLedgers() throws BKException, IOException, InterruptedException { try { ledgerUnderreplicationManager.setCheckAllLedgersCTime(System.currentTimeMillis()); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (ReplicationException.UnavailableException ue) { - LOG.error("Got exception while trying to set checkAllLedgersCTime", ue); + log.error().exception(ue).log("Got exception while trying to set checkAllLedgersCTime"); } } finally { localAdmin.close(); @@ -275,8 +277,11 @@ public void operationComplete(int rc, Set fragments) { Sets.newHashSet(lh.getId()) ).whenComplete((result, cause) -> { if (null != cause) { - LOG.error("Auditor exception publishing suspected ledger {} with lost bookies {}", - lh.getId(), bookies, cause); + log.error() + .attr("ledgerId", lh.getId()) + .attr("bookies", bookies) + .exception(cause) + .log("Auditor exception publishing suspected ledger"); callback.processResult(BKException.Code.ReplicationException, null, null); } else { callback.processResult(BKException.Code.OK, null, null); @@ -288,7 +293,10 @@ public void operationComplete(int rc, Set fragments) { } lh.closeAsync().whenComplete((result, cause) -> { if (null != cause) { - LOG.warn("Error closing ledger {} : {}", lh.getId(), cause.getMessage()); + log.warn() + .attr("ledgerId", lh.getId()) + .exceptionMessage(cause) + .log("Error closing ledger"); } }); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorElector.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorElector.java index f6b3a3a04f2..c0ced9ddae6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorElector.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorElector.java @@ -34,6 +34,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -43,8 +44,6 @@ import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.stats.annotations.StatsDoc; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Performing auditor election using Apache ZooKeeper. Using ZooKeeper as a @@ -59,9 +58,8 @@ name = AUDITOR_SCOPE, help = "Auditor related stats" ) +@CustomLog public class AuditorElector { - private static final Logger LOG = LoggerFactory - .getLogger(AuditorElector.class); private final String bookieId; private final ServerConfiguration conf; @@ -165,9 +163,9 @@ public void run() { ledgerAuditorManager.close(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.warn("InterruptedException while closing ledger auditor manager", ie); + log.warn().exception(ie).log("InterruptedException while closing ledger auditor manager"); } catch (Exception ke) { - LOG.error("Exception while closing ledger auditor manager", ke); + log.error().exception(ke).log("Exception while closing ledger auditor manager"); } } }; @@ -192,11 +190,11 @@ public void run() { auditor = new Auditor(bookieId, conf, bkc, false, statsLogger); auditor.start(); } catch (InterruptedException e) { - LOG.error("Interrupted while performing auditor election", e); + log.error().exception(e).log("Interrupted while performing auditor election"); Thread.currentThread().interrupt(); submitShutdownTask(); } catch (Exception e) { - LOG.error("Exception while performing auditor election", e); + log.error().exception(e).log("Exception while performing auditor election"); submitShutdownTask(); } } @@ -204,9 +202,7 @@ public void run() { try { return executor.submit(r); } catch (RejectedExecutionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Executor was already closed"); - } + log.debug("Executor was already closed"); return CompletableFuture.completedFuture(null); } } @@ -214,7 +210,7 @@ public void run() { private void handleAuditorEvent(LedgerAuditorManager.AuditorEvent e) { switch (e) { case SessionLost: - LOG.error("Lost ZK connection, shutting down"); + log.error("Lost ZK connection, shutting down"); submitShutdownTask(); break; @@ -247,11 +243,11 @@ public void shutdown() throws InterruptedException { submitShutdownTask().get(10, TimeUnit.SECONDS); executor.shutdown(); } catch (ExecutionException e) { - LOG.warn("Failed to close auditor manager", e); + log.warn().exception(e).log("Failed to close auditor manager"); executor.shutdownNow(); shutdownTask.run(); } catch (TimeoutException e) { - LOG.warn("Failed to close auditor manager in 10 seconds", e); + log.warn().exception(e).log("Failed to close auditor manager in 10 seconds"); executor.shutdownNow(); shutdownTask.run(); } @@ -265,7 +261,7 @@ public void shutdown() throws InterruptedException { try { bkc.close(); } catch (BKException e) { - LOG.warn("Failed to close bookkeeper client", e); + log.warn().exception(e).log("Failed to close bookkeeper client"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorPlacementPolicyCheckTask.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorPlacementPolicyCheckTask.java index 7479e195536..f39bb3924a3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorPlacementPolicyCheckTask.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorPlacementPolicyCheckTask.java @@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; +import lombok.CustomLog; import lombok.Getter; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -41,12 +42,10 @@ import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks; import org.apache.bookkeeper.versioning.Versioned; import org.apache.zookeeper.AsyncCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Getter +@CustomLog public class AuditorPlacementPolicyCheckTask extends AuditorTask { - private static final Logger LOG = LoggerFactory.getLogger(AuditorPlacementPolicyCheckTask.class); private final long underreplicatedLedgerRecoveryGracePeriod; @@ -74,19 +73,19 @@ public class AuditorPlacementPolicyCheckTask extends AuditorTask { @Override protected void runTask() { if (hasBookieCheckTask()) { - LOG.info("Audit bookie task already scheduled; skipping periodic placement policy check task"); + log.info("Audit bookie task already scheduled; skipping periodic placement policy check task"); auditorStats.getNumSkippingCheckTaskTimes().inc(); return; } try { if (!isLedgerReplicationEnabled()) { - LOG.info("Ledger replication disabled, skipping placementPolicyCheck"); + log.info("Ledger replication disabled, skipping placementPolicyCheck"); return; } Stopwatch stopwatch = Stopwatch.createStarted(); - LOG.info("Starting PlacementPolicyCheck"); + log.info("Starting PlacementPolicyCheck"); placementPolicyCheck(); long placementPolicyCheckDuration = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS); int numOfLedgersFoundNotAdheringInPlacementPolicyCheckValue = @@ -97,16 +96,12 @@ protected void runTask() { numOfClosedLedgersAuditedInPlacementPolicyCheck.get(); int numOfURLedgersElapsedRecoveryGracePeriodValue = numOfURLedgersElapsedRecoveryGracePeriod.get(); - LOG.info( - "Completed placementPolicyCheck in {} milliSeconds." - + " numOfClosedLedgersAuditedInPlacementPolicyCheck {}" - + " numOfLedgersNotAdheringToPlacementPolicy {}" - + " numOfLedgersSoftlyAdheringToPlacementPolicy {}" - + " numOfURLedgersElapsedRecoveryGracePeriod {}", - placementPolicyCheckDuration, numOfClosedLedgersAuditedInPlacementPolicyCheckValue, - numOfLedgersFoundNotAdheringInPlacementPolicyCheckValue, - numOfLedgersFoundSoftlyAdheringInPlacementPolicyCheckValue, - numOfURLedgersElapsedRecoveryGracePeriodValue); + log.info().attr("durationMs", placementPolicyCheckDuration) + .attr("numOfClosedLedgersAudited", numOfClosedLedgersAuditedInPlacementPolicyCheckValue) + .attr("numOfLedgersNotAdhering", numOfLedgersFoundNotAdheringInPlacementPolicyCheckValue) + .attr("numOfLedgersSoftlyAdhering", numOfLedgersFoundSoftlyAdheringInPlacementPolicyCheckValue) + .attr("numOfURLedgersElapsedGracePeriod", numOfURLedgersElapsedRecoveryGracePeriodValue) + .log("Completed placementPolicyCheck"); auditorStats.getLedgersNotAdheringToPlacementPolicyGuageValue() .set(numOfLedgersFoundNotAdheringInPlacementPolicyCheckValue); auditorStats.getLedgersSoftlyAdheringToPlacementPolicyGuageValue() @@ -152,16 +147,13 @@ protected void runTask() { .set(numOfURLedgersElapsedRecoveryGracePeriodValue); } - LOG.error( - "BKAuditException running periodic placementPolicy check." - + "numOfLedgersNotAdheringToPlacementPolicy {}, " - + "numOfLedgersSoftlyAdheringToPlacementPolicy {}," - + "numOfURLedgersElapsedRecoveryGracePeriod {}", - numOfLedgersFoundInPlacementPolicyCheckValue, - numOfLedgersFoundSoftlyAdheringInPlacementPolicyCheckValue, - numOfURLedgersElapsedRecoveryGracePeriodValue, e); + log.error().attr("numOfLedgersNotAdhering", numOfLedgersFoundInPlacementPolicyCheckValue) + .attr("numOfLedgersSoftlyAdhering", numOfLedgersFoundSoftlyAdheringInPlacementPolicyCheckValue) + .attr("numOfURLedgersElapsedGracePeriod", numOfURLedgersElapsedRecoveryGracePeriodValue) + .exception(e) + .log("BKAuditException running periodic placementPolicy check"); } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication manager unavailable running periodic check", ue); + log.error().exception(ue).log("Underreplication manager unavailable running periodic check"); } } @@ -193,11 +185,13 @@ void placementPolicyCheck() throws ReplicationException.BKAuditException { } } if (urLedgersElapsedRecoveryGracePeriod.isEmpty()) { - LOG.info("No Underreplicated ledger has elapsed recovery graceperiod: {}", - urLedgersElapsedRecoveryGracePeriod); + log.info() + .attr("urLedgers", urLedgersElapsedRecoveryGracePeriod) + .log("No Underreplicated ledger has elapsed recovery grace period"); } else { - LOG.error("Following Underreplicated ledgers have elapsed recovery graceperiod: {}", - urLedgersElapsedRecoveryGracePeriod); + log.error() + .attr("urLedgers", urLedgersElapsedRecoveryGracePeriod) + .log("Following Underreplicated ledgers have elapsed recovery grace period"); } } BookkeeperInternalCallbacks.Processor ledgerProcessor = @@ -209,13 +203,12 @@ public void process(Long ledgerId, AsyncCallback.VoidCallback iterCallback) { doPlacementPolicyCheck(ledgerId, iterCallback, metadataVer); } else if (BKException.getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring replication of already deleted ledger {}", - ledgerId); - } + log.debug() + .attr("ledgerId", ledgerId) + .log("Ignoring replication of already deleted ledger"); iterCallback.processResult(BKException.Code.OK, null, null); } else { - LOG.warn("Unable to read the ledger: {} information", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Unable to read the ledger information"); iterCallback.processResult(BKException.getExceptionCode(exception), null, null); } }); @@ -244,10 +237,10 @@ public void processResult(int rc, String s, Object obj) { try { ledgerUnderreplicationManager.setPlacementPolicyCheckCTime(System.currentTimeMillis()); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (ReplicationException.UnavailableException ue) { - LOG.error("Got exception while trying to set PlacementPolicyCheckCTime", ue); + log.error().exception(ue).log("Got exception while trying to set PlacementPolicyCheckCTime"); } } @@ -269,23 +262,23 @@ void doPlacementPolicyCheck(Long ledgerId, ackQuorumSize); if (segmentAdheringToPlacementPolicy == EnsemblePlacementPolicy.PlacementPolicyAdherence.FAIL) { foundSegmentNotAdheringToPlacementPolicy = true; - LOG.warn( - "For ledger: {}, Segment starting at entry: {}, with ensemble: {} having " - + "writeQuorumSize: {} and ackQuorumSize: {} is not adhering to " - + "EnsemblePlacementPolicy", - ledgerId, startEntryIdOfSegment, ensembleOfSegment, writeQuorumSize, - ackQuorumSize); + log.warn() + .attr("ledgerId", ledgerId) + .attr("startEntryId", startEntryIdOfSegment) + .attr("ensemble", ensembleOfSegment) + .attr("writeQuorumSize", writeQuorumSize) + .attr("ackQuorumSize", ackQuorumSize) + .log("Segment is not adhering to EnsemblePlacementPolicy"); } else if (segmentAdheringToPlacementPolicy == EnsemblePlacementPolicy.PlacementPolicyAdherence.MEETS_SOFT) { foundSegmentSoftlyAdheringToPlacementPolicy = true; - if (LOG.isDebugEnabled()) { - LOG.debug( - "For ledger: {}, Segment starting at entry: {}, with ensemble: {}" - + " having writeQuorumSize: {} and ackQuorumSize: {} is" - + " softly adhering to EnsemblePlacementPolicy", - ledgerId, startEntryIdOfSegment, ensembleOfSegment, writeQuorumSize, - ackQuorumSize); - } + log.debug() + .attr("ledgerId", ledgerId) + .attr("startEntryId", startEntryIdOfSegment) + .attr("ensemble", ensembleOfSegment) + .attr("writeQuorumSize", writeQuorumSize) + .attr("ackQuorumSize", ackQuorumSize) + .log("Segment is softly adhering to EnsemblePlacementPolicy"); } } if (foundSegmentNotAdheringToPlacementPolicy) { @@ -295,15 +288,19 @@ void doPlacementPolicyCheck(Long ledgerId, ledgerUnderreplicationManager.markLedgerUnderreplicatedAsync(ledgerId, Collections.emptyList()).whenComplete((res, e) -> { if (e != null) { - LOG.error("For ledger: {}, the placement policy not adhering bookie " - + "storage, mark it to under replication manager failed.", - ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("Placement policy not adhering bookie" + + " storage, mark to under replication" + + " manager failed"); return; } - if (LOG.isDebugEnabled()) { - LOG.debug("For ledger: {}, the placement policy not adhering bookie" - + " storage, mark it to under replication manager", ledgerId); - } + log.debug() + .attr("ledgerId", ledgerId) + .log("Placement policy not adhering bookie" + + " storage, marked to under replication" + + " manager"); }); } } else if (foundSegmentSoftlyAdheringToPlacementPolicy) { @@ -312,10 +309,9 @@ void doPlacementPolicyCheck(Long ledgerId, } numOfClosedLedgersAuditedInPlacementPolicyCheck.incrementAndGet(); } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} is not yet closed, so skipping the placementPolicy" - + "check analysis for now", ledgerId); - } + log.debug() + .attr("ledgerId", ledgerId) + .log("Ledger is not yet closed, so skipping the placementPolicy check analysis for now"); } iterCallback.processResult(BKException.Code.OK, null, null); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorReplicasCheckTask.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorReplicasCheckTask.java index b4d98c39398..b3f10c8c1a7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorReplicasCheckTask.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorReplicasCheckTask.java @@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.client.RoundRobinDistributionSchedule; @@ -50,11 +51,9 @@ import org.apache.bookkeeper.versioning.Versioned; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.AsyncCallback.VoidCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class AuditorReplicasCheckTask extends AuditorTask { - private static final Logger LOG = LoggerFactory.getLogger(AuditorReplicasCheckTask.class); private static final int MAX_CONCURRENT_REPLICAS_CHECK_LEDGER_REQUESTS = 100; private static final int REPLICAS_CHECK_TIMEOUT_IN_SECS = 120; @@ -83,18 +82,18 @@ public class AuditorReplicasCheckTask extends AuditorTask { @Override protected void runTask() { if (hasBookieCheckTask()) { - LOG.info("Audit bookie task already scheduled; skipping periodic replicas check task"); + log.info("Audit bookie task already scheduled; skipping periodic replicas check task"); auditorStats.getNumSkippingCheckTaskTimes().inc(); return; } try { if (!ledgerUnderreplicationManager.isLedgerReplicationEnabled()) { - LOG.info("Ledger replication disabled, skipping replicasCheck task."); + log.info("Ledger replication disabled, skipping replicasCheck task."); return; } Stopwatch stopwatch = Stopwatch.createStarted(); - LOG.info("Starting ReplicasCheck"); + log.info("Starting ReplicasCheck"); replicasCheck(); long replicasCheckDuration = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS); int numLedgersFoundHavingNoReplicaOfAnEntryValue = @@ -103,13 +102,15 @@ protected void runTask() { numLedgersFoundHavingLessThanAQReplicasOfAnEntry.get(); int numLedgersFoundHavingLessThanWQReplicasOfAnEntryValue = numLedgersFoundHavingLessThanWQReplicasOfAnEntry.get(); - LOG.info( - "Completed ReplicasCheck in {} milliSeconds numLedgersFoundHavingNoReplicaOfAnEntry {}" - + " numLedgersFoundHavingLessThanAQReplicasOfAnEntry {}" - + " numLedgersFoundHavingLessThanWQReplicasOfAnEntry {}.", - replicasCheckDuration, numLedgersFoundHavingNoReplicaOfAnEntryValue, - numLedgersFoundHavingLessThanAQReplicasOfAnEntryValue, - numLedgersFoundHavingLessThanWQReplicasOfAnEntryValue); + log.info() + .attr("durationMs", replicasCheckDuration) + .attr("numLedgersFoundHavingNoReplicaOfAnEntry", + numLedgersFoundHavingNoReplicaOfAnEntryValue) + .attr("numLedgersFoundHavingLessThanAQReplicasOfAnEntry", + numLedgersFoundHavingLessThanAQReplicasOfAnEntryValue) + .attr("numLedgersFoundHavingLessThanWQReplicasOfAnEntry", + numLedgersFoundHavingLessThanWQReplicasOfAnEntryValue) + .log("Completed ReplicasCheck"); auditorStats.getNumLedgersHavingNoReplicaOfAnEntryGuageValue() .set(numLedgersFoundHavingNoReplicaOfAnEntryValue); auditorStats.getNumLedgersHavingLessThanAQReplicasOfAnEntryGuageValue() @@ -119,7 +120,7 @@ protected void runTask() { auditorStats.getReplicasCheckTime().registerSuccessfulEvent( replicasCheckDuration, TimeUnit.MILLISECONDS); } catch (ReplicationException.BKAuditException e) { - LOG.error("BKAuditException running periodic replicas check.", e); + log.error().exception(e).log("BKAuditException running periodic replicas check"); int numLedgersFoundHavingNoReplicaOfAnEntryValue = numLedgersFoundHavingNoReplicaOfAnEntry.get(); if (numLedgersFoundHavingNoReplicaOfAnEntryValue > 0) { @@ -154,7 +155,7 @@ protected void runTask() { .set(numLedgersFoundHavingLessThanWQReplicasOfAnEntryValue); } } catch (ReplicationException.UnavailableException ue) { - LOG.error("Underreplication manager unavailable running periodic check", ue); + log.error().exception(ue).log("Underreplication manager unavailable running periodic check"); } } @@ -179,7 +180,7 @@ void replicasCheck() throws ReplicationException.BKAuditException { break; } } catch (IOException ioe) { - LOG.error("Got IOException while iterating LedgerRangeIterator", ioe); + log.error().exception(ioe).log("Got IOException while iterating LedgerRangeIterator"); throw new ReplicationException.BKAuditException( "Got IOException while iterating LedgerRangeIterator", ioe); } @@ -206,21 +207,23 @@ public void processResult(int rc, String path, Object ctx) { } } }; - if (LOG.isDebugEnabled()) { - LOG.debug("Number of ledgers in the current LedgerRange : {}", - numOfLedgersInRange); - } + log.debug() + .attr("numOfLedgersInRange", numOfLedgersInRange) + .log("Number of ledgers in the current LedgerRange"); for (Long ledgerInRange : ledgersInRange) { try { if (!maxConcurrentSemaphore.tryAcquire(REPLICAS_CHECK_TIMEOUT_IN_SECS, TimeUnit.SECONDS)) { - LOG.error("Timedout ({} secs) while waiting for acquiring semaphore", - REPLICAS_CHECK_TIMEOUT_IN_SECS); + log.error() + .attr("timeoutSecs", REPLICAS_CHECK_TIMEOUT_IN_SECS) + .log("Timed out while waiting for acquiring semaphore"); throw new ReplicationException.BKAuditException( "Timedout while waiting for acquiring semaphore"); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Got InterruptedException while acquiring semaphore for replicascheck", ie); + log.error() + .exception(ie) + .log("Got InterruptedException while acquiring semaphore for replicascheck"); throw new ReplicationException.BKAuditException( "Got InterruptedException while acquiring semaphore for replicascheck", ie); } @@ -244,16 +247,16 @@ public void processResult(int rc, String path, Object ctx) { * expected. */ if (!replicasCheckLatch.await(REPLICAS_CHECK_TIMEOUT_IN_SECS, TimeUnit.SECONDS)) { - LOG.error( - "For LedgerRange with num of ledgers : {} it didn't complete replicascheck" - + " in {} secs, so giving up", - numOfLedgersInRange, REPLICAS_CHECK_TIMEOUT_IN_SECS); + log.error() + .attr("numOfLedgersInRange", numOfLedgersInRange) + .attr("timeoutSecs", REPLICAS_CHECK_TIMEOUT_IN_SECS) + .log("LedgerRange didn't complete replicascheck in time, so giving up"); throw new ReplicationException.BKAuditException( "Got InterruptedException while doing replicascheck"); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Got InterruptedException while doing replicascheck", ie); + log.error().exception(ie).log("Got InterruptedException while doing replicascheck"); throw new ReplicationException.BKAuditException( "Got InterruptedException while doing replicascheck", ie); } @@ -268,10 +271,10 @@ public void processResult(int rc, String path, Object ctx) { try { ledgerUnderreplicationManager.setReplicasCheckCTime(System.currentTimeMillis()); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); } catch (ReplicationException.UnavailableException ue) { - LOG.error("Got exception while trying to set ReplicasCheckCTime", ue); + log.error().exception(ue).log("Got exception while trying to set ReplicasCheckCTime"); } } @@ -375,14 +378,16 @@ public void accept(Versioned metadataVer, Throwable exception) { if (exception != null) { if (BKException .getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring replicas check of already deleted ledger {}", - ledgerInRange); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .log("Ignoring replicas check of already deleted ledger"); mcbForThisLedgerRange.processResult(BKException.Code.OK, null, null); return; } else { - LOG.warn("Unable to read the ledger: {} information", ledgerInRange, exception); + log.warn() + .attr("ledgerId", ledgerInRange) + .exception(exception) + .log("Unable to read the ledger information"); mcbForThisLedgerRange.processResult(BKException.getExceptionCode(exception), null, null); return; } @@ -390,21 +395,18 @@ public void accept(Versioned metadataVer, Throwable exception) { LedgerMetadata metadata = metadataVer.getValue(); if (!metadata.isClosed()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} is not yet closed, " - + "so skipping the replicas check analysis for now", - ledgerInRange); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .log("Ledger is not yet closed, so skipping the replicas check analysis for now"); mcbForThisLedgerRange.processResult(BKException.Code.OK, null, null); return; } final long lastEntryId = metadata.getLastEntryId(); if (lastEntryId == -1) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} is closed but it doesn't has any entries, " - + "so skipping the replicas check", ledgerInRange); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .log("Ledger is closed but has no entries, so skipping the replicas check"); mcbForThisLedgerRange.processResult(BKException.Code.OK, null, null); return; } @@ -452,12 +454,11 @@ public void accept(Versioned metadataVer, Throwable exception) { * getListOfEntriesOfLedger call for this bookie. So * instead callback with success result. */ - if (LOG.isDebugEnabled()) { - LOG.debug( - "For ledger: {}, in Segment: {}, no entry is expected to contain in" - + " this bookie: {}. So skipping getListOfEntriesOfLedger call", - ledgerInRange, segmentEnsemble, bookieInEnsemble); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .attr("segment", segmentEnsemble) + .attr("bookie", bookieInEnsemble) + .log("No entry expected in this bookie, skipping getListOfEntriesOfLedger call"); mcbForThisLedger.processResult(BKException.Code.OK, null, null); continue; } @@ -556,18 +557,21 @@ public void accept(AvailabilityOfEntriesOfLedger availabilityOfEntriesOfLedger, if (listOfEntriesException != null) { if (BKException .getExceptionCode(listOfEntriesException) == BKException.Code.NoSuchLedgerExistsException) { - if (LOG.isDebugEnabled()) { - LOG.debug("Got NoSuchLedgerExistsException for ledger: {} from bookie: {}", - ledgerInRange, bookieInEnsemble); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .attr("bookie", bookieInEnsemble) + .log("Got NoSuchLedgerExistsException"); /* * in the case of NoSuchLedgerExistsException, it should be * considered as empty AvailabilityOfEntriesOfLedger. */ availabilityOfEntriesOfLedger = AvailabilityOfEntriesOfLedger.EMPTY_AVAILABILITYOFENTRIESOFLEDGER; } else { - LOG.warn("Unable to GetListOfEntriesOfLedger for ledger: {} from: {}", ledgerInRange, - bookieInEnsemble, listOfEntriesException); + log.warn() + .attr("ledgerId", ledgerInRange) + .attr("bookie", bookieInEnsemble) + .exception(listOfEntriesException) + .log("Unable to GetListOfEntriesOfLedger"); MissingEntriesInfoOfLedger unavailableBookiesInfoOfThisLedger = ledgersWithUnavailableBookies .get(ledgerInRange); if (unavailableBookiesInfoOfThisLedger == null) { @@ -685,7 +689,10 @@ private void reportLedgersWithMissingEntries( errMessage.append(", "); } } - LOG.error(errMessage.toString()); + log.error() + .attr("ledgerId", ledgerWithMissingEntries) + .attr("details", errMessage.toString()) + .log("Ledger has missing entries"); Set> missingEntriesSet = missingEntries.entrySet(); int maxNumOfMissingReplicas = 0; long entryWithMaxNumOfMissingReplicas = -1L; @@ -698,18 +705,26 @@ private void reportLedgersWithMissingEntries( int leastNumOfReplicasOfAnEntry = writeQuorumSize - maxNumOfMissingReplicas; if (leastNumOfReplicasOfAnEntry == 0) { numLedgersFoundHavingNoReplicaOfAnEntry.incrementAndGet(); - LOG.error("Ledger : {} entryId : {} is missing all replicas", ledgerWithMissingEntries, - entryWithMaxNumOfMissingReplicas); + log.error() + .attr("ledgerId", ledgerWithMissingEntries) + .attr("entryId", entryWithMaxNumOfMissingReplicas) + .log("Ledger entry is missing all replicas"); } else if (leastNumOfReplicasOfAnEntry < ackQuorumSize) { numLedgersFoundHavingLessThanAQReplicasOfAnEntry.incrementAndGet(); - LOG.error("Ledger : {} entryId : {} is having: {} replicas, less than ackQuorum num of replicas : {}", - ledgerWithMissingEntries, entryWithMaxNumOfMissingReplicas, leastNumOfReplicasOfAnEntry, - ackQuorumSize); + log.error() + .attr("ledgerId", ledgerWithMissingEntries) + .attr("entryId", entryWithMaxNumOfMissingReplicas) + .attr("replicas", leastNumOfReplicasOfAnEntry) + .attr("ackQuorumSize", ackQuorumSize) + .log("Ledger entry has fewer replicas than ackQuorum"); } else if (leastNumOfReplicasOfAnEntry < writeQuorumSize) { numLedgersFoundHavingLessThanWQReplicasOfAnEntry.incrementAndGet(); - LOG.error("Ledger : {} entryId : {} is having: {} replicas, less than writeQuorum num of replicas : {}", - ledgerWithMissingEntries, entryWithMaxNumOfMissingReplicas, leastNumOfReplicasOfAnEntry, - writeQuorumSize); + log.error() + .attr("ledgerId", ledgerWithMissingEntries) + .attr("entryId", entryWithMaxNumOfMissingReplicas) + .attr("replicas", leastNumOfReplicasOfAnEntry) + .attr("writeQuorumSize", writeQuorumSize) + .log("Ledger entry has fewer replicas than writeQuorum"); } } } @@ -735,7 +750,10 @@ private void reportLedgersWithUnavailableBookies( errMessage.append(", "); } } - LOG.error(errMessage.toString()); + log.error() + .attr("ledgerId", ledgerWithUnavailableBookies) + .attr("details", errMessage.toString()) + .log("Ledger has unavailable bookies"); } } @@ -748,18 +766,20 @@ boolean checkUnderReplicationForReplicasCheck(long ledgerInRange, VoidCallback m * this ledger is marked underreplicated, so ignore it for * replicasCheck. */ - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger: {} is marked underrreplicated, ignore this ledger for replicasCheck", - ledgerInRange); - } + log.debug() + .attr("ledgerId", ledgerInRange) + .log("Ledger is marked underreplicated, ignore this ledger for replicasCheck"); mcbForThisLedgerRange.processResult(BKException.Code.OK, null, null); return true; } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("Non Recoverable Exception while reading from ZK", nre); + log.error().exception(nre).log("Non Recoverable Exception while reading from ZK"); submitShutdownTask(); return true; } catch (ReplicationException.UnavailableException une) { - LOG.error("Got exception while trying to check if ledger: {} is underreplicated", ledgerInRange, une); + log.error() + .attr("ledgerId", ledgerInRange) + .exception(une) + .log("Got exception while trying to check if ledger is underreplicated"); mcbForThisLedgerRange.processResult(BKException.getExceptionCode(une), null, null); return true; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorTask.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorTask.java index 0ecfc2ffb29..e8dd04a747d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorTask.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AuditorTask.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.LongAdder; import java.util.function.BiConsumer; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -36,11 +37,9 @@ import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.meta.LedgerUnderreplicationManager; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog abstract class AuditorTask implements Runnable { - private static final Logger LOG = LoggerFactory.getLogger(AuditorTask.class); protected final ServerConfiguration conf; protected AuditorStats auditorStats; @@ -82,10 +81,13 @@ protected CompletableFuture publishSuspectedLedgersAsync(Collection m if (null == ledgers || ledgers.size() == 0) { // there is no ledgers available for this bookie and just // ignoring the bookie failures - LOG.info("There is no ledgers for the failed bookie: {}", missingBookies); + log.info().attr("missingBookies", missingBookies).log("There are no ledgers for the failed bookie"); return FutureUtils.Void(); } - LOG.info("Following ledgers: {} of bookie: {} are identified as underreplicated", ledgers, missingBookies); + log.info() + .attr("ledgers", ledgers) + .attr("missingBookies", missingBookies) + .log("Following ledgers are identified as underreplicated"); auditorStats.getNumUnderReplicatedLedger().registerSuccessfulValue(ledgers.size()); LongAdder underReplicatedSize = new LongAdder(); FutureUtils.processList( diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AutoRecoveryMain.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AutoRecoveryMain.java index d6bc9a50fbc..14662dcd980 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AutoRecoveryMain.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/AutoRecoveryMain.java @@ -30,6 +30,7 @@ import java.net.MalformedURLException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieCriticalThread; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.ExitCode; @@ -57,17 +58,14 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Class to start/stop the AutoRecovery daemons Auditor and ReplicationWorker. * *

TODO: eliminate the direct usage of zookeeper here {@link https://github.com/apache/bookkeeper/issues/1332} */ +@CustomLog public class AutoRecoveryMain { - private static final Logger LOG = LoggerFactory - .getLogger(AutoRecoveryMain.class); private final ServerConfiguration conf; final BookKeeper bkc; @@ -94,7 +92,7 @@ public AutoRecoveryMain(ServerConfiguration conf, StatsLogger statsLogger) this.bkc = Auditor.createBookKeeperClient(conf, statsLogger.scope(BookKeeperClientStats.CLIENT_SCOPE)); MetadataClientDriver metadataClientDriver = bkc.getMetadataClientDriver(); metadataClientDriver.setSessionStateListener(() -> { - LOG.error("Client connection to the Metadata server has expired, so shutting down AutoRecoveryMain!"); + log.error("Client connection to the Metadata server has expired, so shutting down AutoRecoveryMain!"); // do not run "shutdown" in the main ZooKeeper client thread // as it performs some blocking operations CompletableFuture.runAsync(() -> { @@ -144,11 +142,11 @@ public void shutdown() { } private void shutdown(int exitCode) { - LOG.info("Shutting down auto recovery: {}", exitCode); + log.info().attr("exitCode", exitCode).log("Shutting down auto recovery"); if (shuttingDown) { return; } - LOG.info("Shutting down AutoRecovery"); + log.info("Shutting down AutoRecovery"); shuttingDown = true; running = false; this.exitCode = exitCode; @@ -157,16 +155,16 @@ private void shutdown(int exitCode) { auditorElector.shutdown(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.warn("Interrupted shutting down auditor elector", e); + log.warn().exception(e).log("Interrupted shutting down auditor elector"); } replicationWorker.shutdown(); try { bkc.close(); } catch (BKException e) { - LOG.warn("Failed to close bookkeeper client for auto recovery", e); + log.warn().exception(e).log("Failed to close bookkeeper client for auto recovery"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.warn("Interrupted closing bookkeeper client for auto recovery", e); + log.warn().exception(e).log("Interrupted closing bookkeeper client for auto recovery"); } } @@ -216,8 +214,10 @@ public AutoRecoveryDeathWatcher(AutoRecoveryMain autoRecoveryMain) { // set a default uncaught exception handler to shutdown the AutoRecovery // when it notices the AutoRecovery is not running any more. setUncaughtExceptionHandler((thread, cause) -> { - LOG.info("AutoRecoveryDeathWatcher exited loop due to uncaught exception from thread {}", - thread.getName(), cause); + log.info() + .attr("thread", thread.getName()) + .exception(cause) + .log("AutoRecoveryDeathWatcher exited loop due to uncaught exception"); shutdown(); }); } @@ -232,7 +232,7 @@ public void run() { } // If any one service not running, then shutdown peer. if (!autoRecoveryMain.auditorElector.isRunning() || !autoRecoveryMain.replicationWorker.isRunning()) { - LOG.info( + log.info( "AutoRecoveryDeathWatcher noticed the AutoRecovery is not running any more," + "exiting the watch loop!"); /* @@ -270,13 +270,19 @@ private static void loadConfFile(ServerConfiguration conf, String confFile) try { conf.loadConf(new File(confFile).toURI().toURL()); } catch (MalformedURLException e) { - LOG.error("Could not open configuration file: " + confFile, e); + log.error() + .attr("confFile", confFile) + .exception(e) + .log("Could not open configuration file"); throw new IllegalArgumentException(); } catch (ConfigurationException e) { - LOG.error("Malformed configuration file: " + confFile, e); + log.error() + .attr("confFile", confFile) + .exception(e) + .log("Malformed configuration file"); throw new IllegalArgumentException(); } - LOG.info("Using configuration file " + confFile); + log.info().attr("confFile", confFile).log("Using configuration file"); } /* @@ -325,7 +331,7 @@ static int doMain(String[] args) { try { conf = parseArgs(args); } catch (IllegalArgumentException iae) { - LOG.error("Error parsing command line arguments : ", iae); + log.error().exception(iae).log("Error parsing command line arguments"); if (iae.getMessage() != null) { System.err.println(iae.getMessage()); } @@ -338,7 +344,7 @@ static int doMain(String[] args) { try { server = buildAutoRecoveryServer(new BookieConfiguration(conf)); } catch (Exception e) { - LOG.error("Failed to build AutoRecovery Server", e); + log.error().exception(e).log("Failed to build AutoRecovery Server"); System.err.println(e.getMessage()); return ExitCode.SERVER_EXCEPTION; } @@ -349,10 +355,10 @@ static int doMain(String[] args) { } catch (InterruptedException ie) { Thread.currentThread().interrupt(); // the server is interrupted - LOG.info("AutoRecovery server is interrupted. Exiting ..."); + log.info("AutoRecovery server is interrupted. Exiting ..."); System.err.println(ie.getMessage()); } catch (ExecutionException ee) { - LOG.error("Error in bookie shutdown", ee.getCause()); + log.error().exception(ee.getCause()).log("Error in bookie shutdown"); System.err.println(ee.getMessage()); return ExitCode.SERVER_EXCEPTION; } @@ -368,13 +374,13 @@ public static LifecycleComponentStack buildAutoRecoveryServer(BookieConfiguratio StatsLogger rootStatsLogger = statsProviderService.getStatsProvider().getStatsLogger(""); serverBuilder.addComponent(statsProviderService); - LOG.info("Load lifecycle component : {}", StatsProviderService.class.getName()); + log.info().attr("component", StatsProviderService.class.getName()).log("Load lifecycle component"); // 2. build AutoRecovery server AutoRecoveryService autoRecoveryService = new AutoRecoveryService(conf, rootStatsLogger); serverBuilder.addComponent(autoRecoveryService); - LOG.info("Load lifecycle component : {}", AutoRecoveryService.class.getName()); + log.info().attr("component", AutoRecoveryService.class.getName()).log("Load lifecycle component"); // 4. build http service if (conf.getServerConf().isHttpServerEnabled()) { @@ -385,7 +391,7 @@ public static LifecycleComponentStack buildAutoRecoveryServer(BookieConfiguratio HttpService httpService = new HttpService(provider, conf, rootStatsLogger); serverBuilder.addComponent(httpService); - LOG.info("Load lifecycle component : {}", HttpService.class.getName()); + log.info().attr("component", HttpService.class.getName()).log("Load lifecycle component"); } return serverBuilder.build(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java index 38cc79e56e2..3b847e583e6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java @@ -25,22 +25,21 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.replication.ReplicationException.BKAuditException; import org.apache.zookeeper.AsyncCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Preparing bookie vs its corresponding ledgers. This will always look up the * ledgermanager for ledger metadata and will generate indexes. */ +@CustomLog public class BookieLedgerIndexer { - private static final Logger LOG = LoggerFactory.getLogger(BookieLedgerIndexer.class); private final LedgerManager ledgerManager; public BookieLedgerIndexer(LedgerManager ledgerManager) { @@ -75,10 +74,12 @@ public void process(Long ledgerId, AsyncCallback.VoidCallback iterCallback) { iterCallback.processResult(BKException.Code.OK, null, null); } else if (BKException.getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { - LOG.info("Ignoring replication of already deleted ledger {}", ledgerId); + log.info() + .attr("ledgerId", ledgerId) + .log("Ignoring replication of already deleted ledger"); iterCallback.processResult(BKException.Code.OK, null, null); } else { - LOG.warn("Unable to read the ledger: {} information", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Unable to read the ledger information"); iterCallback.processResult(BKException.getExceptionCode(exception), null, null); } }); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationEnableCb.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationEnableCb.java index af94fbf42dd..0caead6c6f2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationEnableCb.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationEnableCb.java @@ -21,25 +21,21 @@ package org.apache.bookkeeper.replication; import java.util.concurrent.CountDownLatch; +import lombok.CustomLog; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Callback which is getting notified when the replication process is enabled. */ +@CustomLog public class ReplicationEnableCb implements GenericCallback { - private static final Logger LOG = LoggerFactory - .getLogger(ReplicationEnableCb.class); private final CountDownLatch latch = new CountDownLatch(1); @Override public void operationComplete(int rc, Void result) { latch.countDown(); - if (LOG.isDebugEnabled()) { - LOG.debug("Automatic ledger re-replication is enabled"); - } + log.debug("Automatic ledger re-replication is enabled"); } /** @@ -50,9 +46,7 @@ public void operationComplete(int rc, Void result) { * interrupted while waiting */ public void await() throws InterruptedException { - if (LOG.isDebugEnabled()) { - LOG.debug("Automatic ledger re-replication is disabled. Hence waiting until its enabled!"); - } + log.debug("Automatic ledger re-replication is disabled. Hence waiting until its enabled!"); latch.await(); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java index 19248631bc1..e79901ccbeb 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java @@ -53,6 +53,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieThread; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsOnMetadataServerException; @@ -80,8 +81,6 @@ import org.apache.bookkeeper.stats.StatsLogger; import org.apache.bookkeeper.stats.annotations.StatsDoc; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ReplicationWorker will take the fragments one by one from @@ -91,9 +90,8 @@ name = REPLICATION_WORKER_SCOPE, help = "replication worker related stats" ) +@CustomLog public class ReplicationWorker implements Runnable { - private static final Logger LOG = LoggerFactory - .getLogger(ReplicationWorker.class); private static final int REPLICATED_FAILED_LEDGERS_MAXSIZE = 2000; public static final int NUM_OF_EXPONENTIAL_BACKOFF_RETRIALS = 5; @@ -248,35 +246,32 @@ public void run() { while (workerRunning) { try { if (!rereplicate()) { - LOG.warn("failed while replicating fragments"); + log.warn("failed while replicating fragments"); waitBackOffTime(rwRereplicateBackoffMs); } } catch (InterruptedException e) { - LOG.error("InterruptedException " - + "while replicating fragments", e); + log.error().exception(e).log("InterruptedException while replicating fragments"); shutdown(); Thread.currentThread().interrupt(); return; } catch (BKException e) { - LOG.error("BKException while replicating fragments", e); + log.error().exception(e).log("BKException while replicating fragments"); waitBackOffTime(rwRereplicateBackoffMs); } catch (ReplicationException.NonRecoverableReplicationException nre) { - LOG.error("NonRecoverableReplicationException " - + "while replicating fragments", nre); + log.error().exception(nre).log("NonRecoverableReplicationException while replicating fragments"); shutdown(); return; } catch (UnavailableException e) { - LOG.error("UnavailableException " - + "while replicating fragments", e); + log.error().exception(e).log("UnavailableException while replicating fragments"); waitBackOffTime(rwRereplicateBackoffMs); if (Thread.currentThread().isInterrupted()) { - LOG.error("Interrupted while replicating fragments"); + log.error("Interrupted while replicating fragments"); shutdown(); return; } } } - LOG.info("ReplicationWorker exited loop!"); + log.info("ReplicationWorker exited loop!"); } private static void waitBackOffTime(long backoffMs) { @@ -313,12 +308,12 @@ private boolean rereplicate() throws InterruptedException, BKException, private void logBKExceptionAndReleaseLedger(BKException e, long ledgerIdToReplicate) throws UnavailableException { - LOG.info("{} while" - + " rereplicating ledger {}." - + " Enough Bookies might not have available" - + " So, no harm to continue", - e.getClass().getSimpleName(), - ledgerIdToReplicate); + log.info() + .attr("exception", e.getClass().getSimpleName()) + .attr("ledgerId", ledgerIdToReplicate) + .log("Exception while rereplicating ledger." + + " Enough Bookies might not be available." + + " No harm to continue"); underreplicationManager .releaseUnderreplicatedLedger(ledgerIdToReplicate); getExceptionCounter(e.getClass().getSimpleName()).inc(); @@ -361,8 +356,11 @@ private boolean tryReadingFaultyEntries(LedgerHandle lh, LedgerFragment ledgerFr multiReadComplete.countDown(); } } else { - LOG.error("Received error: {} while trying to read entry: {} of ledger: {} in ReplicationWorker", - rc, entryIdToRead, ledgerId); + log.error() + .attr("rc", rc) + .attr("entryId", entryIdToRead) + .attr("ledgerId", ledgerId) + .log("Received error while trying to read entry in ReplicationWorker"); returnRCValue.compareAndSet(BKException.Code.OK, rc); /* * on receiving a failure error response, multiRead can be @@ -376,7 +374,7 @@ private boolean tryReadingFaultyEntries(LedgerHandle lh, LedgerFragment ledgerFr try { multiReadComplete.await(); } catch (InterruptedException e) { - LOG.error("Got interrupted exception while trying to read entries", e); + log.error().exception(e).log("Got interrupted exception while trying to read entries"); Thread.currentThread().interrupt(); // set interrupt flag return false; } @@ -428,17 +426,15 @@ private Set getNeedRepairedPlacementNotAdheringFragments(LedgerH } } else if (BKException.getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring replication of already deleted ledger {}", ledgerId); - } + log.debug().attr("ledgerId", ledgerId).log("Ignoring replication of already deleted ledger"); } else { - LOG.warn("Unable to read the ledger: {} information", ledgerId); + log.warn().attr("ledgerId", ledgerId).log("Unable to read the ledger information"); } }); try { FutureUtils.result(future); } catch (Exception e) { - LOG.warn("Check ledger need repaired placement not adhering bookie failed", e); + log.warn().exception(e).log("Check ledger need repaired placement not adhering bookie failed"); return Collections.emptySet(); } return placementNotAdheringFragments; @@ -447,9 +443,7 @@ private Set getNeedRepairedPlacementNotAdheringFragments(LedgerH @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedException, BKException, UnavailableException { - if (LOG.isDebugEnabled()) { - LOG.debug("Going to replicate the fragments of the ledger: {}", ledgerIdToReplicate); - } + log.debug().attr("ledgerId", ledgerIdToReplicate).log("Going to replicate the fragments of the ledger"); boolean deferLedgerLockRelease = false; @@ -457,9 +451,10 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio Set fragments = getUnderreplicatedFragments(lh, conf.getAuditorLedgerVerificationPercentage()); - if (LOG.isDebugEnabled()) { - LOG.debug("Founds fragments {} for replication from ledger: {}", fragments, ledgerIdToReplicate); - } + log.debug() + .attr("fragments", fragments) + .attr("ledgerId", ledgerIdToReplicate) + .log("Found fragments for replication"); boolean foundOpenFragments = false; long numFragsReplicated = 0; @@ -470,8 +465,9 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio continue; } if (!tryReadingFaultyEntries(lh, ledgerFragment)) { - LOG.error("Failed to read faulty entries, so giving up replicating ledgerFragment {}", - ledgerFragment); + log.error() + .attr("ledgerFragment", ledgerFragment) + .log("Failed to read faulty entries, so giving up replicating ledgerFragment"); continue; } try { @@ -482,11 +478,11 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio numNotAdheringPlacementFragsReplicated++; } } catch (BKException.BKBookieHandleNotAvailableException e) { - LOG.warn("BKBookieHandleNotAvailableException while replicating the fragment", e); + log.warn().exception(e).log("BKBookieHandleNotAvailableException while replicating the fragment"); } catch (BKException.BKLedgerRecoveryException e) { - LOG.warn("BKLedgerRecoveryException while replicating the fragment", e); + log.warn().exception(e).log("BKLedgerRecoveryException while replicating the fragment"); } catch (BKException.BKNotEnoughBookiesException e) { - LOG.warn("BKNotEnoughBookiesException while replicating the fragment", e); + log.warn().exception(e).log("BKNotEnoughBookiesException while replicating the fragment"); } } @@ -505,7 +501,7 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio fragments = getUnderreplicatedFragments(lh, conf.getAuditorLedgerVerificationPercentage()); if (fragments.size() == 0) { - LOG.info("Ledger replicated successfully. ledger id is: " + ledgerIdToReplicate); + log.info().attr("ledgerId", ledgerIdToReplicate).log("Ledger replicated successfully"); underreplicationManager.markLedgerReplicated(ledgerIdToReplicate); return true; } else { @@ -519,10 +515,12 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio } catch (BKNoSuchLedgerExistsOnMetadataServerException e) { // Ledger might have been deleted by user - LOG.info("BKNoSuchLedgerExistsOnMetadataServerException while opening " - + "ledger {} for replication. Other clients " - + "might have deleted the ledger. " - + "So, no harm to continue", ledgerIdToReplicate); + log.info() + .attr("ledgerId", ledgerIdToReplicate) + .log("BKNoSuchLedgerExistsOnMetadataServerException" + + " while opening ledger for replication." + + " Other clients might have deleted" + + " the ledger"); underreplicationManager.markLedgerReplicated(ledgerIdToReplicate); getExceptionCounter("BKNoSuchLedgerExistsOnMetadataServerException").inc(); return false; @@ -539,8 +537,10 @@ private boolean rereplicate(long ledgerIdToReplicate) throws InterruptedExceptio try { underreplicationManager.releaseUnderreplicatedLedger(ledgerIdToReplicate); } catch (UnavailableException e) { - LOG.error("UnavailableException while releasing the underreplicated lock for ledger {}:", - ledgerIdToReplicate, e); + log.error() + .attr("ledgerId", ledgerIdToReplicate) + .exception(e) + .log("UnavailableException while releasing the underreplicated lock for ledger"); shutdown(); } } @@ -592,10 +592,11 @@ private boolean isLastSegmentOpenAndMissingBookies(LedgerHandle lh) throws BKExc Collection available = admin.getAvailableBookies(); for (BookieId b : finalEnsemble) { if (!available.contains(b)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Bookie {} is missing from the list of Available Bookies. ledger {}:ensemble {}.", - b, lh.getId(), finalEnsemble); - } + log.debug() + .attr("bookie", b) + .attr("ledgerId", lh.getId()) + .attr("ensemble", finalEnsemble) + .log("Bookie is missing from the list of Available Bookies"); return true; } } @@ -665,7 +666,9 @@ public void run() { // Need recovery open, close the old ledger handle. lh.close(); // Recovery open could result in client write failure. - LOG.warn("Missing bookie(s) from last segment. Opening Ledger {} for Recovery.", ledgerId); + log.warn() + .attr("ledgerId", ledgerId) + .log("Missing bookie(s) from last segment. Opening Ledger for Recovery"); lh = admin.openLedger(ledgerId); isRecoveryOpen = true; } @@ -677,8 +680,10 @@ public void run() { // Need recovery open, close the old ledger handle. lh.close(); // Recovery open could result in client write failure. - LOG.warn("Open Fragment{}. Opening Ledger {} for Recovery.", - fragment.getEnsemble(), ledgerId); + log.warn() + .attr("ensemble", fragment.getEnsemble()) + .attr("ledgerId", ledgerId) + .log("Open Fragment. Opening Ledger for Recovery"); lh = admin.openLedger(ledgerId); isRecoveryOpen = true; break; @@ -687,15 +692,22 @@ public void run() { } } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.info("InterruptedException while fencing the ledger {}" - + " for rereplication of postponed ledgers", ledgerId, e); + log.info() + .attr("ledgerId", ledgerId) + .exception(e) + .log("InterruptedException while fencing the" + + " ledger for rereplication of" + + " postponed ledgers"); } catch (BKNoSuchLedgerExistsOnMetadataServerException bknsle) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ledger {} was deleted, safe to continue", ledgerId, bknsle); - } + log.debug() + .attr("ledgerId", ledgerId) + .exception(bknsle) + .log("Ledger was deleted, safe to continue"); } catch (BKException e) { - LOG.error("BKException while fencing the ledger {}" - + " for rereplication of postponed ledgers", ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("BKException while fencing the ledger for rereplication of postponed ledgers"); } finally { try { if (lh != null) { @@ -703,19 +715,27 @@ public void run() { } } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.info("InterruptedException while closing ledger {}", ledgerId, e); + log.info() + .attr("ledgerId", ledgerId) + .exception(e) + .log("InterruptedException while closing ledger"); } catch (BKException e) { // Lets go ahead and release the lock. Catch actual // exception in normal replication flow and take // action. - LOG.warn("BKException while closing ledger {} ", ledgerId, e); + log.warn() + .attr("ledgerId", ledgerId) + .exception(e) + .log("BKException while closing ledger"); } finally { try { underreplicationManager .releaseUnderreplicatedLedger(ledgerId); } catch (UnavailableException e) { - LOG.error("UnavailableException while replicating fragments of ledger {}", - ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("UnavailableException while replicating fragments of ledger"); shutdown(); } } @@ -738,17 +758,21 @@ private void deferLedgerLockReleaseOfFailedLedger(final long ledgerId) { long delayOfLedgerLockReleaseInMSecs = (numOfTimesFailedSoFar >= NUM_OF_EXPONENTIAL_BACKOFF_RETRIALS) ? this.lockReleaseOfFailedLedgerGracePeriod : this.baseBackoffForLockReleaseOfFailedLedger * (int) Math.pow(2, numOfTimesFailedSoFar); - LOG.error( - "ReplicationWorker failed to replicate Ledger : {} for {} number of times, " - + "so deferring the ledger lock release by {} msecs", - ledgerId, numOfTimesFailedSoFar, delayOfLedgerLockReleaseInMSecs); + log.error() + .attr("ledgerId", ledgerId) + .attr("numFailures", numOfTimesFailedSoFar) + .attr("delayMs", delayOfLedgerLockReleaseInMSecs) + .log("ReplicationWorker failed to replicate Ledger, deferring the ledger lock release"); TimerTask timerTask = new TimerTask() { @Override public void run() { try { underreplicationManager.releaseUnderreplicatedLedger(ledgerId); } catch (UnavailableException e) { - LOG.error("UnavailableException while replicating fragments of ledger {}", ledgerId, e); + log.error() + .attr("ledgerId", ledgerId) + .exception(e) + .log("UnavailableException while replicating fragments of ledger"); shutdown(); } } @@ -760,7 +784,7 @@ public void run() { * Stop the replication worker service. */ public void shutdown() { - LOG.info("Shutting down replication worker"); + log.info("Shutting down replication worker"); synchronized (this) { if (!workerRunning) { @@ -768,31 +792,29 @@ public void shutdown() { } workerRunning = false; } - LOG.info("Shutting down ReplicationWorker"); + log.info("Shutting down ReplicationWorker"); this.pendingReplicationTimer.cancel(); try { this.workerThread.interrupt(); this.workerThread.join(); } catch (InterruptedException e) { - LOG.error("Interrupted during shutting down replication worker : ", - e); + log.error().exception(e).log("Interrupted during shutting down replication worker"); Thread.currentThread().interrupt(); } if (ownBkc) { try { bkc.close(); } catch (InterruptedException e) { - LOG.warn("Interrupted while closing the Bookie client", e); + log.warn().exception(e).log("Interrupted while closing the Bookie client"); Thread.currentThread().interrupt(); } catch (BKException e) { - LOG.warn("Exception while closing the Bookie client", e); + log.warn().exception(e).log("Exception while closing the Bookie client"); } } try { underreplicationManager.close(); } catch (UnavailableException e) { - LOG.warn("Exception while closing the " - + "ZkLedgerUnderrepliationManager", e); + log.warn().exception(e).log("Exception while closing the ZkLedgerUnderreplicationManager"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProvider.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProvider.java index eb0c817b5c9..eeeb66194ae 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProvider.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProvider.java @@ -25,22 +25,20 @@ import javax.security.auth.Subject; import javax.security.auth.login.LoginException; import javax.security.sasl.SaslException; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.auth.AuthToken; import org.apache.bookkeeper.auth.BookieAuthProvider; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.proto.BookieConnectionPeer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * SASL Bookie Authentication Provider. */ +@CustomLog public class SASLBookieAuthProvider implements BookieAuthProvider { - private static final Logger LOG = LoggerFactory.getLogger(SASLBookieAuthProvider.class); - private SaslServerState server; private final AuthCallbacks.GenericCallback completeCb; @@ -50,7 +48,7 @@ public class SASLBookieAuthProvider implements BookieAuthProvider { try { server = new SaslServerState(serverConfiguration, subject, allowedIdsPattern); } catch (IOException | LoginException error) { - LOG.error("Error while booting SASL server", error); + log.error().exception(error).log("Error while booting SASL server"); completeCb.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } @@ -67,9 +65,7 @@ public void process(AuthToken m, AuthCallbacks.GenericCallback cb) { completeCb.operationComplete(BKException.Code.OK, null); } } catch (SaslException err) { - if (LOG.isDebugEnabled()) { - LOG.debug("SASL error", err); - } + log.debug().exception(err).log("SASL error"); completeCb.operationComplete(BKException.Code.UnauthorizedAccessException, null); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProviderFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProviderFactory.java index a899b285edb..80d66adb4f9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProviderFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLBookieAuthProviderFactory.java @@ -37,21 +37,19 @@ import javax.security.sasl.AuthorizeCallback; import javax.security.sasl.RealmCallback; import javax.security.sasl.SaslException; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.proto.BookieConnectionPeer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * BookieAuthProvider which uses JDK-bundled SASL. */ +@CustomLog public class SASLBookieAuthProviderFactory implements org.apache.bookkeeper.auth.BookieAuthProvider.Factory, JAASCredentialsContainer { - private static final Logger LOG = LoggerFactory.getLogger(SASLBookieAuthProviderFactory.class); - private Pattern allowedIdsPattern; private ServerConfiguration serverConfiguration; private Subject subject; @@ -71,7 +69,10 @@ public void init(ServerConfiguration conf) throws IOException { try { this.allowedIdsPattern = Pattern.compile(allowedIdsPatternRegExp); } catch (PatternSyntaxException error) { - LOG.error("Invalid regular expression " + allowedIdsPatternRegExp, error); + log.error() + .attr("pattern", allowedIdsPatternRegExp) + .exception(error) + .log("Invalid regular expression"); throw new IOException(error); } @@ -113,9 +114,7 @@ public void close() { ticketRefreshThread.join(10000); } catch (InterruptedException exit) { Thread.currentThread().interrupt(); - if (LOG.isDebugEnabled()) { - LOG.debug("interrupted while waiting for TGT reresh thread to stop", exit); - } + log.debug().exception(exit).log("interrupted while waiting for TGT refresh thread to stop"); } } } @@ -160,8 +159,9 @@ private LoginContext loginServer() throws SaslException, LoginException { AppConfigurationEntry[] entries = Configuration.getConfiguration() .getAppConfigurationEntry(loginContextName); if (entries == null) { - LOG.info("JAAS not configured or no " - + loginContextName + " present in JAAS Configuration file"); + log.info() + .attr("loginContextName", loginContextName) + .log("JAAS not configured or no entry present in JAAS Configuration file"); return null; } LoginContext loginContext = new LoginContext(loginContextName, new ClientCallbackHandler(null)); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientAuthProvider.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientAuthProvider.java index d730c05ee03..62720a75035 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientAuthProvider.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientAuthProvider.java @@ -26,20 +26,19 @@ import java.net.SocketAddress; import javax.security.auth.Subject; import javax.security.sasl.SaslException; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.auth.AuthToken; import org.apache.bookkeeper.auth.ClientAuthProvider; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.proto.ClientConnectionPeer; -import org.slf4j.LoggerFactory; /** * SASL Client Authentication Provider. */ +@CustomLog public class SASLClientAuthProvider implements ClientAuthProvider { - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SASLClientAuthProvider.class); - private SaslClientState client; private final AuthCallbacks.GenericCallback completeCb; @@ -56,11 +55,12 @@ public class SASLClientAuthProvider implements ClientAuthProvider { hostname = InetAddress.getLocalHost().getHostName(); } client = new SaslClientState(hostname, subject); - if (LOG.isDebugEnabled()) { - LOG.debug("SASLClientAuthProvider Boot " + client + " for " + hostname); - } + log.debug() + .attr("client", client) + .attr("hostname", hostname) + .log("SASLClientAuthProvider Boot"); } catch (IOException error) { - LOG.error("Error while booting SASL client", error); + log.error().exception(error).log("Error while booting SASL client"); completeCb.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } @@ -75,7 +75,7 @@ public void init(AuthCallbacks.GenericCallback cb) { cb.operationComplete(BKException.Code.OK, AuthToken.wrap(new byte[0])); } } catch (SaslException err) { - LOG.error("Error on SASL client", err); + log.error().exception(err).log("Error on SASL client"); completeCb.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } @@ -97,7 +97,7 @@ public void process(AuthToken m, AuthCallbacks.GenericCallback cb) { completeCb.operationComplete(BKException.Code.OK, null); } } catch (SaslException err) { - LOG.error("Error on SASL client", err); + log.error().exception(err).log("Error on SASL client"); completeCb.operationComplete(BKException.Code.UnauthorizedAccessException, null); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientProviderFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientProviderFactory.java index 2d877fc9938..88c50cc0aab 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientProviderFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SASLClientProviderFactory.java @@ -34,21 +34,20 @@ import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import javax.security.sasl.SaslException; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.auth.ClientAuthProvider; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.proto.ClientConnectionPeer; -import org.slf4j.LoggerFactory; /** * ClientAuthProvider which uses JDK-bundled SASL. */ +@CustomLog public class SASLClientProviderFactory implements org.apache.bookkeeper.auth.ClientAuthProvider.Factory, JAASCredentialsContainer { - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SASLClientProviderFactory.class); - private ClientConfiguration clientConfiguration; private LoginContext login; private Subject subject; @@ -99,7 +98,7 @@ private LoginContext loginClient() throws SaslException, LoginException { AppConfigurationEntry[] entries = Configuration.getConfiguration() .getAppConfigurationEntry(configurationEntry); if (entries == null) { - LOG.info("No JAAS Configuration found with section BookKeeper"); + log.info("No JAAS Configuration found with section BookKeeper"); return null; } try { @@ -108,7 +107,7 @@ private LoginContext loginClient() throws SaslException, LoginException { loginContext.login(); return loginContext; } catch (LoginException error) { - LOG.error("Error JAAS Configuration subject", error); + log.error().exception(error).log("Error JAAS Configuration subject"); return null; } } @@ -121,9 +120,7 @@ public void close() { ticketRefreshThread.join(10000); } catch (InterruptedException exit) { Thread.currentThread().interrupt(); - if (LOG.isDebugEnabled()) { - LOG.debug("interrupted while waiting for TGT reresh thread to stop", exit); - } + log.debug().exception(exit).log("interrupted while waiting for TGT refresh thread to stop"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslClientState.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslClientState.java index 4da35d9289c..5115ae0eade 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslClientState.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslClientState.java @@ -34,16 +34,15 @@ import javax.security.sasl.Sasl; import javax.security.sasl.SaslClient; import javax.security.sasl.SaslException; +import lombok.CustomLog; import org.apache.zookeeper.server.auth.KerberosName; -import org.slf4j.LoggerFactory; /** * A SASL Client State data object. */ +@CustomLog public class SaslClientState { - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SaslClientState.class); - private final SaslClient saslClient; private final Subject clientSubject; private String username; @@ -58,9 +57,7 @@ public SaslClientState(String serverHostname, Subject subject) throws SaslExcept throw new SaslException("Cannot create JAAS Sujbect for SASL"); } if (clientSubject.getPrincipals().isEmpty()) { - if (LOG.isDebugEnabled()) { - LOG.debug("Using JAAS/SASL/DIGEST-MD5 auth to connect to {}", serverPrincipal); - } + log.debug().attr("serverPrincipal", serverPrincipal).log("Using JAAS/SASL/DIGEST-MD5 auth to connect"); String[] mechs = {"DIGEST-MD5"}; username = (String) (clientSubject.getPublicCredentials().toArray()[0]); password = (String) (clientSubject.getPrivateCredentials().toArray()[0]); @@ -74,9 +71,7 @@ public SaslClientState(String serverHostname, Subject subject) throws SaslExcept final String serviceName = serviceKerberosName.getServiceName(); final String serviceHostname = serviceKerberosName.getHostName(); final String clientPrincipalName = clientKerberosName.toString(); - if (LOG.isDebugEnabled()) { - LOG.debug("Using JAAS/SASL/GSSAPI auth to connect to server Principal {}", serverPrincipal); - } + log.debug().attr("serverPrincipal", serverPrincipal).log("Using JAAS/SASL/GSSAPI auth to connect"); try { saslClient = Subject.doAs(clientSubject, new PrivilegedExceptionAction() { @Override @@ -87,9 +82,7 @@ public SaslClient run() throws SaslException { } }); } catch (PrivilegedActionException err) { - if (LOG.isDebugEnabled()) { - LOG.debug("GSSAPI client error", err.getCause()); - } + log.debug().exception(err.getCause()).log("GSSAPI client error"); throw new SaslException("error while booting GSSAPI client", err.getCause()); } } @@ -113,9 +106,7 @@ public byte[] run() throws SaslException { }); return retval; } catch (PrivilegedActionException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("SASL error", e.getCause()); - } + log.debug().exception(e.getCause()).log("SASL error"); throw new SaslException("SASL/JAAS error", e.getCause()); } } else { @@ -184,9 +175,7 @@ public byte[] saslResponse(byte[] saslTokenMessage) { byte[] retval = saslClient.evaluateChallenge(saslTokenMessage); return retval; } catch (SaslException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("saslResponse: Failed to respond to SASL server's token:", e); - } + log.debug().exception(e).log("saslResponse: Failed to respond to SASL server's token"); return null; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java index d8c6a62ed90..c2dd854f443 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java @@ -40,17 +40,16 @@ import javax.security.sasl.Sasl; import javax.security.sasl.SaslException; import javax.security.sasl.SaslServer; +import lombok.CustomLog; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.zookeeper.server.auth.KerberosName; -import org.slf4j.LoggerFactory; /** * Server side Sasl implementation. */ +@CustomLog public class SaslServerState { - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(SaslServerState.class); - private final SaslServer saslServer; private final Pattern allowedIdsPattern; @@ -70,9 +69,9 @@ private SaslServer createSaslServer(final Subject subject, ServerConfiguration s try { final Object[] principals = subject.getPrincipals().toArray(); final Principal servicePrincipal = (Principal) principals[0]; - if (LOG.isDebugEnabled()) { - LOG.debug("Authentication will use SASL/JAAS/Kerberos, servicePrincipal is {}", servicePrincipal); - } + log.debug() + .attr("servicePrincipal", servicePrincipal) + .log("Authentication will use SASL/JAAS/Kerberos"); final String servicePrincipalNameAndHostname = servicePrincipal.getName(); int indexOf = servicePrincipalNameAndHostname.indexOf("/"); @@ -110,9 +109,7 @@ public SaslServer run() { throw new SaslException("error on GSSAPI boot", e); } } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Authentication will use SASL/JAAS/DIGEST-MD5"); - } + log.debug("Authentication will use SASL/JAAS/DIGEST-MD5"); return Sasl.createSaslServer("DIGEST-MD5", SaslConstants.SASL_BOOKKEEPER_PROTOCOL, SaslConstants.SASL_MD5_DUMMY_HOSTNAME, null, callbackHandler); } @@ -131,7 +128,7 @@ public byte[] response(byte[] token) throws SaslException { byte[] retval = saslServer.evaluateResponse(token); return retval; } catch (SaslException e) { - LOG.error("response: Failed to evaluate client token", e); + log.error().exception(e).log("response: Failed to evaluate client token"); throw e; } } @@ -188,7 +185,7 @@ public void handle(Callback[] callbacks) throws UnsupportedCallbackException { private void handleNameCallback(NameCallback nc) { // check to see if this user is in the user password database. if (credentials.get(nc.getDefaultName()) == null) { - LOG.error("User '" + nc.getDefaultName() + "' not found in list of JAAS DIGEST-MD5 users."); + log.error().attr("user", nc.getDefaultName()).log("User not found in list of JAAS DIGEST-MD5 users"); return; } nc.setName(nc.getDefaultName()); @@ -199,14 +196,12 @@ private void handlePasswordCallback(PasswordCallback pc) { if (credentials.containsKey(userName)) { pc.setPassword(credentials.get(userName).toCharArray()); } else { - LOG.info("No password found for user: " + userName); + log.info().attr("user", userName).log("No password found for user"); } } private void handleRealmCallback(RealmCallback rc) { - if (LOG.isDebugEnabled()) { - LOG.debug("client supplied realm: " + rc.getDefaultText()); - } + log.debug().attr("realm", rc.getDefaultText()).log("client supplied realm"); rc.setText(rc.getDefaultText()); } @@ -215,34 +210,36 @@ private void handleAuthorizeCallback(AuthorizeCallback ac) { String authorizationID = ac.getAuthorizationID(); if (!authenticationID.equals(authorizationID)) { ac.setAuthorized(false); - LOG.info("Forbidden access to client: authenticationID=" + authenticationID - + " is different from authorizationID=" + authorizationID + "."); + log.info() + .attr("authenticationID", authenticationID) + .attr("authorizationID", authorizationID) + .log("Forbidden access to client: authenticationID is different from authorizationID"); return; } if (!allowedIdsPattern.matcher(authenticationID).matches()) { ac.setAuthorized(false); - LOG.info("Forbidden access to client: authenticationID=" + authenticationID - + " is not allowed (see " + SaslConstants.JAAS_CLIENT_ALLOWED_IDS + " property)"); + log.info() + .attr("authenticationID", authenticationID) + .attr("configProperty", SaslConstants.JAAS_CLIENT_ALLOWED_IDS) + .log("Forbidden access to client: authenticationID is not allowed"); return; } ac.setAuthorized(true); - if (LOG.isDebugEnabled()) { - LOG.debug("Successfully authenticated client: authenticationID=" + authenticationID - + "; authorizationID=" + authorizationID + "."); - } + log.debug() + .attr("authenticationID", authenticationID) + .attr("authorizationID", authorizationID) + .log("Successfully authenticated client"); KerberosName kerberosName = new KerberosName(authenticationID); try { StringBuilder userNameBuilder = new StringBuilder(kerberosName.getShortName()); userNameBuilder.append("/").append(kerberosName.getHostName()); userNameBuilder.append("@").append(kerberosName.getRealm()); - if (LOG.isDebugEnabled()) { - LOG.debug("Setting authorizedID: " + userNameBuilder); - } + log.debug().attr("authorizedID", userNameBuilder).log("Setting authorizedID"); ac.setAuthorizedID(userNameBuilder.toString()); } catch (IOException e) { - LOG.error("Failed to set name based on Kerberos authentication rules."); + log.error("Failed to set name based on Kerberos authentication rules."); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java index 2d8c9efa759..c49e2dd2478 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java @@ -27,18 +27,16 @@ import javax.security.auth.kerberos.KerberosTicket; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; +import lombok.CustomLog; import org.apache.zookeeper.Login; import org.apache.zookeeper.Shell; import org.apache.zookeeper.common.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * TGT Refresh Thread. Copied from Apache ZooKeeper TGT refresh logic. */ +@CustomLog class TGTRefreshThread extends Thread { - - private static final Logger LOG = LoggerFactory.getLogger(TGTRefreshThread.class); private static final Random rng = new Random(); private long lastLogin; @@ -65,10 +63,8 @@ private synchronized KerberosTicket getTGT() { for (KerberosTicket ticket : tickets) { KerberosPrincipal server = ticket.getServer(); if (server.getName().equals("krbtgt/" + server.getRealm() + "@" + server.getRealm())) { - if (LOG.isDebugEnabled()) { - LOG.debug("Client principal is \"" + ticket.getClient().getName() + "\"."); - LOG.debug("Server principal is \"" + ticket.getServer().getName() + "\"."); - } + log.debug().attr("clientPrincipal", ticket.getClient().getName()).log("Client principal"); + log.debug().attr("serverPrincipal", ticket.getServer().getName()).log("Server principal"); return ticket; } } @@ -90,8 +86,8 @@ private synchronized KerberosTicket getTGT() { private long getRefreshTime(KerberosTicket tgt) { long start = tgt.getStartTime().getTime(); long expires = tgt.getEndTime().getTime(); - LOG.info("TGT valid starting at: {}", tgt.getStartTime().toString()); - LOG.info("TGT expires: {}", tgt.getEndTime().toString()); + log.info().attr("startTime", tgt.getStartTime().toString()).log("TGT valid"); + log.info().attr("endTime", tgt.getEndTime().toString()).log("TGT expires"); long proposedRefresh = start + (long) ((expires - start) * (TICKET_RENEW_WINDOW + (TICKET_RENEW_JITTER * rng.nextDouble()))); if (proposedRefresh > expires) { @@ -104,7 +100,7 @@ private long getRefreshTime(KerberosTicket tgt) { @Override public void run() { - LOG.info("TGT refresh thread started."); + log.info("TGT refresh thread started."); while (true) { // renewal thread's main loop. if it exits from here, thread will exit. KerberosTicket tgt = getTGT(); @@ -114,20 +110,21 @@ public void run() { if (tgt == null) { nextRefresh = now + MIN_TIME_BEFORE_RELOGIN; nextRefreshDate = new Date(nextRefresh); - LOG.warn("No TGT found: will try again at {}", nextRefreshDate); + log.warn().attr("nextRefreshDate", nextRefreshDate).log("No TGT found: will try again"); } else { nextRefresh = getRefreshTime(tgt); long expiry = tgt.getEndTime().getTime(); Date expiryDate = new Date(expiry); if ((container.isUsingTicketCache()) && (tgt.getEndTime().equals(tgt.getRenewTill()))) { - Object[] logPayload = {expiryDate, container.getPrincipal(), container.getPrincipal()}; - LOG.error("The TGT cannot be renewed beyond the next expiry date: {}." + log.error() + .attr("expiryDate", expiryDate) + .attr("principal", container.getPrincipal()) + .log("The TGT cannot be renewed beyond the next expiry date. " + "This process will not be able to authenticate new SASL connections after that " - + "time (for example, it will not be authenticate a new connection with a Bookie " - + "). Ask your system administrator to either increase the " - + "'renew until' time by doing : 'modprinc -maxrenewlife {}' within " - + "kadmin, or instead, to generate a keytab for {}. Because the TGT's " - + "expiry cannot be further extended by refreshing, exiting refresh thread now.", logPayload); + + "time. Ask your system administrator to either increase the " + + "'renew until' time by doing 'modprinc -maxrenewlife' within " + + "kadmin, or instead, to generate a keytab. Because the TGT's " + + "expiry cannot be further extended by refreshing, exiting refresh thread now."); return; } // determine how long to sleep from looking at ticket's expiry. @@ -142,39 +139,45 @@ public void run() { // next scheduled refresh is sooner than (now + MIN_TIME_BEFORE_LOGIN). Date until = new Date(nextRefresh); Date newuntil = new Date(now + MIN_TIME_BEFORE_RELOGIN); - Object[] logPayload = {until, newuntil, MIN_TIME_BEFORE_RELOGIN / 1000}; - LOG.warn("TGT refresh thread time adjusted from : {} to : {} since " - + "the former is sooner than the minimum refresh interval (" - + "{} seconds) from now.", logPayload); + log.warn() + .attr("from", until) + .attr("to", newuntil) + .attr("minRefreshIntervalSec", MIN_TIME_BEFORE_RELOGIN / 1000) + .log("TGT refresh thread time adjusted" + + " since the former is sooner than" + + " the minimum refresh interval" + + " from now"); } nextRefresh = Math.max(nextRefresh, now + MIN_TIME_BEFORE_RELOGIN); } nextRefreshDate = new Date(nextRefresh); if (nextRefresh > expiry) { - Object[] logPayload = {nextRefreshDate, expiryDate}; - LOG.error("next refresh: {} is later than expiry {}." + " This may indicate a clock skew problem." - + "Check that this host and the KDC's " + "hosts' clocks are in sync. Exiting refresh thread.", - logPayload); + log.error() + .attr("nextRefresh", nextRefreshDate) + .attr("expiry", expiryDate) + .log("next refresh is later than expiry. This may indicate a clock skew problem. " + + "Check that this host and the KDC's hosts' clocks are in sync. Exiting refresh thread."); return; } } if (now == nextRefresh) { - LOG.info("refreshing now because expiry is before next scheduled refresh time."); + log.info("refreshing now because expiry is before next scheduled refresh time."); } else if (now < nextRefresh) { Date until = new Date(nextRefresh); - LOG.info("TGT refresh sleeping until: {}", until); + log.info().attr("until", until).log("TGT refresh sleeping"); try { Thread.sleep(nextRefresh - now); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.warn("TGT renewal thread has been interrupted and will exit."); + log.warn("TGT renewal thread has been interrupted and will exit."); break; } } else { - LOG.error("nextRefresh:{} is in the past: exiting refresh thread. Check" + log.error().attr("nextRefresh", nextRefreshDate) + .log("nextRefresh is in the past: exiting refresh thread. Check" + " clock sync between this host and KDC - (KDC's clock is likely ahead of this host)." + " Manual intervention will be required for this client to successfully authenticate." - + " Exiting refresh thread.", nextRefreshDate); + + " Exiting refresh thread."); break; } if (container.isUsingTicketCache()) { @@ -184,9 +187,10 @@ public void run() { int retry = 1; while (retry >= 0) { try { - if (LOG.isDebugEnabled()) { - LOG.debug("running ticket cache refresh command: {} {}", cmd, kinitArgs); - } + log.debug() + .attr("command", cmd) + .attr("args", kinitArgs) + .log("running ticket cache refresh command"); Shell.execCommand(cmd, kinitArgs); break; } catch (Exception e) { @@ -197,13 +201,17 @@ public void run() { Thread.sleep(10 * 1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while renewing TGT, exiting Login thread"); + log.error("Interrupted while renewing TGT, exiting Login thread"); return; } } else { - Object[] logPayload = {cmd, kinitArgs, e.toString(), e}; - LOG.warn("Could not renew TGT due to problem running shell command: '{}" - + " {}'; exception was:{}. Exiting refresh thread.", logPayload); + log.warn() + .attr("command", cmd) + .attr("args", kinitArgs) + .exception(e) + .log("Could not renew TGT due to problem" + + " running shell command." + + " Exiting refresh thread."); return; } } @@ -223,16 +231,19 @@ public void run() { Thread.sleep(10 * 1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Interrupted during login retry after LoginException:", le); + log.error().exception(le).log("Interrupted during login retry after LoginException"); throw le; } } else { - LOG.error("Could not refresh TGT for principal: {}.", container.getPrincipal(), le); + log.error() + .attr("principal", container.getPrincipal()) + .exception(le) + .log("Could not refresh TGT for principal"); } } } } catch (LoginException le) { - LOG.error("Failed to refresh TGT: refresh thread exiting now.", le); + log.error().exception(le).log("Failed to refresh TGT: refresh thread exiting now."); break; } } @@ -252,7 +263,7 @@ private synchronized void reLogin() throws LoginException { if (!hasSufficientTimeElapsed()) { return; } - LOG.info("Initiating logout for {}", container.getPrincipal()); + log.info().attr("principal", container.getPrincipal()).log("Initiating logout"); synchronized (Login.class) { //clear up the kerberos state. But the tokens are not cleared! As per //the Java kerberos login module code, only the kerberos credentials @@ -261,7 +272,7 @@ private synchronized void reLogin() throws LoginException { //login and also update the subject field of this instance to //have the new credentials (pass it to the LoginContext constructor) login = new LoginContext(container.getLoginContextName(), container.getSubject()); - LOG.info("Initiating re-login for {}", container.getPrincipal()); + log.info().attr("principal", container.getPrincipal()).log("Initiating re-login"); login.login(); container.setLogin(login); } @@ -270,8 +281,11 @@ private synchronized void reLogin() throws LoginException { private boolean hasSufficientTimeElapsed() { long now = System.currentTimeMillis(); if (now - getLastLogin() < MIN_TIME_BEFORE_RELOGIN) { - LOG.warn("Not attempting to re-login since the last re-login was " - + "attempted less than {} seconds before.", MIN_TIME_BEFORE_RELOGIN / 1000); + log.warn() + .attr("minTimeSec", MIN_TIME_BEFORE_RELOGIN / 1000) + .log("Not attempting to re-login since the last" + + " re-login was attempted less than" + + " minimum seconds before"); return false; } // register most recent relogin attempt diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieSanityService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieSanityService.java index dd9c1dd6d54..50522205e1d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieSanityService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/BookieSanityService.java @@ -22,6 +22,7 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.bookkeeper.common.util.JsonUtil; @@ -31,8 +32,6 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.tools.cli.commands.bookie.SanityTestCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that exposes the bookie sanity state. @@ -49,9 +48,9 @@ * * */ +@CustomLog public class BookieSanityService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(BookieSanityService.class); private final ServerConfiguration config; private Semaphore lock = new Semaphore(1); private static final int TIMEOUT_MS = 5000; @@ -91,8 +90,8 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { try { lock.tryAcquire(MAX_CONCURRENT_REQUESTS, TIMEOUT_MS, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - LOG.error("Timing out due to max {} of sanity request are running concurrently", - MAX_CONCURRENT_REQUESTS); + log.error().attr("maxConcurrentRequests", MAX_CONCURRENT_REQUESTS) + .log("Timing out due to max number of sanity request are running concurrently"); response.setCode(HttpServer.StatusCode.INTERNAL_ERROR); response.setBody("Timing out due to max number of sanity request are running concurrently"); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ClusterInfoService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ClusterInfoService.java index 99665eae3ff..97cb11d190e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ClusterInfoService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ClusterInfoService.java @@ -20,10 +20,10 @@ import java.util.Iterator; import lombok.AllArgsConstructor; +import lombok.CustomLog; import lombok.Data; import lombok.NonNull; import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.http.HttpServer; @@ -54,7 +54,7 @@ * */ @AllArgsConstructor -@Slf4j +@CustomLog public class ClusterInfoService implements HttpEndpointService { @NonNull @@ -117,7 +117,7 @@ private void fillAuditorInfo(ClusterInfo info) { info.setAuditorElected(currentAuditor != null); info.setAuditorId(currentAuditor == null ? "" : currentAuditor.getId()); } catch (Exception e) { - log.error("Could not get Auditor info", e); + log.error().exception(e).log("Could not get Auditor info"); info.setAuditorElected(false); info.setAuditorId(""); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DecommissionService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DecommissionService.java index 43b890c2301..4956cc80594 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DecommissionService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DecommissionService.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.concurrent.ExecutorService; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.Cookie; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -34,17 +35,14 @@ import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper Decommission related http request. * The PUT method will send decommission bookie command running at backend. */ +@CustomLog public class DecommissionService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(DecommissionService.class); - protected ServerConfiguration conf; protected BookKeeperAdmin bka; protected ExecutorService executor; @@ -82,28 +80,38 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { executor.execute(() -> { try { - LOG.info("Start decommissioning bookie."); + log.info("Start decommissioning bookie"); bka.decommissionBookie(bookieSrc); - LOG.info("Complete decommissioning bookie."); + log.info("Complete decommissioning bookie"); if (deleteCookie) { runFunctionWithRegistrationManager(conf, rm -> { try { Versioned cookie = Cookie.readFromRegistrationManager(rm, bookieSrc); cookie.getValue().deleteFromRegistrationManager(rm, bookieSrc, cookie.getVersion()); - LOG.info("Cookie of the decommissioned bookie: {} is deleted successfully", - bookieSrc); + log.info().attr("bookie", bookieSrc) + .log("Cookie of the decommissioned bookie is deleted successfully"); } catch (BookieException.CookieNotFoundException nne) { - LOG.warn("No cookie to remove for the decommissioning bookie: {}, " - + "it could be deleted already", bookieSrc, nne); + log.warn() + .attr("bookie", bookieSrc) + .exception(nne) + .log("No cookie to remove for the" + + " decommissioning bookie, it could" + + " be deleted already"); } catch (BookieException be) { - LOG.error("Error deleting cookie: {}.", bookieSrc, be); + log.error() + .attr("bookie", bookieSrc) + .exception(be) + .log("Error deleting cookie"); } return true; }); } } catch (Exception e) { - LOG.error("Error handling decommissionBookie: {}.", bookieSrc, e); + log.error() + .attr("bookie", bookieSrc) + .exception(e) + .log("Error handling decommissionBookie"); } }); @@ -111,7 +119,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setBody("Success send decommission Bookie command " + bookieSrc); return response; } catch (Exception e) { - LOG.error("Exception occurred while decommissioning bookie: ", e); + log.error().exception(e).log("Exception occurred while decommissioning bookie"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Exception when send decommission command." + e.getMessage()); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DeleteLedgerService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DeleteLedgerService.java index 57cc127908d..89c51133891 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DeleteLedgerService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/DeleteLedgerService.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ClientConfiguration; @@ -29,16 +30,14 @@ import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper delete ledger related http request. * The DELETE method will delete ledger with provided "ledger_id". */ +@CustomLog public class DeleteLedgerService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(DeleteLedgerService.class); protected ServerConfiguration conf; @@ -63,9 +62,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { String output = "Deleted ledger: " + ledgerId; String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ExpandStorageService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ExpandStorageService.java index 667904fb3a3..ed46206b705 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ExpandStorageService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ExpandStorageService.java @@ -26,6 +26,7 @@ import java.net.URI; import java.util.Arrays; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.LegacyCookieValidation; @@ -38,8 +39,6 @@ import org.apache.bookkeeper.meta.MetadataBookieDriver; import org.apache.bookkeeper.meta.MetadataDrivers; import org.apache.bookkeeper.stats.NullStatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper expand storage related http request. @@ -47,9 +46,9 @@ * User should update the directories info in the conf file with new empty ledger/index * directories, before running the command. */ +@CustomLog public class ExpandStorageService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ExpandStorageService.class); protected ServerConfiguration conf; @@ -94,16 +93,14 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { validation.checkCookies(dirs); } } catch (BookieException e) { - LOG.error("Exception occurred while updating cookie for storage expansion", e); + log.error().exception(e).log("Exception occurred while updating cookie for storage expansion"); response.setCode(HttpServer.StatusCode.INTERNAL_ERROR); response.setBody("Exception while updating cookie for storage expansion"); return response; } String jsonResponse = "Success expand storage"; - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GCDetailsService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GCDetailsService.java index 29b59e271ba..75736046adf 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GCDetailsService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GCDetailsService.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.GarbageCollectionStatus; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -29,8 +30,6 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.proto.BookieServer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle get garbage collection details service. @@ -46,9 +45,9 @@ * "minorCompactionCounter" : 0 * } ] */ +@CustomLog public class GCDetailsService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(GCDetailsService.class); protected ServerConfiguration conf; protected BookieServer bookieServer; @@ -69,9 +68,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { .getLedgerStorage().getGarbageCollectionStatus(); String jsonResponse = JsonUtil.toJson(details); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java index 30a0f6322b1..c2fa091cdb7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java @@ -25,6 +25,7 @@ import java.io.File; import java.util.List; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Journal; import org.apache.bookkeeper.bookie.LedgerDirsManager; import org.apache.bookkeeper.bookie.LogMark; @@ -35,8 +36,6 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.util.DiskChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper get last log mark related http request. @@ -48,9 +47,9 @@ * ... * } */ +@CustomLog public class GetLastLogMarkService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(GetLastLogMarkService.class); protected ServerConfiguration conf; @@ -82,25 +81,22 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } for (Journal journal : journals) { LogMark lastLogMark = journal.getLastLogMark().getCurMark(); - if (LOG.isDebugEnabled()) { - LOG.debug("LastLogMark: Journal Id - " + lastLogMark.getLogFileId() + "(" - + Long.toHexString(lastLogMark.getLogFileId()) + ".txn), Pos - " - + lastLogMark.getLogFileOffset()); - } + log.debug().attr("journalId", lastLogMark.getLogFileId()) + .attr("journalIdHex", Long.toHexString(lastLogMark.getLogFileId())) + .attr("position", lastLogMark.getLogFileOffset()) + .log("LastLogMark"); output.put("LastLogMark: Journal Id - " + lastLogMark.getLogFileId() + "(" + Long.toHexString(lastLogMark.getLogFileId()) + ".txn)", "Pos - " + lastLogMark.getLogFileOffset()); } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; } catch (Throwable e) { - LOG.error("Exception occurred while getting last log mark", e); + log.error().exception(e).log("Exception occurred while getting last log mark"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("ERROR handling request: " + e.getMessage()); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java index a8bda6bbe12..ba1aa9d10f8 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java @@ -22,6 +22,7 @@ import com.google.common.collect.Maps; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -32,16 +33,14 @@ import org.apache.bookkeeper.meta.LedgerManager; import org.apache.bookkeeper.meta.LedgerManagerFactory; import org.apache.bookkeeper.meta.LedgerMetadataSerDe; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper get ledger metadata related http request. * The GET method will get the ledger metadata for given "ledger_id". */ +@CustomLog public class GetLedgerMetaService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(GetLedgerMetaService.class); protected ServerConfiguration conf; private final LedgerManagerFactory ledgerManagerFactory; @@ -72,9 +71,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { manager.close(); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookieInfoService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookieInfoService.java index b62a8dedde8..ce774e9b7c7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookieInfoService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookieInfoService.java @@ -25,6 +25,7 @@ import java.text.DecimalFormat; import java.util.LinkedHashMap; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookieInfoReader; import org.apache.bookkeeper.common.util.JsonUtil; @@ -35,8 +36,6 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper list bookie info related http request. @@ -50,9 +49,9 @@ * "clusterInfo" : {total_free: xxx, total: xxx}" * } */ +@CustomLog public class ListBookieInfoService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ListBookieInfoService.class); protected ServerConfiguration conf; @@ -117,9 +116,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { bk.close(); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookiesService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookiesService.java index 6f134f6b857..a62aaaaeb2f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookiesService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListBookiesService.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -33,16 +34,14 @@ import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.net.BookieSocketAddress; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper list bookies related http request. * The GET method will list all bookies of type rw|ro in this bookkeeper cluster. */ +@CustomLog public class ListBookiesService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ListBookiesService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -85,9 +84,10 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { hostname = resolved.getHostName(); } output.putIfAbsent(b.toString(), hostname); - if (LOG.isDebugEnabled()) { - LOG.debug("bookie: " + b + " hostname:" + hostname); - } + log.debug() + .attr("bookie", b) + .attr("hostname", hostname) + .log("bookie info"); } String jsonResponse = JsonUtil.toJson(output); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListDiskFilesService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListDiskFilesService.java index dd3c85b4c38..a1a4c1d79f3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListDiskFilesService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListDiskFilesService.java @@ -25,14 +25,13 @@ import java.io.File; import java.util.List; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.http.HttpServer; import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper list disk files related http request. @@ -45,9 +44,9 @@ * "index files" : "filename1 \t ..." * } */ +@CustomLog public class ListDiskFilesService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ListDiskFilesService.class); protected ServerConfiguration conf; @@ -118,9 +117,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java index db650224945..39e18380835 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; +import lombok.CustomLog; import org.apache.bookkeeper.client.api.LedgerMetadata; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -36,8 +37,6 @@ import org.apache.bookkeeper.meta.LedgerManagerFactory; import org.apache.bookkeeper.meta.LedgerMetadataSerDe; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper list ledger related http request. @@ -45,9 +44,9 @@ *

The GET method will list all ledger_ids in this bookkeeper cluster. * User can choose print metadata of each ledger or not by set parameter "print_metadata" */ +@CustomLog public class ListLedgerService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ListLedgerService.class); protected ServerConfiguration conf; protected LedgerManagerFactory ledgerManagerFactory; @@ -148,9 +147,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { manager.close(); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListUnderReplicatedLedgerService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListUnderReplicatedLedgerService.java index 21862691d9d..012a1738b6d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListUnderReplicatedLedgerService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListUnderReplicatedLedgerService.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.function.Predicate; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.http.HttpServer; @@ -36,8 +37,6 @@ import org.apache.bookkeeper.meta.LedgerUnderreplicationManager; import org.apache.bookkeeper.meta.UnderreplicatedLedger; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper list under replicated ledger related http request. @@ -45,9 +44,9 @@ *

The GET method will list all ledger_ids of under replicated ledger. * User can filer wanted ledger by set parameter "missingreplica" and "excludingmissingreplica" */ +@CustomLog public class ListUnderReplicatedLedgerService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ListUnderReplicatedLedgerService.class); protected ServerConfiguration conf; private final LedgerManagerFactory ledgerManagerFactory; @@ -128,14 +127,12 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setCode(HttpServer.StatusCode.OK); String jsonResponse = JsonUtil .toJson(printMissingReplica ? outputLedgersWithMissingReplica : outputLedgers); - if (LOG.isDebugEnabled()) { - LOG.debug("output body: " + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); return response; } } catch (Exception e) { - LOG.error("Exception occurred while listing under replicated ledgers", e); + log.error().exception(e).log("Exception occurred while listing under replicated ledgers"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Exception when get." + e.getMessage()); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java index 20adedc5970..f8b7023d9a2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.HashMap; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -28,8 +29,6 @@ import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper lost bookie recovery delay parameter related http request. @@ -37,9 +36,9 @@ *

The GET method will get the value of parameter lostBookieRecoveryDelay, * while the PUT method will set the value of parameter lostBookieRecoveryDelay, */ +@CustomLog public class LostBookieRecoveryDelayService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(LostBookieRecoveryDelayService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -85,13 +84,11 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { int delaySeconds = bka.getLostBookieRecoveryDelay(); response.setCode(HttpServer.StatusCode.OK); response.setBody("lostBookieRecoveryDelay value: " + delaySeconds); - if (LOG.isDebugEnabled()) { - LOG.debug("response body:" + response.getBody()); - } + log.debug().attr("body", response.getBody()).log("response body"); return response; } catch (Exception e) { // may get noNode exception - LOG.error("Exception occurred while getting lost bookie recovery delay", e); + log.error().exception(e).log("Exception occurred while getting lost bookie recovery delay"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Exception when get lostBookieRecoveryDelay." + e.getMessage()); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ReadLedgerEntryService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ReadLedgerEntryService.java index 63999b08528..08c7ee9583d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ReadLedgerEntryService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ReadLedgerEntryService.java @@ -24,6 +24,7 @@ import com.google.common.collect.Maps; import java.util.Iterator; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.client.LedgerEntry; import org.apache.bookkeeper.common.util.JsonUtil; @@ -32,8 +33,6 @@ import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper read ledger entry related http request. @@ -42,9 +41,9 @@ * User should set wanted "ledger_id", and can choose only print out wanted entry * by set parameter "start_entry_id", "end_entry_id" and "page". */ +@CustomLog public class ReadLedgerEntryService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ReadLedgerEntryService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -106,9 +105,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java index 27f3610a697..9589f49eefe 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import java.util.concurrent.ExecutorService; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Cookie; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.common.util.JsonUtil; @@ -34,8 +35,6 @@ import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.net.BookieId; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper recovery related http request. @@ -47,9 +46,9 @@ * "delete_cookie": <bool_value> * } */ +@CustomLog public class RecoveryBookieService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(RecoveryBookieService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -91,12 +90,11 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { try { requestJsonBody = JsonUtil.fromJson(requestBody, RecoveryRequestJsonBody.class); - if (LOG.isDebugEnabled()) { - LOG.debug("bookie_src: [" + requestJsonBody.bookieSrc.get(0) - + "], delete_cookie: [" + requestJsonBody.deleteCookie + "]"); - } + log.debug().attr("bookieSrc", requestJsonBody.bookieSrc.get(0)) + .attr("deleteCookie", requestJsonBody.deleteCookie) + .log("recovery request"); } catch (JsonUtil.ParseJsonException e) { - LOG.error("Meet Exception: ", e); + log.error().exception(e).log("Failed to parse JSON request"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("ERROR parameters: " + e.getMessage()); return response; @@ -109,15 +107,15 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { try { BookieId bookieSrc = BookieId.parse(bookieSrcSerialized); boolean deleteCookie = requestJsonBody.deleteCookie; - LOG.info("Start recovering bookie."); + log.info("Start recovering bookie"); bka.recoverBookieData(bookieSrc); if (deleteCookie) { Versioned cookie = Cookie.readFromRegistrationManager(rm, bookieSrc); cookie.getValue().deleteFromRegistrationManager(rm, bookieSrc, cookie.getVersion()); } - LOG.info("Complete recovering bookie"); + log.info("Complete recovering bookie"); } catch (Exception e) { - LOG.error("Exception occurred while recovering bookie", e); + log.error().exception(e).log("Exception occurred while recovering bookie"); } }); return null; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ResumeCompactionService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ResumeCompactionService.java index 92d66fbcf7d..86fb06b8c6f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ResumeCompactionService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ResumeCompactionService.java @@ -22,18 +22,17 @@ import java.util.HashMap; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.http.HttpServer; import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.proto.BookieServer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class ResumeCompactionService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(ResumeCompactionService.class); protected BookieServer bookieServer; @@ -69,9 +68,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { bookieServer.getBookie().getLedgerStorage().resumeMinorGC(); } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/SuspendCompactionService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/SuspendCompactionService.java index 74e284ad960..61a25419855 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/SuspendCompactionService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/SuspendCompactionService.java @@ -22,18 +22,17 @@ import java.util.HashMap; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.http.HttpServer; import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.proto.BookieServer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@CustomLog public class SuspendCompactionService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(SuspendCompactionService.class); protected BookieServer bookieServer; @@ -69,9 +68,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { bookieServer.getBookie().getLedgerStorage().suspendMinorGC(); } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; @@ -83,9 +80,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { output.put("isMajorGcSuspended", Boolean.toString(isMajorGcSuspend)); output.put("isMinorGcSuspended", Boolean.toString(isMinorGcSuspend)); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java index 96286a87fa2..86ff8a34826 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java @@ -20,22 +20,21 @@ import static com.google.common.base.Preconditions.checkNotNull; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.http.HttpServer; import org.apache.bookkeeper.http.service.HttpEndpointService; import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper trigger audit related http request. * The PUT method will force trigger the audit by resetting the lostBookieRecoveryDelay. */ +@CustomLog public class TriggerAuditService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(TriggerAuditService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -57,7 +56,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { try { bka.triggerAudit(); } catch (Exception e) { - LOG.error("Meet Exception: ", e); + log.error().exception(e).log("Failed to trigger audit"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Exception when do operation." + e.getMessage()); return response; @@ -65,9 +64,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setCode(HttpServer.StatusCode.OK); response.setBody("Success trigger audit."); - if (LOG.isDebugEnabled()) { - LOG.debug("response body:" + response.getBody()); - } + log.debug().attr("body", response.getBody()).log("response body"); return response; } else { response.setCode(HttpServer.StatusCode.NOT_FOUND); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerGCService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerGCService.java index 1f4eea7fb1c..4447d5bda62 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerGCService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerGCService.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.Map; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.LedgerStorage; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -32,8 +33,6 @@ import org.apache.bookkeeper.proto.BookieServer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle force trigger GC requests. @@ -46,9 +45,9 @@ * "is_in_force_gc" : "false" * } */ +@CustomLog public class TriggerGCService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(TriggerGCService.class); protected ServerConfiguration conf; protected BookieServer bookieServer; @@ -82,9 +81,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { String output = "Triggered GC on BookieServer: " + bookieServer.getBookieId(); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; @@ -92,9 +89,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { Boolean isInForceGC = bookieServer.getBookie().getLedgerStorage().isInForceGC(); Pair output = Pair.of("is_in_force_gc", isInForceGC.toString()); String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; @@ -104,7 +99,11 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { return response; } } catch (Exception e) { - LOG.error("Failed to handle the request, method: {}, body: {} ", request.getMethod(), request.getBody(), e); + log.error() + .attr("method", request.getMethod()) + .attr("body", request.getBody()) + .exception(e) + .log("Failed to handle the request"); response.setCode(HttpServer.StatusCode.BAD_REQUEST); response.setBody("Failed to handle the request, exception: " + e.getMessage()); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerLocationCompactService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerLocationCompactService.java index 95b7f277506..211f12f4416 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerLocationCompactService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerLocationCompactService.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.LedgerStorage; import org.apache.bookkeeper.common.util.JsonUtil; import org.apache.bookkeeper.http.HttpServer; @@ -35,8 +36,6 @@ import org.apache.bookkeeper.proto.BookieServer; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** @@ -52,9 +51,9 @@ * } */ +@CustomLog public class TriggerLocationCompactService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(TriggerLocationCompactService.class); private final BookieServer bookieServer; private final List entryLocationDBPath; @@ -115,21 +114,17 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } catch (JsonUtil.ParseJsonException ex) { output = ex.getMessage(); response.setCode(HttpServer.StatusCode.BAD_REQUEST); - LOG.warn("Trigger entry location index RocksDB compact failed, caused by: " + ex.getMessage()); + log.warn().attr("cause", ex.getMessage()).log("Trigger entry location index RocksDB compact failed"); } String jsonResponse = JsonUtil.toJson(output); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); return response; } else if (HttpServer.Method.GET == request.getMethod()) { Map compactStatus = ledgerStorage.isEntryLocationCompacting(entryLocationDBPath); String jsonResponse = JsonUtil.toJson(compactStatus); - if (LOG.isDebugEnabled()) { - LOG.debug("output body:" + jsonResponse); - } + log.debug().attr("body", jsonResponse).log("output body"); response.setBody(jsonResponse); response.setCode(HttpServer.StatusCode.OK); return response; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java index 636fef84685..f8887eb7a58 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import lombok.CustomLog; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.http.HttpServer; @@ -27,17 +28,15 @@ import org.apache.bookkeeper.http.service.HttpServiceRequest; import org.apache.bookkeeper.http.service.HttpServiceResponse; import org.apache.bookkeeper.net.BookieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * HttpEndpointService that handle Bookkeeper who is auditor related http request. * *

The GET method will get the auditor bookie address */ +@CustomLog public class WhoIsAuditorService implements HttpEndpointService { - static final Logger LOG = LoggerFactory.getLogger(WhoIsAuditorService.class); protected ServerConfiguration conf; protected BookKeeperAdmin bka; @@ -66,7 +65,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { return response; } } catch (Exception e) { - LOG.error("Meet Exception: ", e); + log.error().exception(e).log("Failed to get auditor"); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Exception when get." + e.getMessage()); return response; @@ -74,9 +73,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setCode(HttpServer.StatusCode.OK); response.setBody("Auditor: " + bookieId); - if (LOG.isDebugEnabled()) { - LOG.debug("response body:" + response.getBody()); - } + log.debug().attr("body", response.getBody()).log("response body"); return response; } else { response.setCode(HttpServer.StatusCode.NOT_FOUND); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/BookieService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/BookieService.java index 7fcb60db59a..a6b1b0affe3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/BookieService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/BookieService.java @@ -25,6 +25,7 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.UncleanShutdownDetection; import org.apache.bookkeeper.common.allocator.ByteBufAllocatorWithOomHandler; @@ -35,15 +36,13 @@ import org.apache.bookkeeper.server.component.ServerLifecycleComponent; import org.apache.bookkeeper.server.conf.BookieConfiguration; import org.apache.bookkeeper.stats.StatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A {@link ServerLifecycleComponent} that starts the core bookie server. */ +@CustomLog public class BookieService extends ServerLifecycleComponent { - private static final Logger log = LoggerFactory.getLogger(BookieService.class); public static final String NAME = "bookie-server"; private final BookieServer server; @@ -70,7 +69,7 @@ public void setExceptionHandler(UncaughtExceptionHandler handler) { server.setExceptionHandler(handler); allocator.setOomHandler((ex) -> { try { - log.error("Unable to allocate memory, exiting bookie", ex); + log.error().exception(ex).log("Unable to allocate memory, exiting bookie"); } finally { if (uncaughtExceptionHandler != null) { uncaughtExceptionHandler.uncaughtException(Thread.currentThread(), ex); @@ -117,7 +116,7 @@ public void publishInfo(ComponentInfoPublisher componentInfoPublisher) { componentInfoPublisher.publishEndpoint(endpoint); } catch (UnknownHostException err) { - log.error("Cannot compute local address", err); + log.error().exception(err).log("Cannot compute local address"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/ScrubberService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/ScrubberService.java index 63b9ec08d0b..5312b252ba4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/ScrubberService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/ScrubberService.java @@ -35,6 +35,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.ExitCode; import org.apache.bookkeeper.bookie.LedgerStorage; import org.apache.bookkeeper.common.util.MathUtils; @@ -43,14 +44,12 @@ import org.apache.bookkeeper.stats.Counter; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A {@link org.apache.bookkeeper.common.component.LifecycleComponent} that runs the scrubber background service. */ +@CustomLog public class ScrubberService extends ServerLifecycleComponent { - private static final Logger LOG = LoggerFactory.getLogger(ScrubberService.class); private static final String NAME = "scrubber"; private final ScheduledExecutorService executor; @@ -106,15 +105,18 @@ private void run() { List errors = ledgerStorage.localConsistencyCheck(scrubRateLimiter); if (errors.size() > 0) { errorCounter.addCount(errors.size()); - LOG.error("Found inconsistency during localConsistencyCheck:"); + log.error("Found inconsistency during localConsistencyCheck"); for (LedgerStorage.DetectedInconsistency error : errors) { - LOG.error("Ledger {}, entry {}: ", error.getLedgerId(), error.getEntryId(), error.getException()); + log.error() + .attr("ledgerId", error.getLedgerId()) + .attr("entryId", error.getEntryId()) + .exception(error.getException()).log("Inconsistency detected"); } } success = true; } catch (IOException e) { fatalErrorCounter.inc(); - LOG.error("Got fatal exception {} running localConsistencyCheck", e.toString()); + log.error().exception(e).log("Got fatal exception running localConsistencyCheck"); } if (success) { scrubCounter.registerSuccessfulEvent(MathUtils.elapsedNanos(start), TimeUnit.NANOSECONDS); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/streaming/LedgerOutputStream.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/streaming/LedgerOutputStream.java index 94866877dc8..b039264c9a4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/streaming/LedgerOutputStream.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/streaming/LedgerOutputStream.java @@ -23,10 +23,9 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.LedgerHandle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * this class provides a streaming api to get an output stream from a ledger @@ -34,10 +33,9 @@ * ledgerhandle api and uses a buffer to cache the data written to it and writes * out the entry to the ledger. */ +@CustomLog public class LedgerOutputStream extends OutputStream { - private static final Logger LOG = LoggerFactory.getLogger(LedgerOutputStream.class); - private final LedgerHandle lh; private ByteBuffer bytebuff; byte[] bbytes; @@ -84,15 +82,15 @@ public synchronized void flush() { // copy the bytes into // a new byte buffer and send it out byte[] b = new byte[bytebuff.position()]; - LOG.info("Comment: flushing with params " + " " + bytebuff.position()); + log.info().attr("position", bytebuff.position()).log("Flushing buffer"); System.arraycopy(bbytes, 0, b, 0, bytebuff.position()); try { lh.addEntry(b); } catch (InterruptedException ie) { - LOG.warn("Interrupted while flushing " + ie); + log.warn().exception(ie).log("Interrupted while flushing"); Thread.currentThread().interrupt(); } catch (BKException bke) { - LOG.warn("BookKeeper exception ", bke); + log.warn().exception(bke).log("BookKeeper exception"); } } } @@ -120,10 +118,10 @@ public synchronized void write(byte[] b) { try { lh.addEntry(b); } catch (InterruptedException ie) { - LOG.warn("Interrupted while writing", ie); + log.warn().exception(ie).log("Interrupted while writing"); Thread.currentThread().interrupt(); } catch (BKException bke) { - LOG.warn("BookKeeper exception", bke); + log.warn().exception(bke).log("BookKeeper exception"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/BookieAuthZFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/BookieAuthZFactory.java index 5cef655c50b..f95da9f8634 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/BookieAuthZFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/BookieAuthZFactory.java @@ -21,7 +21,7 @@ import java.io.IOException; import java.security.cert.X509Certificate; import java.util.Collection; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.auth.AuthCallbacks; import org.apache.bookkeeper.auth.AuthToken; import org.apache.bookkeeper.auth.BookKeeperPrincipal; @@ -35,7 +35,7 @@ /** * Authorization factory class. */ -@Slf4j +@CustomLog public class BookieAuthZFactory implements BookieAuthProvider.Factory { public String[] allowedRoles; @@ -82,9 +82,12 @@ public void onProtocolUpgrade() { X509Certificate tempCert = (X509Certificate) certificates.iterator().next(); String[] certRole = CertUtils.getRolesFromOU(tempCert); if (certRole == null || certRole.length == 0) { - log.error("AuthZ failed: No cert role in OU field of certificate. Must have a role from " - + "allowedRoles list {} host: {}", - allowedRoles, addr.getRemoteAddr()); + log.error() + .attr("allowedRoles", allowedRoles) + .attr("host", addr.getRemoteAddr()) + .log("AuthZ failed: No cert role in OU" + + " field of certificate. Must have" + + " a role from allowedRoles list"); completeCallback.operationComplete(BKException.Code.UnauthorizedAccessException, null); return; } @@ -99,24 +102,31 @@ public void onProtocolUpgrade() { addr.setAuthorizedId(new BookKeeperPrincipal(certRole[0])); completeCallback.operationComplete(BKException.Code.OK, null); } else { - log.error("AuthZ failed: Cert role {} doesn't match allowedRoles list {}; host: {}", - certRole, allowedRoles, addr.getRemoteAddr()); + log.error() + .attr("certRole", certRole) + .attr("allowedRoles", allowedRoles) + .attr("host", addr.getRemoteAddr()) + .log("AuthZ failed: Cert role doesn't match allowedRoles list"); completeCallback.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } else { if (!secureBookieSideChannel) { - log.error("AuthZ failed: Bookie side channel is not secured; host: {}", - addr.getRemoteAddr()); + log.error().attr("host", addr.getRemoteAddr()) + .log("AuthZ failed: Bookie side channel is not secured"); } else if (certificates.isEmpty()) { - log.error("AuthZ failed: Certificate missing; host: {}", addr.getRemoteAddr()); + log.error().attr("host", addr.getRemoteAddr()) + .log("AuthZ failed: Certificate missing"); } else { - log.error("AuthZ failed: Certs are missing or not X509 type; host: {}", - addr.getRemoteAddr()); + log.error().attr("host", addr.getRemoteAddr()) + .log("AuthZ failed: Certs are missing or not X509 type"); } completeCallback.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } catch (Exception e) { - log.error("AuthZ failed: Failed to parse certificate; host: {}, {}", addr.getRemoteAddr(), e); + log.error() + .attr("host", addr.getRemoteAddr()) + .exception(e) + .log("AuthZ failed: Failed to parse certificate"); completeCallback.operationComplete(BKException.Code.UnauthorizedAccessException, null); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/FileModifiedTimeUpdater.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/FileModifiedTimeUpdater.java index e41b507a584..dd15ac1aa5a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/FileModifiedTimeUpdater.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/FileModifiedTimeUpdater.java @@ -22,13 +22,13 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileTime; +import lombok.CustomLog; import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Holder class to validate file modification. */ +@CustomLog public class FileModifiedTimeUpdater { @Getter String fileName; @@ -46,7 +46,10 @@ private FileTime updateLastModifiedTime() { try { return Files.getLastModifiedTime(p); } catch (IOException e) { - LOG.error("Unable to fetch lastModified time for file {}: ", fileName, e); + log.error() + .attr("fileName", fileName) + .exception(e) + .log("Unable to fetch lastModified time for file"); } } return null; @@ -61,5 +64,4 @@ public boolean checkAndRefresh() { return false; } - private static final Logger LOG = LoggerFactory.getLogger(FileModifiedTimeUpdater.class); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/SecurityProviderFactoryFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/SecurityProviderFactoryFactory.java index 63bc87e2a43..91b3749444d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/SecurityProviderFactoryFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/SecurityProviderFactoryFactory.java @@ -17,15 +17,14 @@ */ package org.apache.bookkeeper.tls; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.ReflectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A factory to manage security provider factories. */ +@CustomLog public abstract class SecurityProviderFactoryFactory { - private static final Logger LOG = LoggerFactory.getLogger(SecurityProviderFactoryFactory.class); public static SecurityHandlerFactory getSecurityProviderFactory(String securityHandler) throws SecurityException { @@ -38,9 +37,12 @@ public static SecurityHandlerFactory getSecurityProviderFactory(String securityH Class shFactoryClass = ReflectionUtils.forName(securityHandler, SecurityHandlerFactory.class); shFactory = ReflectionUtils.newInstance(shFactoryClass); - LOG.info("Loaded security handler for {}", securityHandler); + log.info().attr("securityHandler", securityHandler).log("Loaded security handler"); } catch (RuntimeException re) { - LOG.error("Unable to load security handler for {}: ", securityHandler, re.getCause()); + log.error() + .attr("securityHandler", securityHandler) + .exception(re.getCause()) + .log("Unable to load security handler"); throw new SecurityException(re.getCause()); } return shFactory; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java index 1ba2581f101..77e425ede29 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java @@ -44,7 +44,7 @@ import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLParameters; import javax.net.ssl.TrustManagerFactory; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -53,7 +53,7 @@ /** * A factory to manage TLS contexts. */ -@Slf4j +@CustomLog public class TLSContextFactory implements SecurityHandlerFactory { public static final Provider BC_PROVIDER = getProvider(); @@ -76,9 +76,7 @@ public static Provider getProvider() { Provider provider = Security.getProvider(BC) != null ? Security.getProvider(BC) : Security.getProvider(BC_FIPS); - if (log.isDebugEnabled()) { - log.debug("Already instantiated Bouncy Castle provider {}", provider.getName()); - } + log.debug().attr("provider", provider.getName()).log("Already instantiated Bouncy Castle provider"); return provider; } @@ -86,7 +84,9 @@ public static Provider getProvider() { try { return getBCProviderFromClassPath(); } catch (Exception e) { - log.warn("Not able to get Bouncy Castle provider for both FIPS and Non-FIPS from class path:", e); + log.warn() + .exception(e) + .log("Not able to get Bouncy Castle provider for both FIPS and Non-FIPS from class path"); throw new RuntimeException(e); } } @@ -100,10 +100,9 @@ public static Provider getBCProviderFromClassPath() throws Exception { try { clazz = Class.forName(BC_FIPS_PROVIDER_CLASS); } catch (ClassNotFoundException cnf) { - if (log.isDebugEnabled()) { - log.debug("Not able to get Bouncy Castle provider: {}, try to get FIPS provider {}", - BC_NON_FIPS_PROVIDER_CLASS, BC_FIPS_PROVIDER_CLASS); - } + log.debug().attr("nonFipsProvider", BC_NON_FIPS_PROVIDER_CLASS) + .attr("fipsProvider", BC_FIPS_PROVIDER_CLASS) + .log("Not able to get Bouncy Castle provider, try to get FIPS provider"); // attempt to use the NON_FIPS provider. clazz = Class.forName(BC_NON_FIPS_PROVIDER_CLASS); @@ -112,9 +111,9 @@ public static Provider getBCProviderFromClassPath() throws Exception { @SuppressWarnings("unchecked") Provider provider = (Provider) clazz.getDeclaredConstructor().newInstance(); Security.addProvider(provider); - if (log.isDebugEnabled()) { - log.debug("Found and Instantiated Bouncy Castle provider in classpath {}", provider.getName()); - } + log.debug() + .attr("provider", provider.getName()) + .log("Found and Instantiated Bouncy Castle provider in classpath"); return provider; } @@ -233,7 +232,7 @@ private SslProvider getTLSProvider(String sslProvider) { } Throwable causeUnavailable = OpenSsl.unavailabilityCause(); - log.warn("OpenSSL Unavailable: ", causeUnavailable); + log.warn().exception(causeUnavailable).log("OpenSSL Unavailable"); log.info("Security provider - JDK"); return SslProvider.JDK; @@ -361,16 +360,17 @@ private synchronized SslContext getSSLContext() { || tlsKeyStorePasswordFilePath.checkAndRefresh() || tlsTrustStoreFilePath.checkAndRefresh() || tlsTrustStorePasswordFilePath.checkAndRefresh()) { try { - log.info("Updating tls certs certFile={}, keyStoreFile={}, trustStoreFile={}", - tlsCertificateFilePath.getFileName(), tlsKeyStoreFilePath.getFileName(), - tlsTrustStoreFilePath.getFileName()); + log.info().attr("certFile", tlsCertificateFilePath.getFileName()) + .attr("keyStoreFile", tlsKeyStoreFilePath.getFileName()) + .attr("trustStoreFile", tlsTrustStoreFilePath.getFileName()) + .log("Updating tls certs"); if (isServerCtx) { updateServerContext(); } else { updateClientContext(); } } catch (Exception e) { - log.info("Failed to refresh tls certs", e); + log.info().exception(e).log("Failed to refresh tls certs"); } } } @@ -530,16 +530,16 @@ public SslHandler newTLSHandler(String peer, int port) { if (protocols != null && protocols.length != 0) { sslHandler.engine().setEnabledProtocols(protocols); } - if (log.isDebugEnabled()) { - log.debug("Enabled cipher protocols: {} ", Arrays.toString(sslHandler.engine().getEnabledProtocols())); - } + log.debug(e -> e + .attr("protocols", Arrays.toString(sslHandler.engine().getEnabledProtocols())) + .log("Enabled cipher protocols")); if (ciphers != null && ciphers.length != 0) { sslHandler.engine().setEnabledCipherSuites(ciphers); } - if (log.isDebugEnabled()) { - log.debug("Enabled cipher suites: {} ", Arrays.toString(sslHandler.engine().getEnabledCipherSuites())); - } + log.debug(e -> e + .attr("cipherSuites", Arrays.toString(sslHandler.engine().getEnabledCipherSuites())) + .log("Enabled cipher suites")); if (type == NodeType.Client) { // Netty 4.2 enables HTTPS endpoint identification by default on the client side. Honor the @@ -549,10 +549,10 @@ public SslHandler newTLSHandler(String peer, int port) { ((ClientConfiguration) config).getHostnameVerificationEnabled(); sslParameters.setEndpointIdentificationAlgorithm(hostnameVerificationEnabled ? "HTTPS" : null); sslHandler.engine().setSSLParameters(sslParameters); - if (log.isDebugEnabled()) { - log.debug("endpointIdentificationAlgorithm: {}", - hostnameVerificationEnabled ? "HTTPS" : "disabled"); - } + log.debug() + .attr("endpointIdentificationAlgorithm", + hostnameVerificationEnabled ? "HTTPS" : "disabled") + .log("endpointIdentificationAlgorithm"); } return sslHandler; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ListUnderReplicatedCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ListUnderReplicatedCommand.java index eadd690cb5f..abc4f63109c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ListUnderReplicatedCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ListUnderReplicatedCommand.java @@ -27,6 +27,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -39,15 +40,13 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to listing under replicated ledgers. */ +@CustomLog public class ListUnderReplicatedCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(ListUnderReplicatedCommand.class); private static final String NAME = "listunderreplicated"; private static final String DESC = "List ledgers marked as underreplicated, with oprional options to specify " @@ -155,14 +154,16 @@ public boolean handler(ServerConfiguration bkConf, LURFlags flags) throws Metada } long urLedgerId = underreplicatedLedger.getLedgerId(); - LOG.info("{}", ledgerIdFormatter.formatLedgerId(urLedgerId)); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(urLedgerId)) + .log("Under-replicated ledger"); long ctime = underreplicatedLedger.getCtime(); if (ctime != UnderreplicatedLedger.UNASSIGNED_CTIME) { - LOG.info("\tCtime : {}", ctime); + log.info().attr("ctime", ctime).log("Ctime"); } if (printMissingReplica) { underreplicatedLedger.getReplicaList().forEach((missingReplica) -> { - LOG.info("\tMissingReplica : {}", missingReplica); + log.info().attr("missingReplica", missingReplica).log("Missing replica"); }); } if (printReplicationWorkerId) { @@ -170,16 +171,18 @@ public boolean handler(ServerConfiguration bkConf, LURFlags flags) throws Metada String replicationWorkerId = underreplicationManager .getReplicationWorkerIdRereplicatingLedger(urLedgerId); if (replicationWorkerId != null) { - LOG.info("\tReplicationWorkerId : {}", replicationWorkerId); + log.info().attr("replicationWorkerId", replicationWorkerId).log("Replication worker"); } } catch (ReplicationException.UnavailableException e) { - LOG.error("Failed to get ReplicationWorkerId rereplicating ledger {} -- {}", urLedgerId, - e.getMessage()); + log.error() + .attr("ledgerId", urLedgerId) + .exceptionMessage(e) + .log("Failed to get ReplicationWorkerId rereplicating ledger"); } } } - LOG.info("Under replicated ledger count: {}", underReplicatedLedgerCount.get()); + log.info().attr("count", underReplicatedLedgerCount.get()).log("Under replicated ledger count"); return null; }); return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/LostBookieRecoveryDelayCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/LostBookieRecoveryDelayCommand.java index defab6895fb..34746aa5a32 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/LostBookieRecoveryDelayCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/LostBookieRecoveryDelayCommand.java @@ -21,6 +21,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException; @@ -32,15 +33,13 @@ import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to Setter and Getter for LostBookieRecoveryDelay value (in seconds) in metadata store. */ +@CustomLog public class LostBookieRecoveryDelayCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(LostBookieRecoveryDelayCommand.class); private static final String NAME = "lostbookierecoverydelay"; private static final String DESC = @@ -94,7 +93,7 @@ public boolean handler(ServerConfiguration conf, LBRDFlags flags) } if ((!getter && !setter) || (getter && setter)) { - LOG.error("One and only one of -get and -set must be specified"); + log.error("One and only one of -get and -set must be specified"); return false; } ClientConfiguration adminConf = new ClientConfiguration(conf); @@ -102,12 +101,12 @@ public boolean handler(ServerConfiguration conf, LBRDFlags flags) try { if (getter) { int lostBookieRecoveryDelay = admin.getLostBookieRecoveryDelay(); - LOG.info("LostBookieRecoveryDelay value in ZK: {}", lostBookieRecoveryDelay); + log.info().attr("delay", lostBookieRecoveryDelay).log("LostBookieRecoveryDelay value in ZK"); } else { int lostBookieRecoveryDelay = flags.set; admin.setLostBookieRecoveryDelay(lostBookieRecoveryDelay); - LOG.info("Successfully set LostBookieRecoveryDelay value in ZK: {}", - lostBookieRecoveryDelay); + log.info().attr("delay", lostBookieRecoveryDelay) + .log("Successfully set LostBookieRecoveryDelay value in ZK"); } } finally { if (admin != null) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/QueryAutoRecoveryStatusCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/QueryAutoRecoveryStatusCommand.java index c301a13a6a7..38a7936fe14 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/QueryAutoRecoveryStatusCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/QueryAutoRecoveryStatusCommand.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -35,17 +36,14 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to Query current auto recovery status. */ +@CustomLog public class QueryAutoRecoveryStatusCommand extends BookieCommand { - static final Logger LOG = LoggerFactory. - getLogger(QueryAutoRecoveryStatusCommand.class); private static final String NAME = "queryautorecoverystatus"; private static final String DESC = "Query autorecovery status."; @@ -116,25 +114,30 @@ public boolean handler(ServerConfiguration conf, QFlags flag) throws Exception { ledgerList.add(new LedgerRecoverInfo(urLedgerId, replicationWorkerId)); } } catch (ReplicationException.UnavailableException e) { - LOG.error("Failed to get ReplicationWorkerId rereplicating ledger {} -- {}", urLedgerId, - e.getMessage()); + log.error() + .attr("ledgerId", urLedgerId) + .exceptionMessage(e) + .log("Failed to get ReplicationWorkerId rereplicating ledger"); } } - LOG.info("CurrentRecoverLedgerInfo:"); + log.info("CurrentRecoverLedgerInfo:"); if (!flag.verbose) { for (int i = 0; i < ledgerList.size(); i++) { - LOG.info("\tLedgerId:{}\tBookieId:{}", ledgerList.get(i).ledgerId, ledgerList.get(i).bookieId); + log.info().attr("ledgerId", ledgerList.get(i).ledgerId) + .attr("bookieId", ledgerList.get(i).bookieId).log("Recovering ledger"); } } else { for (int i = 0; i < ledgerList.size(); i++) { LedgerRecoverInfo info = ledgerList.get(i); ledgerManager.readLedgerMetadata(info.ledgerId).whenComplete((metadata, exception) -> { if (exception == null) { - LOG.info("\tLedgerId:{}\tBookieId:{}\tLedgerSize:{}", - info.ledgerId, info.bookieId, metadata.getValue().getLength()); + log.info() + .attr("ledgerId", info.ledgerId) + .attr("bookieId", info.bookieId) + .attr("ledgerSize", metadata.getValue().getLength()).log("Recovering ledger"); } else { - LOG.error("Unable to read the ledger: {} information", info.ledgerId); + log.error().attr("ledgerId", info.ledgerId).log("Unable to read the ledger information"); throw new UncheckedExecutionException(exception); } }); @@ -142,7 +145,7 @@ public boolean handler(ServerConfiguration conf, QFlags flag) throws Exception { } if (ledgerList.size() == 0) { // NO ledger is being auto recovering - LOG.info("\t No Ledger is being recovered."); + log.info("No Ledger is being recovered"); } return null; }); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ToggleCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ToggleCommand.java index 99185a8a97d..f7245c7278d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ToggleCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/ToggleCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -32,17 +33,15 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to enable or disable auto recovery in the cluster. */ @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") +@CustomLog public class ToggleCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(ToggleCommand.class); private static final String NAME = "toggle"; private static final String DESC = "Enable or disable auto recovery in the cluster. Default is disable."; @@ -89,22 +88,22 @@ private boolean handler(ServerConfiguration conf, AutoRecoveryFlags flags) try (LedgerUnderreplicationManager underreplicationManager = mFactory .newLedgerUnderreplicationManager()) { if (flags.status) { - LOG.info("Autorecovery is {}", (underreplicationManager.isLedgerReplicationEnabled() - ? "enabled." : "disabled.")); + log.info().attr("status", underreplicationManager.isLedgerReplicationEnabled() + ? "enabled" : "disabled").log("Autorecovery status"); return null; } if (flags.enable) { if (underreplicationManager.isLedgerReplicationEnabled()) { - LOG.warn("Autorecovery already enabled. Doing nothing"); + log.warn("Autorecovery already enabled. Doing nothing"); } else { - LOG.info("Enabling autorecovery"); + log.info("Enabling autorecovery"); underreplicationManager.enableLedgerReplication(); } } else { if (!underreplicationManager.isLedgerReplicationEnabled()) { - LOG.warn("Autorecovery already disabled. Doing nothing"); + log.warn("Autorecovery already disabled. Doing nothing"); } else { - LOG.info("Disabling autorecovery"); + log.info("Disabling autorecovery"); underreplicationManager.disableLedgerReplication(); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/WhoIsAuditorCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/WhoIsAuditorCommand.java index 853fca0b8f9..91ffe305c47 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/WhoIsAuditorCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/autorecovery/WhoIsAuditorCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; import lombok.Cleanup; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeperAdmin; import org.apache.bookkeeper.conf.ClientConfiguration; @@ -30,15 +31,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to print which node has the auditor lock. */ +@CustomLog public class WhoIsAuditorCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(WhoIsAuditorCommand.class); private static final String NAME = "whoisauditor"; private static final String DESC = "Print the node which holds the auditor lock."; @@ -80,10 +79,10 @@ private boolean getAuditor(ServerConfiguration conf) bookieId = bka.getCurrentAuditor(); } if (bookieId == null) { - LOG.info("No auditor elected"); + log.info("No auditor elected"); return false; } - LOG.info("Auditor: " + bookieId); + log.info().attr("auditor", bookieId).log("Current auditor"); return true; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/CheckDBLedgersIndexCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/CheckDBLedgersIndexCommand.java index fe844e5be41..7009180256e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/CheckDBLedgersIndexCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/CheckDBLedgersIndexCommand.java @@ -20,6 +20,7 @@ import com.beust.jcommander.Parameter; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.storage.ldb.LedgersIndexCheckOp; @@ -27,16 +28,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to check the DBLedgerStorage ledgers index integrity. */ +@CustomLog public class CheckDBLedgersIndexCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(CheckDBLedgersIndexCommand.class); - private static final String NAME = "check-db-ledgers-index"; private static final String DESC = "Check the DBLedgerStorage ledgers index integrity by performing a read scan"; @@ -51,14 +49,14 @@ public CheckDBLedgersIndexCommand(CheckLedgersIndexFlags flags) { @Override public boolean apply(ServerConfiguration conf, CheckLedgersIndexFlags cmdFlags) { - LOG.info("=== Checking DBStorage ledgers index by running a read scan ==="); + log.info("=== Checking DBStorage ledgers index by running a read scan ==="); ServerConfiguration serverConfiguration = new ServerConfiguration(conf); try { boolean success = new LedgersIndexCheckOp(serverConfiguration, cmdFlags.verbose).initiate(); if (success) { - LOG.info("-- Done checking DBStorage ledgers index --"); + log.info("-- Done checking DBStorage ledgers index --"); } else { - LOG.info("-- Aborted checking DBStorage ledgers index --"); + log.info("-- Aborted checking DBStorage ledgers index --"); } return success; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java index 602caf09c35..03a2d54a509 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java @@ -20,6 +20,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieImpl; @@ -31,15 +32,12 @@ import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A command to convert bookie indexes from InterleavedStorage to DbLedgerStorage format. */ +@CustomLog public class ConvertToDBStorageCommand extends BookieCommand { - - private static final Logger LOG = LoggerFactory.getLogger(ConvertToDBStorageCommand.class); private static final String NAME = "converttodbstorage"; private static final String DESC = "Convert bookie indexes from InterleavedStorage to DbLedgerStorage format"; private static final String NOT_INIT = "default formatter"; @@ -75,7 +73,7 @@ public boolean apply(ServerConfiguration conf, CTDBFlags cmdFlags) { } private boolean handle(ServerConfiguration conf) throws Exception { - LOG.info("=== Converting to DbLedgerStorage ==="); + log.info("=== Converting to DbLedgerStorage ==="); ServerConfiguration bkConf = new ServerConfiguration(conf); InterleavedLedgerStorage interleavedStorage = new InterleavedLedgerStorage(); @@ -86,31 +84,30 @@ private boolean handle(ServerConfiguration conf) throws Exception { int convertedLedgers = 0; for (long ledgerId : interleavedStorage.getActiveLedgersInRange(0, Long.MAX_VALUE)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Converting ledger {}", ledgerIdFormatter.formatLedgerId(ledgerId)); - } + log.debug().attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); LedgerCache.LedgerIndexMetadata fi = interleavedStorage.readLedgerIndexMetadata(ledgerId); LedgerCache.PageEntriesIterable pages = interleavedStorage.getIndexEntries(ledgerId); long numberOfEntries = dbStorage.addLedgerToIndex(ledgerId, fi.fenced, fi.masterKey, pages); - if (LOG.isDebugEnabled()) { - LOG.debug(" -- done. fenced={} entries={}", fi.fenced, numberOfEntries); - } + log.debug() + .attr("fenced", fi.fenced) + .attr("entries", numberOfEntries) + .log("done converting ledger"); // Remove index from old storage interleavedStorage.deleteLedger(ledgerId); if (++convertedLedgers % 1000 == 0) { - LOG.info("Converted {} ledgers", convertedLedgers); + log.info().attr("count", convertedLedgers).log("Converted ledgers"); } } dbStorage.shutdown(); interleavedStorage.shutdown(); - LOG.info("---- Done Converting ----"); + log.info("---- Done Converting ----"); return true; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java index 0ffe9066df6..3c403cf3efa 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java @@ -23,6 +23,7 @@ import io.netty.buffer.PooledByteBufAllocator; import java.nio.file.FileSystems; import java.nio.file.Files; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.Bookie; @@ -40,16 +41,12 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.DiskChecker; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A command to convert bookie indexes from DbLedgerStorage to InterleavedStorage format. */ +@CustomLog public class ConvertToInterleavedStorageCommand extends BookieCommand { - - private static final Logger LOG = LoggerFactory.getLogger(ConvertToInterleavedStorageCommand.class); private static final String NAME = "converttointerleavedstorage"; private static final String DESC = "Convert bookie indexes from DbLedgerStorage to InterleavedStorage format"; private static final String NOT_INIT = "default formatter"; @@ -87,7 +84,7 @@ public boolean apply(ServerConfiguration conf, CTISFlags cmdFlags) { } private boolean handle(ServerConfiguration bkConf) throws Exception { - LOG.info("=== Converting DbLedgerStorage ==="); + log.info("=== Converting DbLedgerStorage ==="); ServerConfiguration conf = new ServerConfiguration(bkConf); DiskChecker diskChecker = new DiskChecker(bkConf.getDiskUsageThreshold(), bkConf.getDiskUsageWarnThreshold()); LedgerDirsManager ledgerDirsManager = new LedgerDirsManager(bkConf, bkConf.getLedgerDirs(), diskChecker); @@ -130,9 +127,7 @@ public void start() { int convertedLedgers = 0; for (long ledgerId : dbStorage.getActiveLedgersInRange(0, Long.MAX_VALUE)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Converting ledger {}", ledgerIdFormatter.formatLedgerId(ledgerId)); - } + log.debug().attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); interleavedStorage.setMasterKey(ledgerId, dbStorage.readMasterKey(ledgerId)); if (dbStorage.isFenced(ledgerId)) { @@ -152,7 +147,7 @@ public void start() { } if (++convertedLedgers % 1000 == 0) { - LOG.info("Converted {} ledgers", convertedLedgers); + log.info().attr("convertedLedgers", convertedLedgers).log("Converted ledgers"); } } @@ -171,7 +166,7 @@ public void start() { Files.move(FileSystems.getDefault().getPath(baseDir, "locations"), FileSystems.getDefault().getPath(baseDir, "locations.backup")); - LOG.info("---- Done Converting {} ledgers ----", convertedLedgers); + log.info().attr("convertedLedgers", convertedLedgers).log("Done Converting ledgers"); return true; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FlipBookieIdCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FlipBookieIdCommand.java index 67f1ec1c6c3..70341e5cdde 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FlipBookieIdCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FlipBookieIdCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieImpl; @@ -37,16 +38,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to update ledger command. */ +@CustomLog public class FlipBookieIdCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(FlipBookieIdCommand.class); - private static final String NAME = "flip-bookie-id"; private static final String DESC = "Update bookie id in ledgers (this may take a long time)."; @@ -106,28 +104,30 @@ private boolean updateLedger(ServerConfiguration conf, FlipBookieIdFlags flags) throws InterruptedException, BKException, IOException { if (!conf.getUseHostNameAsBookieID() && flags.hostname) { - LOG.error("Expects configuration useHostNameAsBookieID=true as the option value"); + log.error("Expects configuration useHostNameAsBookieID=true as the option value"); return false; } else if (conf.getUseHostNameAsBookieID() && !flags.hostname) { - LOG.error("Expects configuration useHostNameAsBookieID=false as the option value'"); + log.error("Expects configuration useHostNameAsBookieID=false as the option value'"); return false; } final int rate = flags.updatePerSec; if (rate <= 0) { - LOG.error("Invalid updatespersec {}, should be > 0", rate); + log.error().attr("rate", rate).log("Invalid updatespersec, should be > 0"); return false; } final int maxOutstandingReads = flags.maxOutstandingReads; if (maxOutstandingReads <= 0) { - LOG.error("Invalid maxOutstandingReads {}, should be > 0", maxOutstandingReads); + log.error() + .attr("maxOutstandingReads", maxOutstandingReads) + .log("Invalid maxOutstandingReads, should be > 0"); return false; } final int limit = flags.limit; if (limit <= 0 && limit != Integer.MIN_VALUE) { - LOG.error("Invalid limit {}, should be > 0", limit); + log.error().attr("limit", limit).log("Invalid limit, should be > 0"); return false; } @@ -157,7 +157,10 @@ public void progress(long updated, long issued) { return; // disabled } if (TimeUnit.MILLISECONDS.toSeconds(MathUtils.elapsedMSec(lastReport)) >= printProgress) { - LOG.info("Number of ledgers issued={}, updated={}", issued, updated); + log.info() + .attr("issued", issued) + .attr("updated", updated) + .log("Number of ledgers"); lastReport = MathUtils.nowInNano(); } } @@ -167,7 +170,7 @@ public void progress(long updated, long issued) { updateLedgerOp.updateBookieIdInLedgers(oldBookieId, newBookieId, rate, maxOutstandingReads, limit, progressable); } catch (IOException e) { - LOG.error("Failed to update ledger metadata", e); + log.error().exception(e).log("Failed to update ledger metadata"); return false; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatCommand.java index ecef51ed456..29be701339c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatCommand.java @@ -33,16 +33,12 @@ import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to format the current server contents. */ public class FormatCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(FormatCommand.class); - private static final String NAME = "format"; private static final String DESC = "Format the current server contents."; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatUtil.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatUtil.java index 62a229c2338..a644ad70670 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatUtil.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/FormatUtil.java @@ -20,19 +20,17 @@ import io.netty.buffer.ByteBuf; import java.util.Formatter; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.util.EntryFormatter; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * .Provide to format message. */ +@CustomLog public class FormatUtil { - private static final Logger LOG = LoggerFactory.getLogger(FormatUtil.class); - /** * Format the message into a readable format. * @param pos @@ -50,43 +48,56 @@ public static void formatEntry(long pos, ByteBuf recBuff, boolean printMsg, Ledg long ledgerId = recBuff.readLong(); long entryId = recBuff.readLong(); - LOG.info("--------- Lid={}, Eid={}, ByteOffset={}, EntrySize={} ---------", - ledgerIdFormatter.formatLedgerId(ledgerId), entryId, pos, entrySize); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)) + .attr("entryId", entryId) + .attr("position", pos) + .attr("entrySize", entrySize) + .log("Entry"); if (entryId == BookieImpl.METAENTRY_ID_LEDGER_KEY) { int masterKeyLen = recBuff.readInt(); byte[] masterKey = new byte[masterKeyLen]; recBuff.readBytes(masterKey); - LOG.info("Type: META"); - LOG.info("MasterKey: {}", bytes2Hex(masterKey)); - LOG.info(""); + log.info() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("type", "META") + .attr("masterKey", bytes2Hex(masterKey)) + .log("MasterKey"); return; } if (entryId == BookieImpl.METAENTRY_ID_FENCE_KEY) { - LOG.info("Type: META"); - LOG.info("Fenced"); - LOG.info(""); + log.info() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("type", "META") + .log("Fenced"); return; } // process a data entry long lastAddConfirmed = recBuff.readLong(); - LOG.info("Type: DATA"); - LOG.info("LastConfirmed: {}", lastAddConfirmed); + log.info() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .attr("type", "DATA") + .attr("lastAddConfirmed", lastAddConfirmed) + .log("Entry"); if (!printMsg) { - LOG.info(""); return; } // skip digest checking recBuff.skipBytes(8); - LOG.info("Data:"); - LOG.info(""); try { byte[] ret = new byte[recBuff.readableBytes()]; recBuff.readBytes(ret); entryFormatter.formatEntry(ret); } catch (Exception e) { - LOG.info("N/A. Corrupted."); + log.info() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId) + .exceptionMessage(e) + .log("N/A. Corrupted."); } - LOG.info(""); } public static String bytes2Hex(byte[] data) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java index 46fae40ae26..9025eb56d19 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.File; import java.io.IOException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Journal; import org.apache.bookkeeper.bookie.LedgerDirsManager; import org.apache.bookkeeper.bookie.LogMark; @@ -30,17 +31,15 @@ import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.DiskChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A bookie command to print the last log marker. */ +@CustomLog public class LastMarkCommand extends BookieCommand { private static final String NAME = "lastmark"; private static final String DESC = "Print last log marker"; - private static final Logger LOG = LoggerFactory.getLogger(LastMarkCommand.class); public LastMarkCommand() { super(CliSpec.newBuilder() @@ -66,10 +65,11 @@ public boolean apply(ServerConfiguration conf, CliFlags flags) { for (int idx = 0; idx < journalDirs.length; idx++) { Journal journal = new Journal(idx, journalDirs[idx], conf, dirsManager); LogMark lastLogMark = journal.getLastLogMark().getCurMark(); - LOG.info("LastLogMark : Journal Id - {}({}.txn), Pos - {}", - lastLogMark.getLogFileId(), - Long.toHexString(lastLogMark.getLogFileId()), - lastLogMark.getLogFileOffset()); + log.info() + .attr("logFileId", lastLogMark.getLogFileId()) + .attr("logFile", Long.toHexString(lastLogMark.getLogFileId()) + ".txn") + .attr("logFileOffset", lastLogMark.getLogFileOffset()) + .log("LastLogMark"); } return true; } catch (IOException e) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LedgerCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LedgerCommand.java index 5f66fff2d19..dd6e12be902 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LedgerCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LedgerCommand.java @@ -23,6 +23,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; import java.util.function.Consumer; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieImpl; @@ -37,16 +38,13 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.commons.lang3.mutable.MutableLong; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to dump ledger index entries into readable format. */ +@CustomLog public class LedgerCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(LedgerCommand.class); - private static final String NAME = "ledger"; private static final String DESC = "Dump ledger index entries into readable format"; @@ -118,7 +116,7 @@ public boolean apply(ServerConfiguration conf, LedgerFlags cmdFlags) { } } } catch (IOException e) { - LOG.error("Failed to read index page"); + log.error("Failed to read index page"); return true; } @@ -194,7 +192,6 @@ private boolean printPageEntries(LedgerCache.PageEntries page) { return false; } - private void printInfoLine(String mes) { System.out.println(mes); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListActiveLedgersCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListActiveLedgersCommand.java index 2fc844b48f0..740ffb94ee3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListActiveLedgersCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListActiveLedgersCommand.java @@ -31,6 +31,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.DefaultEntryLogger; @@ -47,15 +48,13 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.zookeeper.AsyncCallback.VoidCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * List active(exist in metadata storage) ledgers in a entry log file. * **/ @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") +@CustomLog public class ListActiveLedgersCommand extends BookieCommand{ - private static final Logger LOG = LoggerFactory.getLogger(ListActiveLedgersCommand.class); private static final String NAME = "active ledger"; private static final String DESC = "Retrieve bookie active ledger info."; private static final long DEFAULT_TIME_OUT = 1000; @@ -135,20 +134,20 @@ public void handler(ServerConfiguration bkConf, ActiveLedgerFlags cmdFlags) EntryLogMetadata entryLogMetadata = entryLogger.getEntryLogMetadata(cmdFlags.logId); Map ledgersOnEntryLog = entryLogMetadata.getLedgersMap().asMap(); if (ledgersOnEntryLog.isEmpty()) { - LOG.info("Ledgers on log file {} is empty", cmdFlags.logId); + log.info().attr("file", cmdFlags.logId).log("Ledgers on log file is empty"); } entryLogMetadata.removeLedgerIf(ledgerId -> !activeLedgersOnMetadata.contains(ledgerId)); printActiveLedgerOnEntryLog(cmdFlags.logId, entryLogMetadata); } else { - LOG.info("Read active ledgers id from metadata store,fail code {}", resultCode.get()); + log.info().attr("code", resultCode.get()).log("Read active ledgers id from metadata store,fail code"); throw BKException.create(resultCode.get()); } } else { - LOG.info("Read active ledgers id from metadata store timeout"); + log.info("Read active ledgers id from metadata store timeout"); } } catch (BKException | InterruptedException | IOException e){ - LOG.error("Received Exception while processing ledgers", e); + log.error().exception(e).log("Received Exception while processing ledgers"); throw new UncheckedExecutionException(e); } return null; @@ -156,16 +155,25 @@ public void handler(ServerConfiguration bkConf, ActiveLedgerFlags cmdFlags) } private void printActiveLedgerOnEntryLog(long logId, EntryLogMetadata entryLogMetadata) { - LOG.info("Print active ledgers of entrylog {} ({}.log)", logId, Long.toHexString(logId)); + log.info() + .attr("logId", logId) + .attr("value", Long.toHexString(logId)) + .log("Print active ledgers of entrylog ( .log)"); if (entryLogMetadata.getRemainingSize() == 0){ - LOG.info("No active ledgers on log file {}", logId); + log.info().attr("logId", logId).log("No active ledgers on log file"); } else { - LOG.info("entryLogId: {}, remaining size: {}, total size: {}, usage: {}", entryLogMetadata.getEntryLogId(), - entryLogMetadata.getRemainingSize(), entryLogMetadata.getTotalSize(), entryLogMetadata.getUsage()); + log.info() + .attr("entryLogId", entryLogMetadata.getEntryLogId()) + .attr("remainingSize", entryLogMetadata.getRemainingSize()) + .attr("totalSize", entryLogMetadata.getTotalSize()) + .attr("usage", entryLogMetadata.getUsage()) + .log("Entry log usage"); } entryLogMetadata.getLedgersMap().forEach((ledgerId, size) -> { - LOG.info("--------- Lid={}, TotalSizeOfEntriesOfLedger={} ---------", - ledgerIdFormatter.formatLedgerId(ledgerId), size); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)) + .attr("totalSize", size) + .log("Size for ledger's entries"); }); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListFilesOnDiscCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListFilesOnDiscCommand.java index 07472b29055..c59c6f73b03 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListFilesOnDiscCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListFilesOnDiscCommand.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.util.List; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieShell; @@ -30,17 +31,15 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to list the files in JournalDirectories/LedgerDirectories/IndexDirectories. */ +@CustomLog public class ListFilesOnDiscCommand extends BookieCommand { private static final String NAME = "listfilesondisc"; private static final String DESC = "List the files in JournalDirectories/LedgerDirectories/IndexDirectories."; - private static final Logger LOG = LoggerFactory.getLogger(ListFilesOnDiscCommand.class); public ListFilesOnDiscCommand() { this(new LFODFlags()); @@ -79,27 +78,27 @@ private boolean handler(ServerConfiguration conf, LFODFlags cmd) throws IOExcept if (cmd.journal) { File[] journalDirs = conf.getJournalDirs(); List journalFiles = BookieShell.listFilesAndSort(journalDirs, "txn"); - LOG.info("--------- Printing the list of Journal Files ---------"); + log.info("--------- Printing the list of Journal Files ---------"); for (File journalFile : journalFiles) { - LOG.info("{}", journalFile.getCanonicalPath()); + log.info().attr("canonicalPath", journalFile.getCanonicalPath()).log("log entry"); } - LOG.info(""); + log.info(""); } if (cmd.entrylog) { File[] ledgerDirs = conf.getLedgerDirs(); List ledgerFiles = BookieShell.listFilesAndSort(ledgerDirs, "log"); - LOG.info("--------- Printing the list of EntryLog/Ledger Files ---------"); + log.info("--------- Printing the list of EntryLog/Ledger Files ---------"); for (File ledgerFile : ledgerFiles) { - LOG.info("{}", ledgerFile.getCanonicalPath()); + log.info().attr("canonicalPath", ledgerFile.getCanonicalPath()).log("log entry"); } - LOG.info(""); + log.info(""); } if (cmd.index) { File[] indexDirs = (conf.getIndexDirs() == null) ? conf.getLedgerDirs() : conf.getIndexDirs(); List indexFiles = BookieShell.listFilesAndSort(indexDirs, "idx"); - LOG.info("--------- Printing the list of Index Files ---------"); + log.info("--------- Printing the list of Index Files ---------"); for (File indexFile : indexFiles) { - LOG.info("{}", indexFile.getCanonicalPath()); + log.info().attr("canonicalPath", indexFile.getCanonicalPath()).log("log entry"); } } return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java index 2e637f35808..975201aa8a0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java @@ -27,6 +27,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException; @@ -43,17 +44,14 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command for list all ledgers on the cluster. */ @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") +@CustomLog public class ListLedgersCommand extends BookieCommand { - private static final Logger LOG = LoggerFactory.getLogger(ListLedgersCommand.class); - private static final String NAME = "listledgers"; private static final String DESC = "List all ledgers on the cluster (this may take a long time)."; private static final String DEFAULT = ""; @@ -100,7 +98,7 @@ public boolean apply(ServerConfiguration conf, ListLedgersFlags cmdFlags) { try { handler(conf, cmdFlags); } catch (UnknownHostException e) { - LOG.error("Bookie id error"); + log.error("Bookie id error"); return false; } catch (MetadataException | ExecutionException e) { throw new UncheckedExecutionException(e.getMessage(), e); @@ -162,7 +160,7 @@ public boolean handler(ServerConfiguration conf, ListLedgersFlags flags) == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { cb.processResult(BKException.Code.OK, null, null); } else { - LOG.error("Unable to read the ledger: {} information", ledgerId); + log.error().attr("ledgerId", ledgerId).log("Unable to read the ledger: information"); cb.processResult(BKException.getExceptionCode(exception), null, null); } }); @@ -176,12 +174,14 @@ public boolean handler(ServerConfiguration conf, ListLedgersFlags flags) processDone.await(); if (returnCode.get() != BKException.Code.OK) { - LOG.error("Received error return value while processing ledgers: {}", returnCode.get()); + log.error() + .attr("ledgers", returnCode.get()) + .log("Received error return value while processing ledgers"); throw BKException.create(returnCode.get()); } } catch (Exception ioe) { - LOG.error("Received Exception while processing ledgers", ioe); + log.error().exception(ioe).log("Received Exception while processing ledgers"); throw new UncheckedExecutionException(ioe); } return null; @@ -191,9 +191,11 @@ public boolean handler(ServerConfiguration conf, ListLedgersFlags flags) } private void printLedgerMetadata(long ledgerId, LedgerMetadata md, boolean printMeta) { - LOG.info("ledgerID: {}", ledgerIdFormatter.formatLedgerId(ledgerId)); + var e = log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)); if (printMeta) { - LOG.info("{}", md.toString()); + e.attr("metadata", md.toString()); } + e.log("log entry"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LocalConsistencyCheckCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LocalConsistencyCheckCommand.java index 181d1e661bd..664fca35d7a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LocalConsistencyCheckCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LocalConsistencyCheckCommand.java @@ -21,22 +21,20 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; import java.util.List; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.LedgerStorage; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to check local storage for inconsistencies. */ +@CustomLog public class LocalConsistencyCheckCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(LocalConsistencyCheckCommand.class); - private static final String NAME = "localconsistencycheck"; private static final String DESC = "Validate Ledger Storage internal metadata"; @@ -58,19 +56,23 @@ public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { } private boolean check(ServerConfiguration conf) throws IOException { - LOG.info("=== Performing local consistency check ==="); + log.info("=== Performing local consistency check ==="); ServerConfiguration serverConfiguration = new ServerConfiguration(conf); LedgerStorage ledgerStorage = BookieImpl.mountLedgerStorageOffline(serverConfiguration, null); List errors = ledgerStorage.localConsistencyCheck( java.util.Optional.empty()); if (errors.size() > 0) { - LOG.info("=== Check returned errors: ==="); + log.info("=== Check returned errors: ==="); for (LedgerStorage.DetectedInconsistency error : errors) { - LOG.error("Ledger {}, entry {}: ", error.getLedgerId(), error.getEntryId(), error.getException()); + log.error() + .attr("ledgerId", error.getLedgerId()) + .attr("entryId", error.getEntryId()) + .exception(error.getException()) + .log("Inconsistency detected for ledger entry"); } return false; } else { - LOG.info("=== Check passed ==="); + log.info("=== Check passed ==="); return true; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadJournalCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadJournalCommand.java index ab985070ff9..3fa80fa7723 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadJournalCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadJournalCommand.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.Journal; @@ -38,12 +39,11 @@ import org.apache.bookkeeper.util.DiskChecker; import org.apache.bookkeeper.util.EntryFormatter; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to scan a journal file and format the entries into readable format. */ +@CustomLog public class ReadJournalCommand extends BookieCommand { private static final String NAME = "readjournal"; @@ -52,7 +52,6 @@ public class ReadJournalCommand extends BookieCommand journals = null; @@ -128,7 +127,7 @@ private boolean handler(ServerConfiguration conf, ReadJournalFlags cmd) throws I Journal journal = null; if (getJournals(conf).size() > 1) { if (cmd.dir.equals(DEFAULT)) { - LOG.error("ERROR: invalid or missing journal directory"); + log.error("ERROR: invalid or missing journal directory"); usage(); return false; } @@ -141,7 +140,7 @@ private boolean handler(ServerConfiguration conf, ReadJournalFlags cmd) throws I } if (journal == null) { - LOG.error("ERROR: journal directory not found"); + log.error("ERROR: journal directory not found"); usage(); return false; } @@ -154,7 +153,7 @@ private boolean handler(ServerConfiguration conf, ReadJournalFlags cmd) throws I File f = new File(cmd.fileName); String name = f.getName(); if (!name.endsWith(".txn")) { - LOG.error("ERROR: invalid journal file name {}", cmd.fileName); + log.error().attr("name", cmd.fileName).log("ERROR: invalid journal file name"); usage(); return false; } @@ -167,7 +166,7 @@ private boolean handler(ServerConfiguration conf, ReadJournalFlags cmd) throws I private boolean checkArgs(ReadJournalFlags flags) { if ((flags.fileName.equals(DEFAULT) && flags.journalId == DEFAULT_JOURNALID)) { - LOG.info("ERROR: You should figure jounalId or journal filename"); + log.info("ERROR: You should figure jounalId or journal filename"); return false; } @@ -194,14 +193,17 @@ private synchronized List getJournals(ServerConfiguration conf) throws * @param printMsg Whether printing the entry data. */ private void scanJournal(Journal journal, long journalId, final boolean printMsg) throws IOException { - LOG.info("Scan journal {} ({}.txn)", journalId, Long.toHexString(journalId)); + log.info() + .attr("journalId", journalId) + .attr("file", Long.toHexString(journalId) + ".txn") + .log("Scan journal"); scanJournal(journal, journalId, new Journal.JournalScanner() { boolean printJournalVersion = false; @Override public void process(int journalVersion, long offset, ByteBuffer entry) throws IOException { if (!printJournalVersion) { - LOG.info("Journal Version : {}", journalVersion); + log.info().attr("journalVersion", journalVersion).log("Journal Version"); printJournalVersion = true; } FormatUtil diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java index e07dc9d9d9e..81eb03d2ae0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java @@ -32,6 +32,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.stream.LongStream; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException; @@ -51,16 +52,13 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.EntryFormatter; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to read ledger entries. */ +@CustomLog public class ReadLedgerCommand extends BookieCommand { - private static final Logger LOG = LoggerFactory.getLogger(ReadLedgerCommand.class); - private static final String NAME = "readledger"; private static final String DESC = "Read a range of entries from a ledger."; @@ -195,17 +193,22 @@ private boolean readledger(ServerConfiguration serverConf, ReadLedgerFlags flags bookieClient.readEntry(bookie, flags.ledgerId, entryId, (rc, ledgerId1, entryId1, buffer, ctx) -> { if (rc != BKException.Code.OK) { - LOG.error("Failed to read entry {} -- {}", entryId1, - BKException.getMessage(rc)); + log.error() + .attr("entryId", entryId1) + .attr("error", BKException.getMessage(rc)) + .log("Failed to read entry"); future.completeExceptionally(BKException.create(rc)); return; } - LOG.info("--------- Lid={}, Eid={} ---------", - ledgerIdFormatter.formatLedgerId(flags.ledgerId), entryId); + var event = log.info() + .attr("ledgerId", + ledgerIdFormatter.formatLedgerId(flags.ledgerId)) + .attr("entryId", entryId); if (flags.msg) { - LOG.info("Data: " + ByteBufUtil.prettyHexDump(buffer)); + event.attr("data", ByteBufUtil.prettyHexDump(buffer)); } + event.log("Entry"); future.complete(null); }, null, BookieProtocol.FLAG_NONE); @@ -213,7 +216,10 @@ private boolean readledger(ServerConfiguration serverConf, ReadLedgerFlags flags try { future.get(); } catch (Exception e) { - LOG.error("Error future.get while reading entries from ledger {}", flags.ledgerId, e); + log.error() + .attr("ledgerId", flags.ledgerId) + .exception(e) + .log("Error future.get while reading entries from ledger"); } }); @@ -238,8 +244,11 @@ private void formatEntry(LedgerEntry entry, boolean printMsg) { long entryId = entry.getEntryId(); long entrySize = entry.getLength(); - LOG.info("--------- Lid={}, Eid={}, EntrySize={} ---------", - ledgerIdFormatter.formatLedgerId(ledgerId), entryId, entrySize); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)) + .attr("entryId", entryId) + .attr("entrySize", entrySize) + .log("Entry"); if (printMsg) { entryFormatter.formatEntry(entry.getEntry()); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogCommand.java index 953ae9e21f3..712c3b16240 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogCommand.java @@ -23,6 +23,7 @@ import io.netty.buffer.ByteBuf; import java.io.File; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.ReadOnlyDefaultEntryLogger; @@ -35,17 +36,15 @@ import org.apache.bookkeeper.util.EntryFormatter; import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.commons.lang3.mutable.MutableBoolean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to read entry log files. */ +@CustomLog public class ReadLogCommand extends BookieCommand { private static final String NAME = "readlog"; private static final String DESC = "Scan an entry file and format the entries into readable format."; - private static final Logger LOG = LoggerFactory.getLogger(ReadLogCommand.class); private EntryLogger entryLogger; private EntryFormatter entryFormatter; @@ -115,7 +114,7 @@ public boolean apply(ServerConfiguration conf, ReadLogFlags cmdFlags) { } if (cmdFlags.entryLogId == -1 && cmdFlags.filename == null) { - LOG.error("Missing entry log id or entry log file name"); + log.error("Missing entry log id or entry log file name"); usage(); return false; } @@ -132,7 +131,7 @@ private boolean readLog(ServerConfiguration conf, ReadLogFlags flags) throws Exc File f = new File(flags.filename); String name = f.getName(); if (!name.endsWith(".log")) { - LOG.error("Invalid entry log file name {}", flags.filename); + log.error().attr("name", flags.filename).log("Invalid entry log file name"); usage(); return false; } @@ -148,7 +147,7 @@ private boolean readLog(ServerConfiguration conf, ReadLogFlags flags) throws Exc // scan entry log if (startpos != -1) { if ((endpos != -1) && (endpos < startpos)) { - LOG.error("ERROR: StartPosition of the range should be lesser than or equal to EndPosition"); + log.error("ERROR: StartPosition of the range should be lesser than or equal to EndPosition"); return false; } scanEntryLogForPositionRange(conf, logId, startpos, endpos, flags.msg); @@ -172,8 +171,12 @@ private boolean readLog(ServerConfiguration conf, ReadLogFlags flags) throws Exc private void scanEntryLogForPositionRange(ServerConfiguration conf, long logId, final long rangeStartPos, final long rangeEndPos, final boolean printMsg) throws Exception { - LOG.info("Scan entry log {} ({}.log) for PositionRange: {} - {}", - logId, Long.toHexString(logId), rangeStartPos, rangeEndPos); + log.info() + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .attr("rangeStartPos", rangeStartPos) + .attr("rangeEndPos", rangeEndPos) + .log("Scan entry log"); final MutableBoolean entryFound = new MutableBoolean(false); scanEntryLog(conf, logId, new EntryLogScanner() { private MutableBoolean stopScanning = new MutableBoolean(false); @@ -208,10 +211,13 @@ public void process(long ledgerId, long entryStartPos, ByteBuf entry) throws IOE } }); if (!entryFound.booleanValue()) { - LOG.info("Entry log {} ({}.log) doesn't has any entry in the range {} - {}. " - + "Probably the position range, you have provided is lesser than the LOGFILE_HEADER_SIZE (1024) " - + "or greater than the current log filesize.", - logId, Long.toHexString(logId), rangeStartPos, rangeEndPos); + log.info() + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .attr("rangeStartPos", rangeStartPos).attr("rangeEndPos", rangeEndPos) + .log("Entry log doesn't have any entry in the range." + + " Probably the position range is lesser than the LOGFILE_HEADER_SIZE (1024)" + + " or greater than the current log filesize"); } } @@ -246,8 +252,12 @@ private synchronized void initEntryLogger(ServerConfiguration conf) throws IOExc private void scanEntryLogForSpecificEntry(ServerConfiguration conf, long logId, final long ledgerId, final long entryId, final boolean printMsg) throws Exception { - LOG.info("Scan entry log {} ({}.log) for LedgerId {} {}", logId, Long.toHexString(logId), ledgerId, - ((entryId == -1) ? "" : " for EntryId " + entryId)); + log.info() + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .attr("ledgerId", ledgerId) + .attr("entryId", entryId == -1 ? null : entryId) + .log("Scan entry log for LedgerId"); final MutableBoolean entryFound = new MutableBoolean(false); scanEntryLog(conf, logId, new EntryLogScanner() { @Override @@ -267,8 +277,12 @@ public void process(long candidateLedgerId, long startPos, ByteBuf entry) { } }); if (!entryFound.booleanValue()) { - LOG.info("LedgerId {} {} is not available in the entry log {} ({}.log)", - ledgerId, ((entryId == -1) ? "" : " EntryId " + entryId), logId, Long.toHexString(logId)); + log.info() + .attr("ledgerId", ledgerId) + .attr("entryId", entryId == -1 ? null : entryId) + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .log("LedgerId is not available in the entry log"); } } @@ -281,7 +295,10 @@ public void process(long candidateLedgerId, long startPos, ByteBuf entry) { * Whether printing the entry data. */ private void scanEntryLog(ServerConfiguration conf, long logId, final boolean printMsg) throws Exception { - LOG.info("Scan entry log {} ({}.log)", logId, Long.toHexString(logId)); + log.info() + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .log("Scan entry log"); scanEntryLog(conf, logId, new EntryLogScanner() { @Override public boolean accept(long ledgerId) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java index e39bd328c7d..fcaa03c0504 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java @@ -23,6 +23,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.File; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.EntryLogMetadata; @@ -34,16 +35,13 @@ import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to print metadata of entry log. */ +@CustomLog public class ReadLogMetadataCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(ReadLogMetadataCommand.class); - private static final String NAME = "readlogmetadata"; private static final String DESC = "Prints entrylog's metadata"; @@ -98,7 +96,7 @@ public boolean apply(ServerConfiguration conf, ReadLogMetadataFlags cmdFlags) { this.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(conf); } if (cmdFlags.logId == DEFAULT_LOGID && cmdFlags.logFilename.equals(DEFAULT_FILENAME)) { - LOG.error("Missing entry log id or entry log file name"); + log.error("Missing entry log id or entry log file name"); return false; } try { @@ -116,7 +114,7 @@ public boolean readLogMetadata(ServerConfiguration conf, ReadLogMetadataFlags fl File f = new File(flags.logFilename); String name = f.getName(); if (!name.endsWith(".log")) { - LOG.error("ERROR: invalid entry log file name " + flags.logFilename); + log.error().attr("filename", flags.logFilename).log("Invalid entry log file name"); return false; } String idString = name.split("\\.")[0]; @@ -128,14 +126,22 @@ public boolean readLogMetadata(ServerConfiguration conf, ReadLogMetadataFlags fl } private void printEntryLogMetadata(ServerConfiguration conf, long logId) throws IOException { - LOG.info("Print entryLogMetadata of entrylog {} ({}.log)", logId, Long.toHexString(logId)); + log.info() + .attr("logId", logId) + .attr("file", Long.toHexString(logId) + ".log") + .log("Print entryLogMetadata of entrylog"); initEntryLogger(conf); EntryLogMetadata entryLogMetadata = entryLogger.getEntryLogMetadata(logId); - LOG.info("entryLogId: {}, total size: {}", entryLogMetadata.getEntryLogId(), entryLogMetadata.getTotalSize()); + log.info() + .attr("entryLogId", entryLogMetadata.getEntryLogId()) + .attr("totalSize", entryLogMetadata.getTotalSize()) + .log("EntryLog metadata"); entryLogMetadata.getLedgersMap().forEach((ledgerId, size) -> { - LOG.info("--------- Lid={}, TotalSizeOfEntriesOfLedger={} ---------", - ledgerIdFormatter.formatLedgerId(ledgerId), size); + log.info() + .attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)) + .attr("size", size) + .log("Size of ledger's entries"); }); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgerLocationsIndexCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgerLocationsIndexCommand.java index 8cbb986633d..502c7fdc4f3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgerLocationsIndexCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgerLocationsIndexCommand.java @@ -19,21 +19,19 @@ package org.apache.bookkeeper.tools.cli.commands.bookie; import java.io.IOException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.storage.ldb.LocationsIndexRebuildOp; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to rebuild DBLedgerStorage locations index. */ +@CustomLog public class RebuildDBLedgerLocationsIndexCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(RebuildDBLedgerLocationsIndexCommand.class); - private static final String NAME = "rebuild-db-ledger-locations-index"; private static final String DESC = "Rbuild DBLedgerStorage locations index by scanning the entry logs"; @@ -43,14 +41,14 @@ public RebuildDBLedgerLocationsIndexCommand() { @Override public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { - LOG.info("=== Rebuilding DBStorage locations index ==="); + log.info("=== Rebuilding DBStorage locations index ==="); ServerConfiguration serverConfiguration = new ServerConfiguration(conf); try { new LocationsIndexRebuildOp(serverConfiguration).initiate(); } catch (IOException e) { e.printStackTrace(); } - LOG.info("-- Done rebuilding DBStorage locations index --"); + log.info("-- Done rebuilding DBStorage locations index --"); return true; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgersIndexCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgersIndexCommand.java index b37f968b0d3..1245eabceb9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgersIndexCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RebuildDBLedgersIndexCommand.java @@ -19,6 +19,7 @@ package org.apache.bookkeeper.tools.cli.commands.bookie; import com.beust.jcommander.Parameter; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.storage.ldb.LedgersIndexRebuildOp; @@ -26,16 +27,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to rebuild DBLedgerStorage ledgers index. */ +@CustomLog public class RebuildDBLedgersIndexCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(RebuildDBLedgersIndexCommand.class); - private static final String NAME = "rebuild-db-ledgers-index"; private static final String DESC = "Rebuild DBLedgerStorage ledgers index by scanning the journal" + " and entry logs (sets all ledgers to fenced)"; @@ -51,13 +49,13 @@ public RebuildDBLedgersIndexCommand(RebuildLedgersIndexFlags flags) { @Override public boolean apply(ServerConfiguration conf, RebuildLedgersIndexFlags cmdFlags) { - LOG.info("=== Rebuilding DBStorage ledgers index ==="); + log.info("=== Rebuilding DBStorage ledgers index ==="); ServerConfiguration serverConfiguration = new ServerConfiguration(conf); boolean success = new LedgersIndexRebuildOp(serverConfiguration, cmdFlags.verbose).initiate(); if (success) { - LOG.info("-- Done rebuilding DBStorage ledgers index --"); + log.info("-- Done rebuilding DBStorage ledgers index --"); } else { - LOG.info("-- Aborted rebuilding DBStorage ledgers index --"); + log.info("-- Aborted rebuilding DBStorage ledgers index --"); } return success; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RegenerateInterleavedStorageIndexFileCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RegenerateInterleavedStorageIndexFileCommand.java index c50e808116e..4bae41c9ec2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RegenerateInterleavedStorageIndexFileCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/RegenerateInterleavedStorageIndexFileCommand.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.InterleavedStorageRegenerateIndexOp; @@ -35,17 +36,14 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to regenerate an index file for interleaved storage. */ +@CustomLog public class RegenerateInterleavedStorageIndexFileCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(RegenerateInterleavedStorageIndexFileCommand.class); - private static final String NAME = "regenerate-interleaved-storage-index-file"; private static final String DESC = "Regenerate an interleaved storage index file, from available entrylogger " + "files."; @@ -106,19 +104,19 @@ private boolean generate(ServerConfiguration conf, RISIFFlags flags) throws NoSu } else if (!flags.b64Password.equals(DEFAULT)) { password = Base64.getDecoder().decode(flags.b64Password); } else { - LOG.error("The password must be specified to regenerate the index file"); + log.error("The password must be specified to regenerate the index file"); return false; } Set ledgerIds = flags.ledgerIds.stream().collect(Collectors.toSet()); - LOG.info("=== Rebuilding index file for {} ===", ledgerIds); + log.info().attr("ledgerIds", ledgerIds).log("Rebuilding index file"); ServerConfiguration serverConfiguration = new ServerConfiguration(conf); InterleavedStorageRegenerateIndexOp i = new InterleavedStorageRegenerateIndexOp(serverConfiguration, ledgerIds, password); i.initiate(flags.dryRun); - LOG.info("-- Done rebuilding index file for {} --", ledgerIds); + log.info().attr("ledgerIds", ledgerIds).log("Done rebuilding index file"); return true; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/SanityTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/SanityTestCommand.java index d8a1908fb90..ec8137b1531 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/SanityTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/SanityTestCommand.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.LocalBookieEnsemblePlacementPolicy; @@ -40,15 +41,12 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A bookie command to sanity test for local bookie. */ +@CustomLog public class SanityTestCommand extends BookieCommand { - - private static final Logger LOG = LoggerFactory.getLogger(SanityTestCommand.class); private static final String NAME = "sanitytest"; private static final String DESC = "Sanity test for local bookie. " + "Create ledger and write/reads entries on local bookie."; @@ -90,7 +88,7 @@ private static boolean handle(ServerConfiguration conf, SanityFlags cmdFlags) th try { return handleAsync(conf, cmdFlags).get(); } catch (Exception e) { - LOG.warn("Error in bookie sanity test", e); + log.warn().exception(e).log("Error in bookie sanity test"); return false; } } @@ -107,14 +105,14 @@ public static CompletableFuture handleAsync(ServerConfiguration conf, S try { bk = new BookKeeper(clientConf); } catch (BKException | IOException | InterruptedException e) { - LOG.warn("Failed to initialize bookkeeper client", e); + log.warn().exception(e).log("Failed to initialize bookkeeper client"); result.completeExceptionally(e); return result; } bk.asyncCreateLedger(1, 1, BookKeeper.DigestType.MAC, new byte[0], (rc, lh, ctx) -> { if (rc != BKException.Code.OK) { - LOG.warn("ledger creation failed for sanity command {}", rc); + log.warn().attr("rc", rc).log("ledger creation failed for sanity command"); result.completeExceptionally(BKException.create(rc)); return; } @@ -125,7 +123,10 @@ public static CompletableFuture handleAsync(ServerConfiguration conf, S entriesFutures.add(entryFuture); lh.asyncAddEntry(content.getBytes(UTF_8), (arc, alh, entryId, actx) -> { if (arc != BKException.Code.OK) { - LOG.warn("ledger add entry failed for {}-{}", alh.getId(), arc); + log.warn() + .attr("ledgerId", alh.getId()) + .attr("rc", arc) + .log("Ledger add entry failed"); entryFuture.completeExceptionally(BKException.create(arc)); return; } @@ -137,7 +138,10 @@ public static CompletableFuture handleAsync(ServerConfiguration conf, S FutureUtils.collect(entriesFutures).thenCompose(_r -> lh.closeAsync()).thenCompose(_r -> { bk.asyncOpenLedger(lh.getId(), BookKeeper.DigestType.MAC, new byte[0], (orc, olh, octx) -> { if (orc != BKException.Code.OK) { - LOG.warn("open sanity ledger failed for {}-{}", lh.getId(), orc); + log.warn() + .attr("ledgerId", lh.getId()) + .attr("rc", orc) + .log("Open sanity ledger failed"); lhFuture.completeExceptionally(BKException.create(orc)); return; } @@ -153,7 +157,10 @@ public static CompletableFuture handleAsync(ServerConfiguration conf, S }).thenCompose(rlh -> { rlh.asyncReadEntries(0, cmdFlags.entries - 1, (rrc, rlh2, entries, rctx) -> { if (rrc != BKException.Code.OK) { - LOG.warn("reading sanity ledger failed for {}-{}", lh.getId(), rrc); + log.warn() + .attr("ledgerId", lh.getId()) + .attr("rc", rrc) + .log("Reading sanity ledger failed"); readEntryFuture.completeExceptionally(BKException.create(rrc)); return; } @@ -169,8 +176,11 @@ public static CompletableFuture handleAsync(ServerConfiguration conf, S return; } } - LOG.info("Read {} entries from ledger {}", i, lh.getId()); - LOG.info("Bookie sanity test succeeded"); + log.info() + .attr("entries", i) + .attr("ledgerId", lh.getId()) + .log("Read entries from ledger"); + log.info("Bookie sanity test succeeded"); readEntryFuture.complete(null); }, null); return readEntryFuture; @@ -190,7 +200,7 @@ public static void close(BookKeeper bk, LedgerHandle lh) { if (lh != null) { bk.asyncDeleteLedger(lh.getId(), (rc, ctx) -> { if (rc != BKException.Code.OK) { - LOG.info("Failed to delete ledger id {}", lh.getId()); + log.info().attr("ledgerId", lh.getId()).log("Failed to delete ledger"); } close(bk); }, null); @@ -203,7 +213,7 @@ private static void close(BookKeeper bk) { try { bk.close(); } catch (Exception e) { - LOG.info("Failed to close bookkeeper client {}", e.getMessage(), e); + log.info().exception(e).log("Failed to close bookkeeper client"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/UpdateBookieInLedgerCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/UpdateBookieInLedgerCommand.java index eed3bf53948..c84517abb33 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/UpdateBookieInLedgerCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/UpdateBookieInLedgerCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieShell; @@ -36,16 +37,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to update ledger command. */ +@CustomLog public class UpdateBookieInLedgerCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(UpdateBookieInLedgerCommand.class); - private static final String NAME = "update-bookie-ledger-cmd"; private static final String DESC = "Update bookie in ledgers metadata (this may take a long time)."; @@ -116,25 +114,27 @@ private boolean updateLedger(ServerConfiguration conf, UpdateBookieInLedgerFlags bookieAddress = flags.destBookie; destBookieAddress = BookieId.parse(bookieAddress); } catch (Exception e) { - LOG.error("Bookie address must in

: format"); + log.error("Bookie address must in
: format"); return false; } final int rate = flags.updatePerSec; if (rate <= 0) { - LOG.error("Invalid updatespersec {}, should be > 0", rate); + log.error().attr("rate", rate).log("Invalid updatespersec, should be > 0"); return false; } final int maxOutstandingReads = flags.maxOutstandingReads; if (maxOutstandingReads <= 0) { - LOG.error("Invalid maxOutstandingReads {}, should be > 0", maxOutstandingReads); + log.error() + .attr("maxOutstandingReads", maxOutstandingReads) + .log("Invalid maxOutstandingReads, should be > 0"); return false; } final int limit = flags.limit; if (limit <= 0 && limit != Integer.MIN_VALUE) { - LOG.error("Invalid limit {}, should be > 0", limit); + log.error().attr("limit", limit).log("Invalid limit, should be > 0"); return false; } @@ -153,7 +153,7 @@ private boolean updateLedger(ServerConfiguration conf, UpdateBookieInLedgerFlags || admin.getReadOnlyBookies().contains(srcBookieAddress)) { bk.close(); admin.close(); - LOG.error("Source bookie {} can't be active", srcBookieAddress); + log.error().attr("srcBookieAddress", srcBookieAddress).log("Source bookie can't be active"); return false; } final UpdateLedgerOp updateLedgerOp = new UpdateLedgerOp(bk, admin); @@ -167,7 +167,10 @@ public void progress(long updated, long issued) { return; // disabled } if (TimeUnit.MILLISECONDS.toSeconds(MathUtils.elapsedMSec(lastReport)) >= printProgress) { - LOG.info("Number of ledgers issued={}, updated={}", issued, updated); + log.info() + .attr("issued", issued) + .attr("updated", updated) + .log("Number of ledgers"); lastReport = MathUtils.nowInNano(); } } @@ -177,7 +180,7 @@ public void progress(long updated, long issued) { updateLedgerOp.updateBookieIdInLedgers(srcBookieAddress, destBookieAddress, rate, maxOutstandingReads, limit, progressable); } catch (IOException e) { - LOG.error("Failed to update ledger metadata", e); + log.error().exception(e).log("Failed to update ledger metadata"); return false; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ClusterInfoCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ClusterInfoCommand.java index 4ff9c5932e7..22147aeb05a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ClusterInfoCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ClusterInfoCommand.java @@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.UncheckedExecutionException; import java.util.Iterator; +import lombok.CustomLog; import lombok.Data; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -35,17 +36,15 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A bookie command to retrieve bookies cluster info. */ +@CustomLog public class ClusterInfoCommand extends BookieCommand { private static final String NAME = "cluster-info"; private static final String DESC = "Exposes the current info about the cluster of bookies"; - private static final Logger LOG = LoggerFactory.getLogger(ClusterInfoCommand.class); private ClusterInfo info; public ClusterInfoCommand() { @@ -81,14 +80,14 @@ public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { ClientConfiguration clientConfiguration = new ClientConfiguration(conf); try (BookKeeperAdmin admin = new BookKeeperAdmin(clientConfiguration)) { - LOG.info("Starting fill cluster info."); + log.info("Starting fill cluster info."); info = new ClusterInfo(); fillUReplicatedInfo(info, conf); fillAuditorInfo(info, admin); fillBookiesInfo(info, admin); - LOG.info("--------- Cluster Info ---------"); - LOG.info("{}", JsonUtil.toJson(info)); + log.info("--------- Cluster Info ---------"); + log.info().attr("value", JsonUtil.toJson(info)).log("log entry"); } catch (Exception e) { e.printStackTrace(); } @@ -114,7 +113,7 @@ private void fillAuditorInfo(ClusterInfo info, BookKeeperAdmin bka) { info.setAuditorElected(currentAuditor != null); info.setAuditorId(currentAuditor == null ? "" : currentAuditor.getId()); } catch (Exception e) { - LOG.error("Could not get Auditor info", e); + log.error().exception(e).log("Could not get Auditor info"); info.setAuditorElected(false); info.setAuditorId(""); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/DecommissionCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/DecommissionCommand.java index 8461d31a40f..68c8d8f968a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/DecommissionCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/DecommissionCommand.java @@ -23,6 +23,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieException; @@ -38,8 +39,6 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to trigger AuditTask by resetting lostBookieRecoveryDelay and @@ -47,10 +46,9 @@ * and Cookie of the decommissioned bookie should be deleted from metadata * server. */ +@CustomLog public class DecommissionCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(DecommissionCommand.class); - private static final String NAME = "decommission"; private static final String DESC = "Force trigger the Audittask and make sure all the ledgers stored in the decommissioning bookie" @@ -95,26 +93,30 @@ private boolean decommission(ServerConfiguration conf, DecommissionFlags flags) ? BookieImpl.getBookieId(conf) : BookieId.parse(remoteBookieidToDecommission)); admin.decommissionBookie(bookieAddressToDecommission); - LOG.info("The ledgers stored in the given decommissioning bookie: {} are properly replicated", - bookieAddressToDecommission); + log.info() + .attr("bookieAddressToDecommission", bookieAddressToDecommission) + .log("The ledgers stored in the given decommissioning bookie: are properly replicated"); runFunctionWithRegistrationManager(conf, rm -> { try { Versioned cookie = Cookie.readFromRegistrationManager(rm, bookieAddressToDecommission); cookie.getValue().deleteFromRegistrationManager(rm, bookieAddressToDecommission, cookie.getVersion()); } catch (BookieException.CookieNotFoundException nne) { - LOG.warn("No cookie to remove for the decommissioning bookie: {}, it could be deleted already", - bookieAddressToDecommission, nne); + log.warn() + .attr("bookieAddressToDecommission", bookieAddressToDecommission) + .exception(nne) + .log("No cookie to remove for the decommissioning bookie, it could be deleted already"); } catch (BookieException be) { throw new UncheckedExecutionException(be.getMessage(), be); } return true; }); - LOG.info("Cookie of the decommissioned bookie: {} is deleted successfully", - bookieAddressToDecommission); + log.info() + .attr("bookieAddressToDecommission", bookieAddressToDecommission) + .log("Cookie of the decommissioned bookie: is deleted successfully"); return true; } catch (Exception e) { - LOG.error("Received exception in DecommissionBookieCmd ", e); + log.error().exception(e).log("Received exception in DecommissionBookieCmd"); return false; } finally { if (admin != null) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/EndpointInfoCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/EndpointInfoCommand.java index 634eb8411ce..1cb7f062533 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/EndpointInfoCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/EndpointInfoCommand.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; import java.util.Collection; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException; @@ -33,16 +34,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Get endpoint information about a Bookie. */ +@CustomLog public class EndpointInfoCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(EndpointInfoCommand.class); - private static final String NAME = "endpointinfo"; private static final String DESC = "Get all end point information about a given bookie."; @@ -87,34 +85,43 @@ private boolean getEndpointInfo(ServerConfiguration conf, EndpointInfoFlags flag BookieId bookieId = BookieId.parse(bookieIdStr); Collection allBookies = admin.getAllBookies(); if (!allBookies.contains(bookieId)) { - LOG.info("Bookie {} does not exist, only {}", bookieId, allBookies); + log.info() + .attr("bookieId", bookieId) + .attr("allBookies", allBookies) + .log("Bookie does not exist, only"); return false; } BookieServiceInfo bookieServiceInfo = admin.getBookieServiceInfo(bookieId); - LOG.info("BookiedId: {}", bookieId); + log.info().attr("bookieId", bookieId).log("BookiedId"); if (!bookieServiceInfo.getProperties().isEmpty()) { - LOG.info("Properties"); + log.info("Properties"); bookieServiceInfo.getProperties().forEach((k, v) -> { - LOG.info("{} : {}", k, v); + log.info() + .attr("key", k) + .attr("value", v) + .log("property"); }); } if (!bookieServiceInfo.getEndpoints().isEmpty()) { bookieServiceInfo.getEndpoints().forEach(e -> { - LOG.info("Endpoint: {}", e.getId()); - LOG.info("Protocol: {}", e.getProtocol()); - LOG.info("Address: {} : {}", e.getHost(), e.getPort()); - LOG.info("Auth: {}", e.getAuth()); - LOG.info("Extensions: {}", e.getExtensions()); + log.info().attr("id", e.getId()).log("Endpoint"); + log.info().attr("protocol", e.getProtocol()).log("Protocol"); + log.info() + .attr("host", e.getHost()) + .attr("port", e.getPort()) + .log("Address"); + log.info().attr("auth", e.getAuth()).log("Auth"); + log.info().attr("extensions", e.getExtensions()).log("Extensions"); }); } else { - LOG.info("Bookie did not publish any endpoint info. Maybe it is down"); + log.info("Bookie did not publish any endpoint info. Maybe it is down"); return false; } return true; } catch (Exception e) { - LOG.error("Received exception in EndpointInfoCommand ", e); + log.error().exception(e).log("Received exception in EndpointInfoCommand"); return false; } finally { if (admin != null) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InfoCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InfoCommand.java index c00a2b1b4d9..fba1d4de9fb 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InfoCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InfoCommand.java @@ -23,6 +23,7 @@ import java.text.DecimalFormat; import java.util.Map; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.BookieInfoReader.BookieInfo; @@ -33,18 +34,15 @@ import org.apache.bookkeeper.tools.cli.helpers.CommandHelpers; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A bookie command to retrieve bookie info. */ +@CustomLog public class InfoCommand extends BookieCommand { private static final String NAME = "info"; private static final String DESC = "Retrieve bookie info such as free and total disk space."; - private static final Logger LOG = LoggerFactory.getLogger(InfoCommand.class); public InfoCommand() { super(CliSpec.newBuilder() @@ -67,7 +65,6 @@ String getReadable(long val) { return cnt > 0 ? "(" + df.format(d) + unit[cnt] + ")" : unit[cnt]; } - @Override public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { @@ -76,20 +73,25 @@ public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { try (BookKeeper bk = new BookKeeper(clientConf)) { Map map = bk.getBookieInfo(); if (map.size() == 0) { - LOG.info("Failed to retrieve bookie information from any of the bookies"); + log.info("Failed to retrieve bookie information from any of the bookies"); bk.close(); return true; } - LOG.info("Free disk space info:"); + log.info("Free disk space info:"); long totalFree = 0, total = 0; for (Map.Entry e : map.entrySet()) { BookieInfo bInfo = e.getValue(); BookieId bookieId = e.getKey(); - LOG.info("{}: \tFree: {}\tTotal: {}", - CommandHelpers.getBookieSocketAddrStringRepresentation(bookieId, bk.getBookieAddressResolver()), - bInfo.getFreeDiskSpace() + getReadable(bInfo.getFreeDiskSpace()), - bInfo.getTotalDiskSpace() + getReadable(bInfo.getTotalDiskSpace())); + log.info() + .attr("bookie", CommandHelpers + .getBookieSocketAddrStringRepresentation( + bookieId, bk.getBookieAddressResolver())) + .attr("free", bInfo.getFreeDiskSpace() + + getReadable(bInfo.getFreeDiskSpace())) + .attr("total", bInfo.getTotalDiskSpace() + + getReadable(bInfo.getTotalDiskSpace())) + .log("Free disk space info"); } // group by hostname @@ -105,8 +107,8 @@ public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { total += bookieInfo.getTotalDiskSpace(); } - LOG.info("Total free disk space in the cluster:\t{}", totalFree + getReadable(totalFree)); - LOG.info("Total disk capacity in the cluster:\t{}", total + getReadable(total)); + log.info().attr("free", totalFree + getReadable(totalFree)).log("Total free disk space in the cluster"); + log.info().attr("total", total + getReadable(total)).log("Total disk capacity in the cluster"); bk.close(); return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InstanceIdCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InstanceIdCommand.java index 6fd60e35f08..230c98a15a5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InstanceIdCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/InstanceIdCommand.java @@ -21,21 +21,19 @@ import static org.apache.bookkeeper.meta.MetadataDrivers.runFunctionWithRegistrationManager; import com.google.common.util.concurrent.UncheckedExecutionException; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to print instance id of the cluster. */ +@CustomLog public class InstanceIdCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(InstanceIdCommand.class); - private static final String NAME = "instanceid"; private static final String DESC = "Print the instanceid of the cluster"; @@ -53,8 +51,10 @@ public boolean apply(ServerConfiguration conf, CliFlags cmdFlags) { } catch (BookieException e) { throw new UncheckedExecutionException(e); } - LOG.info("Metadata Service Uri: {} InstanceId: {}", - conf.getMetadataServiceUriUnchecked(), readInstanceId); + log.info() + .attr("metadataServiceUriUnchecked", conf.getMetadataServiceUriUnchecked()) + .attr("readInstanceId", readInstanceId) + .log("Metadata Service Uri: InstanceId"); return null; }); } catch (Exception e) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ListBookiesCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ListBookiesCommand.java index dcbfd9c2e50..b0a02b8902a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ListBookiesCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/ListBookiesCommand.java @@ -25,6 +25,7 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Collection; import java.util.Set; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BookieAddressResolverDisabled; @@ -36,17 +37,15 @@ import org.apache.bookkeeper.tools.cli.helpers.DiscoveryCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to list available bookies. */ +@CustomLog public class ListBookiesCommand extends DiscoveryCommand { private static final String NAME = "list"; private static final String DESC = "List the bookies, which are running as either readwrite or readonly mode."; - private static final Logger LOG = LoggerFactory.getLogger(ListBookiesCommand.class); public ListBookiesCommand() { this(Flags.newFlags()); @@ -106,7 +105,7 @@ protected void run(RegistrationClient regClient, Flags flags, boolean bookieAddr regClient.getWritableBookies() ).getValue(); if (!bookies.isEmpty()) { - LOG.info("ReadWrite Bookies :"); + log.info("ReadWrite Bookies :"); printBookies(bookies, bookieAddressResolver); hasBookies = true; } @@ -116,7 +115,7 @@ protected void run(RegistrationClient regClient, Flags flags, boolean bookieAddr regClient.getReadOnlyBookies() ).getValue(); if (!bookies.isEmpty()) { - LOG.info("Readonly Bookies :"); + log.info("Readonly Bookies :"); printBookies(bookies, bookieAddressResolver); hasBookies = true; } @@ -126,19 +125,21 @@ protected void run(RegistrationClient regClient, Flags flags, boolean bookieAddr regClient.getAllBookies() ).getValue(); if (!bookies.isEmpty()) { - LOG.info("All Bookies :"); + log.info("All Bookies :"); printBookies(bookies, bookieAddressResolver); hasBookies = true; } } if (!hasBookies) { - LOG.error("No bookie exists!"); + log.error("No bookie exists!"); } } private static void printBookies(Collection bookies, BookieAddressResolver bookieAddressResolver) { for (BookieId b : bookies) { - LOG.info("{}", getBookieSocketAddrStringRepresentation(b, bookieAddressResolver)); + log.info() + .attr("bookieAddr", getBookieSocketAddrStringRepresentation(b, bookieAddressResolver)) + .log("bookie"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/NukeExistingClusterCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/NukeExistingClusterCommand.java index 4e46ccbeb8f..aa959e46a26 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/NukeExistingClusterCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/NukeExistingClusterCommand.java @@ -20,6 +20,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BookKeeperAdmin; @@ -27,16 +28,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Nuke bookkeeper metadata of existing cluster in zookeeper. */ +@CustomLog public class NukeExistingClusterCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(NukeExistingClusterCommand.class); - private static final String NAME = "nukeexistingcluster"; private static final String DESC = "Nuke bookkeeper cluster by deleting metadata."; @@ -79,7 +77,7 @@ public boolean apply(ServerConfiguration conf, NukeExistingClusterFlags cmdFlags * instanceid should be provided. */ if (cmdFlags.force == (cmdFlags.instandId != null)) { - LOG.error("Either force option or instanceid should be specified (but no both)"); + log.error("Either force option or instanceid should be specified (but no both)"); return false; } try { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/RecoverCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/RecoverCommand.java index 401d6a20630..eef30701e0c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/RecoverCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookies/RecoverCommand.java @@ -30,6 +30,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieException; @@ -47,16 +48,13 @@ import org.apache.bookkeeper.util.IOUtils; import org.apache.bookkeeper.versioning.Versioned; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to ledger data recovery for failed bookie. */ +@CustomLog public class RecoverCommand extends BookieCommand { - private static final Logger LOG = LoggerFactory.getLogger(RecoverCommand.class); - private static final String NAME = "recover"; private static final String DESC = "Recover the ledger data for failed bookie"; @@ -137,24 +135,24 @@ private boolean recover(ServerConfiguration conf, RecoverFlags flags) try { bookieAddrs.add(BookieId.parse(bookieStr)); } catch (IllegalArgumentException err) { - LOG.error("BookieSrcs has invalid bookie id format: {}", bookieStr); + log.error().attr("bookieStr", bookieStr).log("BookieSrcs has invalid bookie id format"); return false; } } if (!force) { - LOG.error("Bookies : {}", bookieAddrs); + log.error().attr("bookieAddrs", bookieAddrs).log("Bookies"); if (!IOUtils.confirmPrompt("Are you sure to recover them : (Y/N)")) { - LOG.error("Give up!"); + log.error("Give up!"); return false; } } - LOG.info("Constructing admin"); + log.info("Constructing admin"); conf.setReplicationRateByBytes(replicateRate); ClientConfiguration adminConf = new ClientConfiguration(conf); BookKeeperAdmin admin = newBookKeeperAdmin(adminConf); - LOG.info("Construct admin : {}", admin); + log.info().attr("admin", admin).log("Construct admin"); try { if (query) { return bkQuery(admin, bookieAddrs); @@ -172,19 +170,25 @@ private boolean bkQuery(BookKeeperAdmin bkAdmin, Set bookieAddrs) throws InterruptedException, BKException { SortedMap ledgersContainBookies = bkAdmin.getLedgersContainBookies(bookieAddrs); - LOG.error("NOTE: Bookies in inspection list are marked with '*'."); + log.error("NOTE: Bookies in inspection list are marked with '*'."); for (Map.Entry ledger : ledgersContainBookies.entrySet()) { - LOG.info("ledger {} : {}", ledger.getKey(), ledger.getValue().getState()); + log.info() + .attr("key", ledger.getKey()) + .attr("state", ledger.getValue().getState()) + .log("ledger"); Map numBookiesToReplacePerEnsemble = inspectLedger(ledger.getValue(), bookieAddrs); - LOG.info("summary: ["); + log.info("summary: ["); for (Map.Entry entry : numBookiesToReplacePerEnsemble.entrySet()) { - LOG.info("{}={}, ", entry.getKey(), entry.getValue()); + log.info() + .attr("key", entry.getKey()) + .attr("value", entry.getValue()) + .log("log entry"); } - LOG.info("]"); - LOG.info(""); + log.info("]"); + log.info(""); } - LOG.error("Done"); + log.error("Done"); return true; } @@ -193,19 +197,19 @@ private Map inspectLedger(LedgerMetadata metadata, Set for (Map.Entry> ensemble : metadata.getAllEnsembles().entrySet()) { List bookieList = ensemble.getValue(); - LOG.info("{}:\t", ensemble.getKey()); + log.info().attr("key", ensemble.getKey()).log("\t"); int numBookiesToReplace = 0; for (BookieId bookie : bookieList) { - LOG.info("{}", bookie.toString()); + log.info().attr("bookie", bookie.toString()).log("log entry"); if (bookiesToInspect.contains(bookie)) { - LOG.info("*"); + log.info("*"); ++numBookiesToReplace; } else { - LOG.info(" "); + log.info(" "); } - LOG.info(" "); + log.info(" "); } - LOG.info(""); + log.info(""); numBookiesToReplacePerEnsemble.put(ensemble.getKey(), numBookiesToReplace); } return numBookiesToReplacePerEnsemble; @@ -260,7 +264,10 @@ private void deleteCookie(RegistrationManager rm, BookieId bookieSrc) throws Boo Versioned cookie = Cookie.readFromRegistrationManager(rm, bookieSrc); cookie.getValue().deleteFromRegistrationManager(rm, bookieSrc, cookie.getVersion()); } catch (BookieException.CookieNotFoundException nne) { - LOG.warn("No cookie to remove for {} : ", bookieSrc, nne); + log.warn() + .attr("bookieSrc", bookieSrc) + .exception(nne) + .log("No cookie to remove"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/DeleteLedgerCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/DeleteLedgerCommand.java index f53b6650d9f..950201130c4 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/DeleteLedgerCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/DeleteLedgerCommand.java @@ -21,6 +21,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.IOException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException; @@ -32,18 +33,16 @@ import org.apache.bookkeeper.tools.framework.CliSpec; import org.apache.bookkeeper.util.IOUtils; import org.apache.bookkeeper.util.LedgerIdFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to delete a given ledger. */ +@CustomLog public class DeleteLedgerCommand extends BookieCommand { private static final String NAME = "delete"; private static final String DESC = "Delete a ledger."; private static final String DEFAULT = ""; - private static final Logger LOG = LoggerFactory.getLogger(DeleteLedgerCommand.class); private LedgerIdFormatter ledgerIdFormatter; @@ -104,7 +103,7 @@ private boolean deleteLedger(ServerConfiguration conf, DeleteLedgerFlags flags) throws IOException, BKException, InterruptedException { if (flags.ledgerId < 0) { - LOG.error("Ledger id error."); + log.error("Ledger id error."); return false; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java index 430c0dde21d..2dc6d88ea98 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java @@ -27,6 +27,7 @@ import java.nio.file.Files; import java.util.Optional; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.BKException.BKLedgerExistException; @@ -41,20 +42,18 @@ import org.apache.bookkeeper.util.LedgerIdFormatter; import org.apache.bookkeeper.versioning.LongVersion; import org.apache.bookkeeper.versioning.Versioned; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Print the metadata for a ledger. */ @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") +@CustomLog public class LedgerMetaDataCommand extends BookieCommand { private static final String NAME = "show"; private static final String DESC = "Print the metadata for a ledger, or optionally dump to a file."; private static final String DEFAULT = ""; private static final long DEFAULT_ID = -1L; - private static final Logger LOG = LoggerFactory.getLogger(LedgerMetaDataCommand.class); private LedgerMetadataSerDe serDe = new LedgerMetadataSerDe(); private LedgerIdFormatter ledgerIdFormatter; @@ -117,7 +116,7 @@ public boolean apply(ServerConfiguration conf, LedgerMetadataFlag cmdFlags) { private boolean handler(ServerConfiguration conf, LedgerMetadataFlag flag) throws MetadataException, ExecutionException { if (flag.ledgerId == DEFAULT_ID) { - LOG.error("Must specific a ledger id"); + log.error("Must specific a ledger id"); return false; } runFunctionWithLedgerManagerFactory(conf, mFactory -> { @@ -137,7 +136,7 @@ private boolean handler(ServerConfiguration conf, LedgerMetadataFlag flag) throw be; } m.writeLedgerMetadata(flag.ledgerId, md, new LongVersion(-1L)).join(); - LOG.info("successfully updated ledger metadata {}", flag.ledgerId); + log.info().attr("metadata", flag.ledgerId).log("successfully updated ledger metadata"); } } else { printLedgerMetadata(flag.ledgerId, m.readLedgerMetadata(flag.ledgerId).get().getValue(), true); @@ -151,9 +150,9 @@ private boolean handler(ServerConfiguration conf, LedgerMetadataFlag flag) } private void printLedgerMetadata(long ledgerId, LedgerMetadata md, boolean printMeta) { - LOG.info("ledgerID: {}", ledgerIdFormatter.formatLedgerId(ledgerId)); + log.info().attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)).log("ledgerID"); if (printMeta) { - LOG.info("{}", md.toString()); + log.info().attr("metadata", md.toString()).log("log entry"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index 3007c3b7d77..236d7319b0d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.Random; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.client.api.BookKeeper; @@ -40,17 +41,15 @@ import org.apache.bookkeeper.tools.cli.helpers.ClientCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A client command that simply tests if a cluster is healthy. */ +@CustomLog public class SimpleTestCommand extends ClientCommand { private static final String NAME = "simpletest"; private static final String DESC = "Simple test to create a ledger and write entries to it, then read it."; - private static final Logger LOG = LoggerFactory.getLogger(SimpleTestCommand.class); /** * Flags for simple test command. @@ -110,18 +109,22 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { .withPassword(new byte[0]) .execute())) { ledgerId = wh.getId(); - LOG.info("Ledger ID: {}", ledgerId); + log.info().attr("ledgerId", ledgerId).log("Ledger ID"); long lastReport = System.nanoTime(); for (int i = 0; i < flags.numEntries; i++) { wh.append(data); if (TimeUnit.SECONDS.convert(System.nanoTime() - lastReport, TimeUnit.NANOSECONDS) > 1) { - LOG.info("{} entries written", i); + log.info().attr("i", i).log("entries written"); lastReport = System.nanoTime(); } } lastEntryId = wh.getLastAddPushed(); - LOG.info("{} entries written to ledger {}. Last entry Id {}", flags.numEntries, ledgerId, lastEntryId); + log.info() + .attr("numEntries", flags.numEntries) + .attr("ledgerId", ledgerId) + .attr("lastEntryId", lastEntryId) + .log("Entries written to ledger"); if (lastEntryId != flags.numEntries - 1) { throw new IllegalStateException("Last entry id doesn't match the expected value"); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/AdminCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/AdminCommand.java index 7a755ac4806..1dbd2ff90d0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/AdminCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/AdminCommand.java @@ -29,6 +29,7 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.bookie.BookieException; @@ -46,16 +47,13 @@ import org.apache.bookkeeper.versioning.Version; import org.apache.bookkeeper.versioning.Versioned; import org.apache.commons.lang3.ArrayUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Command to update cookie. */ +@CustomLog public class AdminCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(AdminCommand.class); - private static final String NAME = "admin"; private static final String DESC = "Command to update cookie"; @@ -125,10 +123,10 @@ private boolean update(ServerConfiguration conf, AdminFlags flags) throws Except boolean useHostName = flags.hostname; if (flags.hostname || flags.ip) { if (!conf.getUseHostNameAsBookieID() && useHostName) { - LOG.error("Expects configuration useHostNameAsBookieID=true as the option value"); + log.error("Expects configuration useHostNameAsBookieID=true as the option value"); return false; } else if (conf.getUseHostNameAsBookieID() && !useHostName) { - LOG.error("Expects configuration useHostNameAsBookieID=false as the option value"); + log.error("Expects configuration useHostNameAsBookieID=false as the option value"); return false; } return updateBookieIdInCookie(conf, flags.hostname); @@ -140,7 +138,7 @@ private boolean update(ServerConfiguration conf, AdminFlags flags) throws Except } else if (flags.delete) { return listOrDeleteCookies(conf, true, flags.force); } else { - LOG.error("Invalid command !"); + log.error("Invalid command !"); usage(); return false; } @@ -158,8 +156,10 @@ private boolean updateBookieIdInCookie(ServerConfiguration bkConf, final boolean conf.setUseHostNameAsBookieID(!useHostname); oldCookie = Cookie.readFromRegistrationManager(rm, conf); } catch (BookieException.CookieNotFoundException nne) { - LOG.error("Either cookie already updated with UseHostNameAsBookieID={} or no cookie exists!", - useHostname, nne); + log.error() + .exception(nne) + .logf("Either cookie already updated with UseHostNameAsBookieID=%s or no cookie exists!", + useHostname); return false; } Cookie newCookie = Cookie.newBuilder(oldCookie.getValue()).setBookieId(newBookieId).build(); @@ -183,25 +183,29 @@ private boolean updateBookieIdInCookie(ServerConfiguration bkConf, final boolean oldCookie.getValue().deleteFromRegistrationManager(rm, conf, oldCookie.getVersion()); return true; } catch (BookieException.CookieNotFoundException nne) { - if (LOG.isDebugEnabled()) { - LOG.debug("Ignoring, cookie will be written to zookeeper"); - } + log.debug("Ignoring, cookie will be written to zookeeper"); } } else { // writes newcookie to local dirs for (File journalDirectory : journalDirectories) { newCookie.writeToDirectory(journalDirectory); - LOG.info("Updated cookie file present in journalDirectory {}", journalDirectory); + log.info() + .attr("journalDirectory", journalDirectory) + .log("Updated cookie file present in journalDirectory"); } for (File dir : ledgerDirectories) { newCookie.writeToDirectory(dir); } - LOG.info("Updated cookie file present in ledgerDirectories {}", (Object) ledgerDirectories); + log.info() + .attr("ledgerDirectories", (Object) ledgerDirectories) + .log("Updated cookie file present in ledgerDirectories"); if (ledgerDirectories != indexDirectories) { for (File dir : indexDirectories) { newCookie.writeToDirectory(dir); } - LOG.info("Updated cookie file present in indexDirectories {}", (Object) indexDirectories); + log.info() + .attr("indexDirectories", (Object) indexDirectories) + .log("Updated cookie file present in indexDirectories"); } } // writes newcookie to zookeeper @@ -213,7 +217,7 @@ private boolean updateBookieIdInCookie(ServerConfiguration bkConf, final boolean oldCookie.getValue().deleteFromRegistrationManager(rm, conf, oldCookie.getVersion()); return true; } catch (IOException | BookieException ioe) { - LOG.error("IOException during cookie updation!", ioe); + log.error().exception(ioe).log("IOException during cookie updation!"); return false; } }); @@ -245,7 +249,7 @@ private boolean expandStorage(ServerConfiguration bkConf) throws Exception { validation.checkCookies(dirs); return true; } catch (BookieException e) { - LOG.error("Exception while updating cookie for storage expansion", e); + log.error().exception(e).log("Exception while updating cookie for storage expansion"); return false; } }); @@ -280,23 +284,25 @@ private boolean listOrDeleteCookies(ServerConfiguration bkConf, boolean delete, if (confirm) { for (File verFile : allVersionFiles) { if (!verFile.delete()) { - LOG.error("Failed to delete Local cookie file {}. So aborting deletecookie of Bookie: {}", - verFile, bookieAddress); + log.error() + .attr("verFile", verFile) + .attr("bookieAddress", bookieAddress) + .log("Failed to delete Local cookie file, aborting deletecookie of Bookie"); return false; } } - LOG.info("Deleted Local Cookies of Bookie: {}", bookieAddress); + log.info().attr("bookieAddress", bookieAddress).log("Deleted Local Cookies of Bookie"); } else { - LOG.info("Skipping deleting local Cookies of Bookie: {}", bookieAddress); + log.info().attr("bookieAddress", bookieAddress).log("Skipping deleting local Cookies of Bookie"); } } else { - LOG.info("Listing local Cookie Files of Bookie: {}", bookieAddress); + log.info().attr("bookieAddress", bookieAddress).log("Listing local Cookie Files of Bookie"); for (File verFile : allVersionFiles) { - LOG.info(verFile.getCanonicalPath()); + log.info().attr("file", verFile.getCanonicalPath()).log("Cookie file"); } } } else { - LOG.info("No local cookies for Bookie: {}", bookieAddress); + log.info().attr("bookieAddress", bookieAddress).log("No local cookies for Bookie"); } return runFunctionWithRegistrationManager(bkConf, rm -> { @@ -305,7 +311,7 @@ private boolean listOrDeleteCookies(ServerConfiguration bkConf, boolean delete, try { cookie = Cookie.readFromRegistrationManager(rm, bookieAddress); } catch (BookieException.CookieNotFoundException nne) { - LOG.info("No cookie for {} in metadata store", bookieAddress); + log.info().attr("bookieAddress", bookieAddress).log("No cookie for in metadata store"); return true; } @@ -317,9 +323,13 @@ private boolean listOrDeleteCookies(ServerConfiguration bkConf, boolean delete, if (confirm) { cookie.getValue().deleteFromRegistrationManager(rm, bkConf, cookie.getVersion()); - LOG.info("Deleted Cookie from metadata store for Bookie: {}", bookieAddress); + log.info() + .attr("bookieAddress", bookieAddress) + .log("Deleted Cookie from metadata store for Bookie"); } else { - LOG.info("Skipping deleting cookie from metadata store for Bookie: {}", bookieAddress); + log.info() + .attr("bookieAddress", bookieAddress) + .log("Skipping deleting cookie from metadata store for Bookie"); } } } catch (BookieException | IOException e) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CookieCommand.java index 0bedb8f31bc..7fd31d9bbb0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CookieCommand.java @@ -28,7 +28,6 @@ import java.nio.file.NoSuchFileException; import java.nio.file.Paths; import java.util.concurrent.ExecutionException; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.common.net.ServiceURI; import org.apache.bookkeeper.conf.ServerConfiguration; import org.apache.bookkeeper.discover.RegistrationManager; @@ -46,7 +45,6 @@ /** * This is a mixin for cookie related commands to extends. */ -@Slf4j abstract class CookieCommand extends BKCommand { @@ -114,7 +112,6 @@ protected byte[] readCookieDataFromFile(String cookieFile) throws IOException { } } - protected abstract void apply(RegistrationManager rm, CookieFlagsT cmdFlags) throws Exception; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CreateCookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CreateCookieCommand.java index c2e63594d19..d347ee8bbe7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CreateCookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/CreateCookieCommand.java @@ -23,7 +23,6 @@ import java.io.PrintStream; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.CookieExistException; import org.apache.bookkeeper.discover.RegistrationManager; @@ -37,7 +36,6 @@ /** * A command that create cookie. */ -@Slf4j public class CreateCookieCommand extends CookieCommand { private static final String NAME = "create"; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/DeleteCookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/DeleteCookieCommand.java index d7ce7584e2c..37045a7ca36 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/DeleteCookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/DeleteCookieCommand.java @@ -22,7 +22,6 @@ import java.io.PrintStream; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.CookieNotFoundException; import org.apache.bookkeeper.discover.RegistrationManager; @@ -35,7 +34,6 @@ /** * A command that deletes cookie. */ -@Slf4j public class DeleteCookieCommand extends CookieCommand { private static final String NAME = "delete"; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GenerateCookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GenerateCookieCommand.java index 827078c0192..d47c3f41bde 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GenerateCookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GenerateCookieCommand.java @@ -24,7 +24,6 @@ import java.io.PrintStream; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.Cookie; import org.apache.bookkeeper.bookie.Cookie.Builder; import org.apache.bookkeeper.discover.RegistrationManager; @@ -37,7 +36,6 @@ /** * A command that generate cookie. */ -@Slf4j public class GenerateCookieCommand extends CookieCommand { private static final String NAME = "generate"; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GetCookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GetCookieCommand.java index 372dcf4a94b..80f2f2b13bd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GetCookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/GetCookieCommand.java @@ -22,7 +22,6 @@ import java.io.PrintStream; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.CookieNotFoundException; import org.apache.bookkeeper.bookie.Cookie; @@ -36,7 +35,6 @@ /** * A command that deletes cookie. */ -@Slf4j public class GetCookieCommand extends CookieCommand { private static final String NAME = "get"; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/UpdateCookieCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/UpdateCookieCommand.java index f1fe3db455a..305bfa817b2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/UpdateCookieCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/cookie/UpdateCookieCommand.java @@ -23,7 +23,6 @@ import java.io.PrintStream; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.bookie.BookieException; import org.apache.bookkeeper.bookie.BookieException.CookieNotFoundException; import org.apache.bookkeeper.discover.RegistrationManager; @@ -37,7 +36,6 @@ /** * A command that updates cookie. */ -@Slf4j public class UpdateCookieCommand extends CookieCommand { private static final String NAME = "update"; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/health/SwitchOfHealthCheckCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/health/SwitchOfHealthCheckCommand.java index fd7142590b7..c25329d7d69 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/health/SwitchOfHealthCheckCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/health/SwitchOfHealthCheckCommand.java @@ -21,6 +21,7 @@ import com.beust.jcommander.Parameter; import com.google.common.util.concurrent.UncheckedExecutionException; import java.util.concurrent.ExecutionException; +import lombok.CustomLog; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -29,18 +30,13 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand; import org.apache.bookkeeper.tools.framework.CliFlags; import org.apache.bookkeeper.tools.framework.CliSpec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - /** * Command to enable or disable health check in the cluster. */ +@CustomLog public class SwitchOfHealthCheckCommand extends BookieCommand { - static final Logger LOG = LoggerFactory.getLogger(SwitchOfHealthCheckCommand.class); - private static final String NAME = "switch"; private static final String DESC = "Enables or disables health check in the cluster. Default is enabled."; @@ -86,27 +82,27 @@ private boolean handler(ServerConfiguration conf, HealthCheckFlags flags) boolean isEnable = driver.isHealthCheckEnabled().get(); if (flags.status) { - LOG.info("EnableHealthCheck is " + (isEnable ? "enabled." : "disabled.")); + log.info().attr("status", isEnable ? "enabled" : "disabled").log("EnableHealthCheck status"); return null; } if (flags.enable) { if (isEnable) { - LOG.warn("HealthCheck already enabled. Doing nothing"); + log.warn("HealthCheck already enabled. Doing nothing"); } else { - LOG.info("Enable HealthCheck"); + log.info("Enable HealthCheck"); driver.enableHealthCheck().get(); } } else { if (!isEnable) { - LOG.warn("HealthCheck already disabled. Doing nothing"); + log.warn("HealthCheck already disabled. Doing nothing"); } else { - LOG.info("Disable HealthCheck"); + log.info("Disable HealthCheck"); driver.disableHealthCheck().get(); } } } catch (Exception e) { - LOG.error("exception", e); + log.error().exception(e).log("exception"); throw new UncheckedExecutionException(e); } return null; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DiskChecker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DiskChecker.java index 0cac7b80433..d8c79fca1b5 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DiskChecker.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/DiskChecker.java @@ -26,16 +26,14 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * Class that provides utility functions for checking disk problems. */ +@CustomLog public class DiskChecker { - private static final Logger LOG = LoggerFactory.getLogger(DiskChecker.class); - private float diskUsageThreshold; private float diskUsageWarnThreshold; @@ -151,15 +149,21 @@ float checkDiskFull(File dir) throws DiskOutOfSpaceException, DiskWarnThresholdE float free = (float) usableSpace / (float) totalSpace; float used = 1f - free; if (used > diskUsageThreshold) { - LOG.error("Space left on device {} : {}, Used space fraction: {} > threshold {}.", - dir, usableSpace, used, diskUsageThreshold); + log.error() + .attr("directory", dir) + .attr("usableSpace", usableSpace) + .attr("used", used).attr("threshold", diskUsageThreshold) + .log("Space left on device exceeds threshold"); throw new DiskOutOfSpaceException("Space left on device " + usableSpace + " Used space fraction:" + used + " > threshold " + diskUsageThreshold, used); } // Warn should be triggered only if disk usage threshold doesn't trigger first. if (used > diskUsageWarnThreshold) { - LOG.warn("Space left on device {} : {}, Used space fraction: {} > WarnThreshold {}.", - dir, usableSpace, used, diskUsageWarnThreshold); + log.warn() + .attr("directory", dir) + .attr("usableSpace", usableSpace) + .attr("used", used).attr("warnThreshold", diskUsageWarnThreshold) + .log("Space left on device exceeds warn threshold"); throw new DiskWarnThresholdException("Space left on device:" + usableSpace + " Used space fraction:" + used + " > WarnThreshold:" + diskUsageWarnThreshold, used); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EntryFormatter.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EntryFormatter.java index 4f2a3c393dd..939df5b6b60 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EntryFormatter.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EntryFormatter.java @@ -21,18 +21,16 @@ package org.apache.bookkeeper.util; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.ReflectionUtils; import org.apache.bookkeeper.conf.AbstractConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Formatter to format an entry. */ +@CustomLog public abstract class EntryFormatter { - private static final Logger LOG = LoggerFactory.getLogger(EntryFormatter.class); - /** * Format an entry into a readable format. * @@ -56,8 +54,8 @@ public static EntryFormatter newEntryFormatter(AbstractConfiguration conf) { Class entryFormatterClass = conf.getEntryFormatterClass(); formatter = ReflectionUtils.newInstance(entryFormatterClass); } catch (Exception e) { - LOG.warn("No formatter class found", e); - LOG.warn("Using Default String Formatter."); + log.warn().exception(e).log("No formatter class found"); + log.warn("Using Default String Formatter."); formatter = new StringEntryFormatter(); } return formatter; @@ -70,7 +68,7 @@ public static EntryFormatter newEntryFormatter(String opt, AbstractConfiguration } else if ("string".equals(opt)) { formatter = new StringEntryFormatter(); } else { - LOG.warn("specified unexpected entryformat {}, so default EntryFormatter is used", opt); + log.warn().attr("format", opt).log("specified unexpected entryformat, so default EntryFormatter is used"); formatter = newEntryFormatter(conf); } return formatter; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EventLoopUtil.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EventLoopUtil.java index 6e960eeb6e1..5c39cbb2277 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EventLoopUtil.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/EventLoopUtil.java @@ -25,8 +25,8 @@ import io.netty.channel.uring.IoUring; import io.netty.channel.uring.IoUringIoHandler; import java.util.concurrent.ThreadFactory; +import lombok.CustomLog; import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.common.util.affinity.CpuAffinity; import org.apache.bookkeeper.conf.ClientConfiguration; import org.apache.bookkeeper.conf.ServerConfiguration; @@ -37,7 +37,7 @@ /** * Utility class to initialize Netty event loops. */ -@Slf4j +@CustomLog @UtilityClass public class EventLoopUtil { @@ -87,15 +87,17 @@ private static EventLoopGroup getEventLoopGroup(ThreadFactory threadFactory, try { CpuAffinity.acquireCore(); } catch (Throwable t) { - log.warn("Failed to acquire CPU core for thread {} err {} {}", - Thread.currentThread().getName(), t.getMessage(), t); + log.warn() + .attr("thread", Thread.currentThread().getName()) + .exception(t) + .log("Failed to acquire CPU core for thread"); } }); } return eventLoopGroup; } catch (ExceptionInInitializerError | NoClassDefFoundError | UnsatisfiedLinkError e) { - log.warn("Could not use Netty Epoll event loop: {}", e.getMessage()); + log.warn().exceptionMessage(e).log("Could not use Netty Epoll event loop"); return new NioEventLoopGroup(numThreads, threadFactory); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/HardLink.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/HardLink.java index 1d3a3645921..91cbe641e68 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/HardLink.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/HardLink.java @@ -32,8 +32,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.CustomLog; /** * Class for creating hardlinks. @@ -47,8 +46,8 @@ * directory with a single command, which is up to 128 times more * efficient - and minimizes the impact of the extra buffer creations. */ +@CustomLog public class HardLink { - private static final Logger LOG = LoggerFactory.getLogger(HardLink.class); /** * OS Types. */ @@ -438,10 +437,10 @@ public static void createHardLink(File file, File linkName) return; } } catch (UnsupportedOperationException e) { - LOG.error("createLink not supported", e); + log.error().exception(e).log("createLink not supported"); CREATE_LINK_SUPPORTED.set(false); } catch (IOException e) { - LOG.error("error when create hard link use createLink", e); + log.error().exception(e).log("error when create hard link use createLink"); CREATE_LINK_SUPPORTED.set(false); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/IOUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/IOUtils.java index c003fdf325c..1046e404b36 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/IOUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/IOUtils.java @@ -24,7 +24,6 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; -import org.slf4j.Logger; /** * An utility class for I/O related functionality. @@ -40,7 +39,7 @@ public class IOUtils { * @param closeables * the objects to close */ - public static void close(Logger log, java.io.Closeable... closeables) { + public static void close(io.github.merlimat.slog.Logger log, java.io.Closeable... closeables) { for (java.io.Closeable c : closeables) { close(log, c); } @@ -55,7 +54,47 @@ public static void close(Logger log, java.io.Closeable... closeables) { * @param closeable * the objects to close */ - public static void close(Logger log, java.io.Closeable closeable) { + public static void close(io.github.merlimat.slog.Logger log, java.io.Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + if (log != null) { + log.debug().exception(e).attr("closeable", closeable).log("Exception in closing"); + } + } + } + } + + /** + * Close the Closeable objects and ignore any {@link IOException} or + * null pointers. Must only be used for cleanup in exception handlers. + * + *

SLF4J overload kept for transition during the slog migration. + * + * @param log + * the log to record problems to at debug level. Can be null. + * @param closeables + * the objects to close + */ + public static void close(org.slf4j.Logger log, java.io.Closeable... closeables) { + for (java.io.Closeable c : closeables) { + close(log, c); + } + } + + /** + * Close the Closeable object and ignore any {@link IOException} or + * null pointers. Must only be used for cleanup in exception handlers. + * + *

SLF4J overload kept for transition during the slog migration. + * + * @param log + * the log to record problems to at debug level. Can be null. + * @param closeable + * the objects to close + */ + public static void close(org.slf4j.Logger log, java.io.Closeable closeable) { if (closeable != null) { try { closeable.close(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LedgerIdFormatter.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LedgerIdFormatter.java index 77c17946d6b..77f3074965d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LedgerIdFormatter.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LedgerIdFormatter.java @@ -22,18 +22,16 @@ package org.apache.bookkeeper.util; import java.util.UUID; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.ReflectionUtils; import org.apache.bookkeeper.conf.AbstractConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Formatter to format a ledgerId. */ +@CustomLog public abstract class LedgerIdFormatter { - private static final Logger LOG = LoggerFactory.getLogger(LedgerIdFormatter.class); - /** * Formats the LedgerId according to the type of the Formatter and return it * in String format. @@ -61,8 +59,8 @@ public static LedgerIdFormatter newLedgerIdFormatter(AbstractConfiguration co Class ledgerIdFormatterClass = conf.getLedgerIdFormatterClass(); formatter = ReflectionUtils.newInstance(ledgerIdFormatterClass); } catch (Exception e) { - LOG.warn("No formatter class found", e); - LOG.warn("Using Default Long Formatter."); + log.warn().exception(e).log("No formatter class found"); + log.warn("Using Default Long Formatter."); formatter = new LongLedgerIdFormatter(); } return formatter; @@ -77,7 +75,9 @@ public static LedgerIdFormatter newLedgerIdFormatter(String opt, AbstractConfigu } else if ("long".equals(opt)) { formatter = new LedgerIdFormatter.LongLedgerIdFormatter(); } else { - LOG.warn("specified unexpected ledgeridformat {}, so default LedgerIdFormatter is used", opt); + log.warn() + .attr("format", opt) + .log("specified unexpected ledgeridformat, so default LedgerIdFormatter is used"); formatter = newLedgerIdFormatter(conf); } return formatter; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java index 0c793eb4e51..d0645d7d005 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/LocalBookKeeper.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; +import lombok.CustomLog; import org.apache.bookkeeper.bookie.Bookie; import org.apache.bookkeeper.bookie.BookieImpl; import org.apache.bookkeeper.bookie.BookieResources; @@ -66,14 +67,12 @@ import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.Op; import org.apache.zookeeper.ZooDefs.Ids; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Local Bookkeeper. */ +@CustomLog public class LocalBookKeeper implements AutoCloseable { - protected static final Logger LOG = LoggerFactory.getLogger(LocalBookKeeper.class); public static final int CONNECTION_TIMEOUT = 30000; private static String newMetadataServiceUri(String zkServers, int port, String layout, String ledgerPath) { @@ -97,8 +96,9 @@ public LocalBookKeeper( this.zkHost = zkHost; this.zkPort = zkPort; this.dirsToCleanUp = new ArrayList<>(); - LOG.info("Running {} bookie(s) on zk ensemble = '{}:{}'.", this.numberOfBookies, - zooKeeperDefaultHost, zooKeeperDefaultPort); + log.info().attr("numberOfBookies", this.numberOfBookies) + .attr("zkHost", zooKeeperDefaultHost).attr("zkPort", zooKeeperDefaultPort) + .log("Running bookies on zk ensemble"); } private static String zooKeeperDefaultHost = "127.0.0.1"; @@ -130,20 +130,18 @@ public static ZooKeeperServerShim runZookeeper(int maxCC, int zookeeperPort) thr } public static ZooKeeperServerShim runZookeeper(int maxCC, int zookeeperPort, File zkDir) throws IOException { - LOG.info("Starting ZK server"); + log.info("Starting ZK server"); ZooKeeperServerShim server = ZooKeeperServerShimFactory.createServer(zkDir, zkDir, zookeeperPort, maxCC); server.start(); boolean b = waitForServerUp(InetAddress.getLoopbackAddress().getHostAddress() + ":" + zookeeperPort, CONNECTION_TIMEOUT); - if (LOG.isDebugEnabled()) { - LOG.debug("ZooKeeper server up: {}", b); - } + log.debug().attr("serverUp", b).log("ZooKeeper server up"); return server; } private void initializeZookeeper() throws IOException { - LOG.info("Instantiate ZK Client"); + log.info("Instantiate ZK Client"); //initialize the zk client with values try (ZooKeeperClient zkc = ZooKeeperClient.newBuilder() .connectString(zkHost + ":" + zkPort) @@ -163,11 +161,11 @@ private void initializeZookeeper() throws IOException { // No need to create an entry for each requested bookie anymore as the // BookieServers will register themselves with ZooKeeper on startup. } catch (KeeperException e) { - LOG.error("Exception while creating znodes", e); + log.error().exception(e).log("Exception while creating znodes"); throw new IOException("Error creating znodes : ", e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - LOG.error("Interrupted while creating znodes", e); + log.error().exception(e).log("Interrupted while creating znodes"); throw new IOException("Error creating znodes : ", e); } } @@ -180,7 +178,7 @@ private static void cleanupDirectories(List dirs) throws IOException { private void runBookies() throws Exception { - LOG.info("Starting Bookie(s)"); + log.info("Starting Bookie(s)"); // Create Bookie Servers (B1, B2, B3) if (localBookiesConfigDir.exists() && localBookiesConfigDir.isFile()) { @@ -378,7 +376,7 @@ public static void main(String[] args) { try { numBookies = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { - LOG.error("Unrecognized number-of-bookies: {}", args[0]); + log.error().attr("numBookies", args[0]).log("Unrecognized number-of-bookies"); usage(); System.exit(-1); } @@ -389,10 +387,13 @@ public static void main(String[] args) { String confFile = args[1]; try { conf.loadConf(new File(confFile).toURI().toURL()); - LOG.info("Using configuration file {}", confFile); + log.info().attr("confFile", confFile).log("Using configuration file"); } catch (Exception e) { // load conf failed - LOG.warn("Error loading configuration file {}", confFile, e); + log.warn() + .attr("confFile", confFile) + .exception(e) + .log("Error loading configuration file"); } } @@ -420,7 +421,7 @@ public static void main(String[] args) { } } } catch (Exception e) { - LOG.error("Exiting LocalBookKeeper because of exception in main method", e); + log.error().exception(e).log("Exiting LocalBookKeeper because of exception in main method"); /* * This is needed because, some non-daemon thread (probably in ZK or * some other dependent service) is preventing the JVM from exiting, though @@ -450,12 +451,15 @@ public static boolean waitForServerUp(String hp, long timeout) { String line = reader.readLine(); if (line != null && line.startsWith("Zookeeper version:")) { - LOG.info("Server UP"); + log.info("Server UP"); return true; } } catch (IOException e) { // ignore as this is expected - LOG.info("server " + hp + " not up " + e); + log.info() + .attr("server", hp) + .exception(e) + .log("Server not up"); } if (System.currentTimeMillis() > start + timeout) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedGenericCallback.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedGenericCallback.java index 3d128480019..9c503ae807a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedGenericCallback.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedGenericCallback.java @@ -19,19 +19,18 @@ import java.util.Map; import java.util.concurrent.RejectedExecutionException; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MdcUtils; import org.apache.bookkeeper.common.util.OrderedExecutor; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.slf4j.MDC; /** * Generic callback implementation which will run the * callback in the thread which matches the ordering key. */ +@CustomLog public abstract class OrderedGenericCallback implements GenericCallback { - private static final Logger LOG = LoggerFactory.getLogger(OrderedGenericCallback.class); private final OrderedExecutor executor; private final long orderingKey; @@ -74,7 +73,10 @@ public String toString() { } }); } catch (RejectedExecutionException re) { - LOG.warn("Failed to submit callback for {} : ", orderingKey, re); + log.warn() + .attr("orderingKey", orderingKey) + .exception(re) + .log("Failed to submit callback"); } } } finally { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/PageCacheUtil.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/PageCacheUtil.java index 08bf9cfb385..94baedf3544 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/PageCacheUtil.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/PageCacheUtil.java @@ -20,8 +20,8 @@ import java.io.FileDescriptor; import java.lang.reflect.Field; +import lombok.CustomLog; import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.common.util.nativeio.NativeIO; import org.apache.bookkeeper.common.util.nativeio.NativeIOImpl; @@ -29,7 +29,7 @@ * Native I/O operations. */ @UtilityClass -@Slf4j +@CustomLog public final class PageCacheUtil { private static final int POSIX_FADV_DONTNEED = 4; /* fadvise.h */ @@ -43,7 +43,7 @@ public final class PageCacheUtil { try { nativeIO = new NativeIOImpl(); } catch (Exception e) { - log.warn("Unable to initialize NativeIO for posix_fdavise: {}", e.getMessage()); + log.warn().exceptionMessage(e).log("Unable to initialize NativeIO for posix_fadvise"); fadvisePossible = false; } @@ -59,7 +59,10 @@ private static Field getFieldByReflection(Class cls, String fieldName) { } catch (Exception e) { // We don't really expect this so throw an assertion to // catch this during development - log.warn("Unable to read {} field from {}", fieldName, cls.getName()); + log.warn() + .attr("fieldName", fieldName) + .attr("className", cls.getName()) + .log("Unable to read field from class"); assert false; } @@ -96,7 +99,7 @@ public static void bestEffortRemoveFromPageCache(int fd, long offset, long len) try { NATIVE_IO.posix_fadvise(fd, offset, len, POSIX_FADV_DONTNEED); } catch (Throwable e) { - log.warn("Failed to perform posix_fadvise: {}", e.getMessage()); + log.warn().exceptionMessage(e).log("Failed to perform posix_fadvise"); fadvisePossible = false; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/SubTreeCache.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/SubTreeCache.java index aefb97a4add..a00829d8672 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/SubTreeCache.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/SubTreeCache.java @@ -27,11 +27,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import lombok.CustomLog; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Caching layer for traversing and monitoring changes on a znode subtree. @@ -51,8 +50,8 @@ *

Finally, we'll allow (require, even) the user to cancel a registered watcher * once no longer interested. */ +@CustomLog public class SubTreeCache { - private static final Logger LOG = LoggerFactory.getLogger(SubTreeCache.class); /** * A tree provider. diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/ZkUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/ZkUtils.java index 48ea04a3f4d..1c28b3090b1 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/ZkUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/ZkUtils.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; +import lombok.CustomLog; import org.apache.bookkeeper.conf.AbstractConfiguration; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.zookeeper.AsyncCallback; @@ -37,14 +38,12 @@ import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provided utilities for zookeeper access, etc. */ +@CustomLog public class ZkUtils { - private static final Logger LOG = LoggerFactory.getLogger(ZkUtils.class); /** * Asynchronously create zookeeper path recursively and optimistically. @@ -287,8 +286,8 @@ public static void getChildrenInSingleNode(final ZooKeeper zk, final String node @Override public void processResult(int rc, String path, Object ctx) { if (rc != Code.OK.intValue()) { - LOG.error("ZK error syncing nodes when getting children: ", KeeperException - .create(KeeperException.Code.get(rc), path)); + log.error().exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("ZK error syncing nodes when getting children"); cb.operationComplete(rc, null); return; } @@ -296,8 +295,8 @@ public void processResult(int rc, String path, Object ctx) { @Override public void processResult(int rc, String path, Object ctx, List nodes) { if (rc != Code.OK.intValue()) { - LOG.error("Error polling ZK for the available nodes: ", KeeperException - .create(KeeperException.Code.get(rc), path)); + log.error().exception(KeeperException.create(KeeperException.Code.get(rc), path)) + .log("Error polling ZK for the available nodes"); cb.operationComplete(rc, null); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/CustomZooKeeperHostProvider.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/CustomZooKeeperHostProvider.java index 7fa822b1fbc..f62a538c0ed 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/CustomZooKeeperHostProvider.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/CustomZooKeeperHostProvider.java @@ -31,19 +31,18 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import lombok.CustomLog; import org.apache.zookeeper.client.ConnectStringParser; import org.apache.zookeeper.client.HostProvider; import org.apache.zookeeper.client.StaticHostProvider; import org.apache.zookeeper.client.StaticHostProvider.Resolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ZooKeeper HostProvider with a workaround for https://issues.apache.org/jira/browse/ZOOKEEPER-3825. * Based on ZooKeeper's StaticHostProvider */ +@CustomLog public final class CustomZooKeeperHostProvider implements HostProvider { - private static final Logger LOG = LoggerFactory.getLogger(CustomZooKeeperHostProvider.class); private List serverAddresses = new ArrayList<>(5); @@ -136,7 +135,10 @@ private InetSocketAddress resolve(InetSocketAddress address) { Collections.shuffle(resolvedAddresses); return new InetSocketAddress(resolvedAddresses.get(0), address.getPort()); } catch (UnknownHostException e) { - LOG.error("Unable to resolve address: {}", address.toString(), e); + log.error() + .attr("address", address.toString()) + .exception(e) + .log("Unable to resolve address"); return address; } } @@ -398,7 +400,7 @@ public InetSocketAddress next(long spinDelay) { try { Thread.sleep(spinDelay); } catch (InterruptedException e) { - LOG.warn("Unexpected exception", e); + log.warn().exception(e).log("Unexpected exception"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ExponentialBackOffWithDeadlinePolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ExponentialBackOffWithDeadlinePolicy.java index 0cc6ad95e2c..c47a8a73d38 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ExponentialBackOffWithDeadlinePolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ExponentialBackOffWithDeadlinePolicy.java @@ -22,14 +22,14 @@ import java.util.Arrays; import java.util.Random; -import lombok.extern.slf4j.Slf4j; +import lombok.CustomLog; /** * Backoff time determined based as a multiple of baseBackoffTime. * The multiple value depends on retryCount. * If the retry schedule exceeds the deadline, we schedule a final attempt exactly at the deadline. */ -@Slf4j +@CustomLog public class ExponentialBackOffWithDeadlinePolicy implements RetryPolicy { static final int [] RETRY_BACKOFF = {0, 1, 2, 3, 5, 5, 5, 10, 10, 10, 20, 40, 100}; @@ -63,8 +63,11 @@ public long nextRetryWaitTime(int retryCount, long elapsedRetryTime) { long jitter = (random.nextInt(JITTER_PERCENT) * waitTime / 100); if (elapsedRetryTime + waitTime + jitter > deadline) { - log.warn("Final retry attempt: {}, timeleft: {}, stacktrace: {}", - retryCount, (deadline - elapsedRetryTime), Arrays.toString(Thread.currentThread().getStackTrace())); + log.warn() + .attr("retryCount", retryCount) + .attr("timeLeft", deadline - elapsedRetryTime) + .attr("stacktrace", Arrays.toString(Thread.currentThread().getStackTrace())) + .log("Final retry attempt"); return deadline - elapsedRetryTime; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperClient.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperClient.java index 3197d8b363e..4de84b9fc96 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperClient.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperClient.java @@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import lombok.CustomLog; import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; @@ -61,16 +62,13 @@ import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provide a zookeeper client to handle session expire. */ +@CustomLog public class ZooKeeperClient extends ZooKeeper implements Watcher, AutoCloseable { - private static final Logger logger = LoggerFactory.getLogger(ZooKeeperClient.class); - private static final int DEFAULT_RETRY_EXECUTOR_THREAD_COUNT = 1; // ZooKeeper client connection variables @@ -115,20 +113,23 @@ public ZooKeeper call() throws Exception { @Override public ZooKeeper call() throws KeeperException, InterruptedException { - logger.info("Reconnecting zookeeper {}.", connectString); + log.info().attr("connectString", connectString).log("Reconnecting zookeeper"); // close the previous one closeZkHandle(); ZooKeeper newZk; try { newZk = createZooKeeper(); } catch (IOException ie) { - logger.error("Failed to create zookeeper instance to " + connectString, ie); + log.error() + .attr("connectString", connectString) + .exception(ie) + .log("Failed to create zookeeper instance"); throw KeeperException.create(KeeperException.Code.CONNECTIONLOSS); } waitForConnection(); zk.set(newZk); - logger.info("ZooKeeper session {} is created to {}.", - Long.toHexString(newZk.getSessionId()), connectString); + log.info().attr("sessionId", Long.toHexString(newZk.getSessionId())) + .attr("connectString", connectString).log("ZooKeeper session is created"); return newZk; } @@ -139,7 +140,7 @@ public String toString() { }, connectRetryPolicy, rateLimiter, createClientStats); } catch (Exception e) { - logger.error("Gave up reconnecting to ZooKeeper : ", e); + log.error().exception(e).log("Gave up reconnecting to ZooKeeper"); Runtime.getRuntime().exit(-1); return null; } @@ -355,16 +356,16 @@ private void onExpired() { return; } - logger.info("ZooKeeper session {} is expired from {}.", - Long.toHexString(getSessionId()), connectString); + log.info().attr("sessionId", Long.toHexString(getSessionId())) + .attr("connectString", connectString).log("ZooKeeper session is expired"); try { connectExecutor.submit(clientCreator); } catch (RejectedExecutionException ree) { if (!closed.get()) { - logger.error("ZooKeeper reconnect task is rejected : ", ree); + log.error().exception(ree).log("ZooKeeper reconnect task is rejected"); } } catch (Exception t) { - logger.error("Failed to submit zookeeper reconnect task due to runtime exception : ", t); + log.error().exception(t).log("Failed to submit zookeeper reconnect task due to runtime exception"); } } @@ -440,7 +441,10 @@ private void backOffAndRetry(Runnable r, long nextRetryWaitTimeMs) { retryExecutor.schedule(r, nextRetryWaitTimeMs, TimeUnit.MILLISECONDS); } catch (RejectedExecutionException ree) { if (!closed.get()) { - logger.error("ZooKeeper Operation {} is rejected : ", r, ree); + log.error() + .attr("operation", r) + .exception(ree) + .log("ZooKeeper Operation is rejected"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java index e44a5f364cd..eee35f5eb7a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java @@ -26,6 +26,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.stats.Counter; import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.stats.StatsLogger; @@ -33,15 +34,12 @@ import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Watcher for receiving zookeeper server connection events. */ +@CustomLog public class ZooKeeperWatcherBase implements Watcher { - private static final Logger LOG = LoggerFactory - .getLogger(ZooKeeperWatcherBase.class); private final int zkSessionTimeOut; private final boolean allowReadOnlyMode; @@ -114,40 +112,39 @@ public Counter getStateCounter(Event.KeeperState state) { public void process(WatchedEvent event) { // If event type is NONE, this is a connection status change if (event.getType() != EventType.None) { - if (LOG.isDebugEnabled()) { - LOG.debug("Received event: {}, path: {} from ZooKeeper server", event.getType(), event.getPath()); - } + log.debug() + .attr("eventType", event.getType()) + .attr("path", event.getPath()) + .log("Received event from ZooKeeper server"); getEventCounter(event.getType()).inc(); // notify the child watchers notifyEvent(event); return; } getStateCounter(event.getState()).inc(); - if (LOG.isDebugEnabled()) { - LOG.debug("Received {} from ZooKeeper server", event.getState()); - } + log.debug().attr("state", event.getState()).log("Received state from ZooKeeper server"); // TODO: Needs to handle AuthFailed, SaslAuthenticated events // {@link https://github.com/apache/bookkeeper/issues/284} switch (event.getState()) { case SyncConnected: - LOG.info("ZooKeeper client is connected now."); + log.info("ZooKeeper client is connected now."); clientConnectLatch.countDown(); break; case ConnectedReadOnly: if (allowReadOnlyMode) { - LOG.info("ZooKeeper client is connected in read-only mode now."); + log.info("ZooKeeper client is connected in read-only mode now."); clientConnectLatch.countDown(); } else { - LOG.warn("ZooKeeper client is connected in read-only mode, which is not allowed."); + log.warn("ZooKeeper client is connected in read-only mode, which is not allowed."); } break; case Disconnected: - LOG.info("ZooKeeper client is disconnected from zookeeper now," + log.info("ZooKeeper client is disconnected from zookeeper now," + " but it is OK unless we received EXPIRED event."); break; case Expired: clientConnectLatch = new CountDownLatch(1); - LOG.error("ZooKeeper client connection to the ZooKeeper server has expired!"); + log.error("ZooKeeper client connection to the ZooKeeper server has expired!"); break; default: // do nothing @@ -190,7 +187,10 @@ private void notifyEvent(WatchedEvent event) { try { w.process(event); } catch (Exception t) { - LOG.warn("Encountered unexpected exception from watcher {} : ", w, t); + log.warn() + .attr("watcher", w) + .exception(t) + .log("Encountered unexpected exception from watcher"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooWorker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooWorker.java index 48cd902ccc2..99da06c08f7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooWorker.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooWorker.java @@ -23,20 +23,18 @@ import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; +import lombok.CustomLog; import org.apache.bookkeeper.common.util.MathUtils; import org.apache.bookkeeper.stats.OpStatsLogger; import org.apache.zookeeper.KeeperException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Provide a mechanism to perform an operation on ZooKeeper that is safe on disconnections * and recoverable errors. */ +@CustomLog class ZooWorker { - private static final Logger logger = LoggerFactory.getLogger(ZooWorker.class); - int attempts = 0; long startTimeNanos; long elapsedTimeMs = 0L; @@ -133,7 +131,10 @@ public static T syncCallWithRetries(ZooKeeperClient client, if (null != client) { client.waitForConnection(); } - logger.debug("Execute {} at {} retry attempt.", proc, attempts); + log.debug() + .attr("proc", proc) + .attr("attempts", attempts) + .log("Execute at retry attempt"); if (null != rateLimiter) { rateLimiter.acquire(); } @@ -150,7 +151,10 @@ public static T syncCallWithRetries(ZooKeeperClient client, } if (rethrow) { statsLogger.registerFailedEvent(MathUtils.elapsedMicroSec(startTimeNanos), TimeUnit.MICROSECONDS); - logger.debug("Stopped executing {} after {} attempts.", proc, attempts); + log.debug() + .attr("proc", proc) + .attr("attempts", attempts) + .log("Stopped executing after attempts"); throw e; } TimeUnit.MILLISECONDS.sleep(retryPolicy.nextRetryWaitTime(attempts, elapsedTime)); diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBackwardCompatCMS42.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBackwardCompatCMS42.java index 1edd74c1fc6..0c03eca7ecf 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBackwardCompatCMS42.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/TestBackwardCompatCMS42.java @@ -49,12 +49,16 @@ import org.apache.bookkeeper.stats.NullStatsLogger; import org.apache.bookkeeper.test.BookKeeperClusterTestCase; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Test backward compatibility. */ public class TestBackwardCompatCMS42 extends BookKeeperClusterTestCase { + private static final Logger LOG = LoggerFactory.getLogger(TestBackwardCompatCMS42.class); + private static final byte[] SUCCESS_RESPONSE = {1}; private static final byte[] FAILURE_RESPONSE = {2}; private static final byte[] PAYLOAD_MESSAGE = {3}; From 265aeebfab1dc05390b870dcb6f9c393052885c7 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Fri, 24 Apr 2026 21:20:46 -0700 Subject: [PATCH 3/5] Bump slog dependency to 0.9.8 Also includes a few follow-ups now that 0.9.8 is in use: - Wrap method-call attr values in Supplier for lazy evaluation on debug/ trace log calls that were originally guarded by isXxxEnabled. The fluent slog form would otherwise eagerly evaluate the attr arguments even when the level is disabled. - Simplify the response promise in PacketProcessorBase: always attach a ChannelFutureListener (the listener body itself uses log.debug() and is cheap when debug is off) rather than the side-effecting lambda. Mock newPromise() with RETURNS_SELF in ReadEntryProcessorTest so the chained .addListener() returns the same mock. - Update MdcContextTest assertions for the new bare slog messages (ledgerId / entryId / firstEntry / lastEntry are now structured attrs rather than baked into the message string). With the slog 0.9.8 fix, MDC propagates through the log4j2 backend and the test verifies that. --- .../src/main/resources/LICENSE-all.bin.txt | 4 ++-- .../src/main/resources/LICENSE-bkctl.bin.txt | 4 ++-- .../src/main/resources/LICENSE-server.bin.txt | 4 ++-- .../org/apache/bookkeeper/bookie/BookieShell.java | 4 ++-- .../bookkeeper/bookie/EntryLogManagerBase.java | 2 +- .../EntryLogManagerForEntryLogPerLedger.java | 2 +- .../bookkeeper/bookie/GarbageCollectorThread.java | 6 +++--- .../bookkeeper/bookie/IndexPersistenceMgr.java | 4 ++-- .../bookie/InterleavedLedgerStorage.java | 8 ++++---- .../java/org/apache/bookkeeper/bookie/Journal.java | 4 ++-- .../bookkeeper/bookie/LedgerDescriptorImpl.java | 2 +- .../bookkeeper/bookie/LedgerDirsMonitor.java | 2 +- .../ldb/SingleDirectoryDbLedgerStorage.java | 2 +- .../apache/bookkeeper/client/BookKeeperAdmin.java | 2 +- .../apache/bookkeeper/client/BookieInfoReader.java | 10 +++++----- .../apache/bookkeeper/client/EnsembleUtils.java | 6 +++--- .../bookkeeper/client/ExplicitLacFlushPolicy.java | 14 +++++++------- .../org/apache/bookkeeper/client/LedgerHandle.java | 8 ++++---- .../bookkeeper/client/MetadataUpdateLoop.java | 2 +- .../org/apache/bookkeeper/client/PendingAddOp.java | 4 ++-- .../RackawareEnsemblePlacementPolicyImpl.java | 9 +++++---- .../client/ReadLastConfirmedAndEntryOp.java | 10 +++++----- .../bookkeeper/client/SyncCallbackUtils.java | 2 +- .../bookkeeper/client/TryReadLastConfirmedOp.java | 4 ++-- .../client/WeightedRandomSelectionImpl.java | 10 +++++----- .../ZoneawareEnsemblePlacementPolicyImpl.java | 6 +++--- .../bookkeeper/meta/AbstractZkLedgerManager.java | 6 +++--- .../bookkeeper/meta/MSLedgerManagerFactory.java | 4 ++-- .../apache/bookkeeper/net/NetworkTopologyImpl.java | 4 ++-- .../bookkeeper/proto/BookieProtoEncoding.java | 8 ++++---- .../bookkeeper/proto/BookieRequestProcessor.java | 10 +++++----- .../org/apache/bookkeeper/proto/BookieServer.java | 4 ++-- .../proto/LongPollReadEntryProcessorV3.java | 4 ++-- .../bookkeeper/proto/PacketProcessorBase.java | 14 +++++--------- .../bookkeeper/proto/PerChannelBookieClient.java | 10 +++++----- .../bookkeeper/proto/ReadEntryProcessor.java | 6 ++++-- .../bookkeeper/proto/ReadEntryProcessorV3.java | 3 ++- .../bookkeeper/replication/ReplicationWorker.java | 2 +- .../apache/bookkeeper/sasl/SaslServerState.java | 2 +- .../apache/bookkeeper/sasl/TGTRefreshThread.java | 4 ++-- .../server/http/service/GetLastLogMarkService.java | 6 +++--- .../service/LostBookieRecoveryDelayService.java | 2 +- .../server/http/service/RecoveryBookieService.java | 2 +- .../server/http/service/TriggerAuditService.java | 2 +- .../server/http/service/WhoIsAuditorService.java | 2 +- .../apache/bookkeeper/tls/TLSContextFactory.java | 5 +++-- .../commands/bookie/ConvertToDBStorageCommand.java | 2 +- .../bookie/ConvertToInterleavedStorageCommand.java | 2 +- .../bookkeeper/zookeeper/ZooKeeperWatcherBase.java | 6 +++--- .../apache/bookkeeper/client/MdcContextTest.java | 14 +++++++------- .../bookkeeper/proto/ReadEntryProcessorTest.java | 2 ++ pom.xml | 2 +- 52 files changed, 133 insertions(+), 130 deletions(-) diff --git a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt index 868168e9335..f66fb0c91a7 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt @@ -216,7 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] -- lib/io.github.merlimat.slog-slog-0.9.7.jar [64] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [64] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -423,7 +423,7 @@ Apache Software License, Version 2. [61] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [62] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [63] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java -[64] Source available at https://github.com/merlimat/slog/tree/v0.9.7 +[64] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt index dd0d123b0ae..8b39fb9a5dd 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt @@ -216,7 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] -- lib/io.github.merlimat.slog-slog-0.9.7.jar [59] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [59] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-common-4.2.12.Final.jar [11] @@ -356,7 +356,7 @@ Apache Software License, Version 2. [56] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [57] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [58] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java -[59] Source available at https://github.com/merlimat/slog/tree/v0.9.7 +[59] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt index b2e9d676dc0..362493a0515 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt @@ -216,7 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] -- lib/io.github.merlimat.slog-slog-0.9.7.jar [63] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [63] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -418,7 +418,7 @@ Apache Software License, Version 2. [60] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [61] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [62] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java -[63] Source available at https://github.com/merlimat/slog/tree/v0.9.7 +[63] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java index 4a3ced37db2..2722c333bd0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java @@ -2751,7 +2751,7 @@ public static void main(String[] argv) { } else { shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(shell.bkConf); } - log.debug().attr("class", shell.ledgerIdFormatter.getClass()).log("Using ledgerIdFormatter"); + log.debug().attr("class", () -> shell.ledgerIdFormatter.getClass()).log("Using ledgerIdFormatter"); // entry format if (cmdLine.hasOption(ENTRY_FORMATTER_OPT)) { @@ -2760,7 +2760,7 @@ public static void main(String[] argv) { } else { shell.entryFormatter = EntryFormatter.newEntryFormatter(shell.bkConf); } - log.debug().attr("class", shell.entryFormatter.getClass()).log("Using entry formatter"); + log.debug().attr("class", () -> shell.entryFormatter.getClass()).log("Using entry formatter"); res = shell.run(cmdLine.getArgs()); } catch (Throwable e) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java index 9dc60f30146..df8afb4d238 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerBase.java @@ -126,7 +126,7 @@ public void flush() throws IOException { void flushLogChannel(BufferedLogChannel logChannel, boolean forceMetadata) throws IOException { if (logChannel != null) { logChannel.flushAndForceWrite(forceMetadata); - log.debug().attr("logId", logChannel.getLogId()).log("Flush and sync current entry logger"); + log.debug().attr("logId", () -> logChannel.getLogId()).log("Flush and sync current entry logger"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java index 1b37b811f91..ee11ee55fd2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogManagerForEntryLogPerLedger.java @@ -336,7 +336,7 @@ private void onCacheEntryRemoval(RemovalNotification Long ledgerId = removedLedgerEntryLogMapEntry.getKey(); log.debug() .attr("ledgerId", ledgerId) - .attr("cause", removedLedgerEntryLogMapEntry.getCause()) + .attr("cause", () -> removedLedgerEntryLogMapEntry.getCause()) .log("LedgerId is being evicted from the cache map"); EntryLogAndLockTuple entryLogAndLockTuple = removedLedgerEntryLogMapEntry.getValue(); if (entryLogAndLockTuple == null) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java index 4d834876d7e..104e6ccc0ef 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java @@ -735,7 +735,7 @@ void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMet if (System.currentTimeMillis() - lastPrintTimestamp >= MINUTE) { lastPrintTimestamp = System.currentTimeMillis(); log.info() - .attr("processed", processedEntryLogCnt.get()) + .attr("processed", () -> processedEntryLogCnt.get()) .attr("totalEntryLogIds", totalEntryLogIds) .attr("logId", logId) .log("Compaction progress"); @@ -746,8 +746,8 @@ void doCompactEntryLogs(double threshold, long maxTimeMillis) throws EntryLogMet return; } log.debug() - .attr("entryLogId", meta.getEntryLogId()) - .attr("usage", meta.getUsage()) + .attr("entryLogId", () -> meta.getEntryLogId()) + .attr("usage", () -> meta.getUsage()) .attr("threshold", threshold) .log("Compacting entry log with usage below threshold"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java index 6f995f67215..f0d537f4d38 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/IndexPersistenceMgr.java @@ -581,7 +581,7 @@ public int compare(LedgerEntryPage o1, LedgerEntryPage o2) { } log.debug() .attr("ledgerId", l) - .attr("size", entries.size()) + .attr("size", () -> entries.size()) .log("Flushed ledger with pages."); } finally { if (fi != null) { @@ -595,7 +595,7 @@ private void writeBuffers(Long ledger, int start, int count) throws IOException, Bookie.NoLedgerException { log.trace() .attr("count", count) - .attr("value", Long.toHexString(ledger)) + .attr("value", () -> Long.toHexString(ledger)) .log("Writing buffers"); if (count == 0) { return; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java index 0fec664fd08..fa1b724622d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/InterleavedLedgerStorage.java @@ -671,12 +671,12 @@ public List localConsistencyCheck(Optional r checkedLedgers++; } log.info() - .attr("value", TimeUnit.NANOSECONDS.toSeconds(MathUtils.elapsedNanos(checkStart))) + .attr("value", () -> TimeUnit.NANOSECONDS.toSeconds(MathUtils.elapsedNanos(checkStart))) .attr("checkedLedgers", checkedLedgers) .attr("checkedPages", checkedPages) - .attr("longValue", checkedEntries.longValue()) - .attr("longValue", pageRetries.longValue()) - .attr("size", errors.size()) + .attr("longValue", () -> checkedEntries.longValue()) + .attr("longValue", () -> pageRetries.longValue()) + .attr("size", () -> errors.size()) .log("Finished localConsistencyCheck, took s to scan ledgers, pages, entries with retries, errors"); return errors; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java index a0f715c214f..ae0ded37211 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java @@ -195,7 +195,7 @@ void rollLog(LastLogMark lastMark) throws NoWritableLedgerDirException { // which is safe since records before lastMark have been // persisted to disk (both index & entry logger) lastMark.getCurMark().writeLogMark(bb); - log.debug().attr("curMark", lastMark.getCurMark()).log("RollLog to persist last marked log"); + log.debug().attr("curMark", () -> lastMark.getCurMark()).log("RollLog to persist last marked log"); List writableLedgerDirs = ledgerDirsManager .getWritableLedgerDirsForNewLog(); @@ -705,7 +705,7 @@ public Journal(int journalIndex, File journalDirectory, ServerConfiguration conf lastMarkFileName = LAST_MARK_DEFAULT_NAME + "." + journalIndex; } lastLogMark.readLog(); - log.debug().attr("lastMark", lastLogMark.getCurMark()).log("Last Log Mark"); + log.debug().attr("lastMark", () -> lastLogMark.getCurMark()).log("Last Log Mark"); try { this.fileChannelProvider = FileChannelProvider.newProvider(conf.getJournalChannelProvider()); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java index 425194336f1..80b6dc5a902 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDescriptorImpl.java @@ -130,7 +130,7 @@ private CompletableFuture logFenceEntryInJournal(Journal journal) { journal.logAddEntry(entry, false /* ackBeforeSync */, (rc, ledgerId, entryId, addr, ctx) -> { log.debug() .attr("ledgerId", ledgerId) - .attr("rc", BKException.codeLogger(rc)) + .attr("rc", () -> BKException.codeLogger(rc)) .log("Record fenced state for ledger in journal"); if (rc == 0) { fenceEntryPersisted.compareAndSet(false, true); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java index ded05be9f6f..40e69752c6d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java @@ -153,7 +153,7 @@ private void check(final LedgerDirsManager ldm) { } else { log.debug() .attr("totalDiskUsage", totalDiskUsage) - .attr("lwmThreshold", conf.getDiskLowWaterMarkUsageThreshold()) + .attr("lwmThreshold", () -> conf.getDiskLowWaterMarkUsageThreshold()) .log("Current TotalDiskUsage is greater than LWMThreshold." + " So not adding any filledDir to WritableDirsList"); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java index 118d9692ddf..708b63da62b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/SingleDirectoryDbLedgerStorage.java @@ -372,7 +372,7 @@ public boolean ledgerExists(long ledgerId) throws IOException { LedgerData ledgerData = ledgerIndex.get(ledgerId); log.debug() .attr("ledgerId", ledgerId) - .attr("exists", ledgerData.getExists()) + .attr("exists", () -> ledgerData.getExists()) .log("Ledger exists"); return ledgerData.getExists(); } catch (Bookie.NoLedgerException nle) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java index c0337f9b083..83901374dbe 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java @@ -1027,7 +1027,7 @@ public void processResult(int rc, String path, Object ctx) { log.debug() .attr("startEntryId", startEntryId) .attr("endEntryId", endEntryId) - .attr("ledgerId", lh.getId()) + .attr("ledgerId", () -> lh.getId()) .attr("bookieAddr", targetBookieAddresses) .log("Replicating fragment"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieInfoReader.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieInfoReader.java index 8249b4e0170..b0f9636534c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieInfoReader.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookieInfoReader.java @@ -336,7 +336,7 @@ synchronized void getReadWriteBookieInfo() { errorCnt = 0; - log.debug().attr("toScan", toScan).log("Getting bookie info"); + log.debug(e -> e.attr("toScan", toScan).log("Getting bookie info")); for (BookieId b : toScan) { bkc.getBookieInfo(b, requested, @@ -348,7 +348,7 @@ void processReadInfoComplete(int rc, BookieInfo bInfo, Object ctx) { log.error() .attr("bookieId", b) - .attr("codeLogger", BKException.codeLogger(rc)) + .attr("codeLogger", () -> BKException.codeLogger(rc)) .log("Reading bookie info from bookie failed"); // We reread bookies missing from the map each time, so remove to ensure @@ -393,7 +393,7 @@ void onExit() { if (errorCnt > 0) { log.info() - .attr("getGetBookieInfoIntervalSeconds", conf.getGetBookieInfoIntervalSeconds()) + .attr("getGetBookieInfoIntervalSeconds", () -> conf.getGetBookieInfoIntervalSeconds()) .log("Rescheduling due to errors"); instanceState.tryStartPartial(); @@ -432,14 +432,14 @@ public void getBookieInfoComplete(int rc, BookieInfo bInfo, Object ctx) { log.error() .attr("bookieId", b) - .attr("codeLogger", BKException.codeLogger(rc)) + .attr("codeLogger", () -> BKException.codeLogger(rc)) .log("Reading bookie info from bookie failed"); } else { log.debug() .attr("bookieId", b) - .attr("getFreeDiskSpace", bInfo.getFreeDiskSpace()) + .attr("getFreeDiskSpace", () -> bInfo.getFreeDiskSpace()) .log("Free disk space on bookie"); map.put(b, bInfo); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java index 79546840ae8..3daaeb35d61 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/EnsembleUtils.java @@ -55,7 +55,7 @@ static List replaceBookiesInEnsemble(BookieWatcher bookieWatcher, BookieId addr = entry.getValue(); log.debug() - .attr("ledgerId", metadata.getLedgerId()) + .attr("ledgerId", () -> metadata.getLedgerId()) .attr("ensembleChangeId", ensembleChangeId) .attr("bookieAddr", addr) .attr("idx", idx) @@ -63,11 +63,11 @@ static List replaceBookiesInEnsemble(BookieWatcher bookieWatcher, if (!newEnsemble.get(idx).equals(addr)) { log.debug() - .attr("ledgerId", metadata.getLedgerId()) + .attr("ledgerId", () -> metadata.getLedgerId()) .attr("ensembleChangeId", ensembleChangeId) .attr("bookieAddr", addr) .attr("idx", idx) - .attr("newBookie", newEnsemble.get(idx)) + .attr("newBookie", () -> newEnsemble.get(idx)) .log("Not changing failed bookie at index, already changed"); continue; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java index d62d49a121b..424c546934d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ExplicitLacFlushPolicy.java @@ -90,9 +90,9 @@ public void run() { // bookies. if (getExplicitLac() < getPiggyBackedLac()) { log.debug() - .attr("ledgerId", lh.getId()) - .attr("explicitLac", getExplicitLac()) - .attr("piggyBackedLac", getPiggyBackedLac()) + .attr("ledgerId", () -> lh.getId()) + .attr("explicitLac", () -> getExplicitLac()) + .attr("piggyBackedLac", () -> getPiggyBackedLac()) .log("explicitLac / piggybackLac"); setExplicitLac(getPiggyBackedLac()); @@ -101,15 +101,15 @@ public void run() { if (lh.getLastAddConfirmed() > getExplicitLac()) { // Send Explicit LAC - log.debug().attr("ledgerId", lh.getId()).log("Send explicit LAC"); + log.debug().attr("ledgerId", () -> lh.getId()).log("Send explicit LAC"); asyncExplicitLacFlush(lh.getLastAddConfirmed()); setExplicitLac(lh.getLastAddConfirmed()); log.debug() - .attr("ledgerId", lh.getId()) - .attr("getLastAddConfirmed", lh.getLastAddConfirmed()) - .attr("explicitLac", getExplicitLac()) + .attr("ledgerId", () -> lh.getId()) + .attr("getLastAddConfirmed", () -> lh.getLastAddConfirmed()) + .attr("explicitLac", () -> getExplicitLac()) .log("After sending explict LAC lac"); } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java index 9714803d5df..1c37d3c54a0 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java @@ -2277,7 +2277,7 @@ void ensembleChangeLoop(List origEnsemble, Map fail log.debug() .attr("ensembleChangeId", ensembleChangeId) - .attr("attempts", attempts.get()) + .attr("attempts", () -> attempts.get()) .attr("currentEnsemble", currentEnsemble) .attr("newEnsemble", newEnsemble) .attr("newEnsembleStartEntry", newEnsembleStartEntry) @@ -2302,7 +2302,7 @@ void ensembleChangeLoop(List origEnsemble, Map fail } else if (metadata.getValue().isClosed()) { log.debug() .attr("ensembleChangeId", ensembleChangeId) - .attr("attempts", attempts.get()) + .attr("attempts", () -> attempts.get()) .log("Metadata closed during attempt to replace bookie." + " Another client must have recovered the ledger."); @@ -2310,7 +2310,7 @@ void ensembleChangeLoop(List origEnsemble, Map fail } else if (metadata.getValue().getState() == LedgerMetadata.State.IN_RECOVERY) { log.debug() .attr("ensembleChangeId", ensembleChangeId) - .attr("attempts", attempts.get()) + .attr("attempts", () -> attempts.get()) .log("Metadata marked as in-recovery during attempt to replace bookie." + " Another client must be recovering the ledger."); @@ -2318,7 +2318,7 @@ void ensembleChangeLoop(List origEnsemble, Map fail } else { log.debug() .attr("ensembleChangeId", ensembleChangeId) - .attr("get", attempts.get()) + .attr("get", () -> attempts.get()) .log("Success updating metadata"); List newEnsemble = null; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java index 855564304e4..66db8045497 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/MetadataUpdateLoop.java @@ -128,7 +128,7 @@ private void writeLoop(Versioned currentLocal, CompletableFuture> promise) { log.debug() - .attr("attempt", WRITE_LOOP_COUNT_UPDATER.incrementAndGet(this)) + .attr("attempt", () -> WRITE_LOOP_COUNT_UPDATER.incrementAndGet(this)) .log("Starting write loop iteration"); try { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java index cd55eb69ee5..4580e9acbd3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingAddOp.java @@ -362,7 +362,7 @@ public synchronized void writeComplete(int rc, long ledgerId, long entryId, Book .attr("entryId", entryId) .attr("bookieIndex", bookieIndex) .attr("bookieAddr", addr) - .attr("error", BKException.getMessage(rc)) + .attr("error", () -> BKException.getMessage(rc)) .log("Failed to write entry to bookie," + " but it didn't break ack quorum, delaying ensemble change"); } @@ -419,7 +419,7 @@ void sendAddSuccessCallbacks() { synchronized void submitCallback(final int rc) { log.debug() - .attr("ledgerId", lh.getId()) + .attr("ledgerId", () -> lh.getId()) .attr("entryId", entryId) .attr("rc", rc) .log("Submit callback"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java index c96319cb30a..531b9766cd3 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java @@ -983,10 +983,11 @@ DistributionSchedule.WriteSet reorderReadSequenceWithRegion( // things may have changed by then so much that whichever bookie we put second // may actually not be the second-best choice any more. + final int bestBookieIdxRef = bestBookieIdx; log.debug() - .attr("fromBookie", ensemble.get(writeSet.get(0))) + .attr("fromBookie", () -> ensemble.get(writeSet.get(0))) .attr("fromPending", pendingReqs[0]) - .attr("toBookie", ensemble.get(writeSet.get(bestBookieIdx))) + .attr("toBookie", () -> ensemble.get(writeSet.get(bestBookieIdxRef))) .attr("toPending", pendingReqs[bestBookieIdx]) .log("read set reordered"); @@ -1175,8 +1176,8 @@ public boolean areAckedBookiesAdheringToPlacementPolicy(Set ackedBooki // Check to make sure that ensemble is writing to `minNumberOfRacks`'s number of racks at least. log.debug() - .attr("result", rackCounter.size() >= minNumRacksPerWriteQuorum) - .attr("rackCount", rackCounter.size()) + .attr("result", () -> rackCounter.size() >= minNumRacksPerWriteQuorum) + .attr("rackCount", () -> rackCounter.size()) .attr("minNumRacksPerWriteQuorum", minNumRacksPerWriteQuorum) .log("areAckedBookiesAdheringToPlacementPolicy returning because number of racks" + " and minNumRacksPerWriteQuorum"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java index e187192d8c1..2b7ebaaaf6a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ReadLastConfirmedAndEntryOp.java @@ -204,7 +204,7 @@ synchronized void logErrorAndReattemptRead(int bookieIndex, BookieId host, Strin log.debug() .attr("error", errMsg) - .attr("entryId", entryImpl.getEntryId()) + .attr("entryId", () -> entryImpl.getEntryId()) .attr("bookieAddr", host) .log("Error while reading entry from bookie"); @@ -581,7 +581,7 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffe numResponsesPending--; if (BKException.Code.OK == rc) { log.trace() - .attr("getLastAddConfirmed", rCtx.getLastAddConfirmed()) + .attr("getLastAddConfirmed", () -> rCtx.getLastAddConfirmed()) .attr("bookieAddr", bookie) .log("Received lastAddConfirmed"); @@ -619,15 +619,15 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffe completeRequest(); } else if (emptyResponsesFromHostsBitSet.cardinality() >= numEmptyResponsesAllowed) { log.debug() - .attr("cardinality", emptyResponsesFromHostsBitSet.cardinality()) + .attr("cardinality", () -> emptyResponsesFromHostsBitSet.cardinality()) .attr("emptyResponsesFromHostsBitSet", emptyResponsesFromHostsBitSet) .log("Completed readLACAndEntry after received empty responses"); completeRequest(); } else { log.debug() - .attr("bookieAddr", rCtx.getBookieAddress()) - .attr("bookieAddr", rCtx.getBookieAddress()) + .attr("bookieAddr", () -> rCtx.getBookieAddress()) + .attr("bookieAddr", () -> rCtx.getBookieAddress()) .attr("lastAddConfirmed", lastAddConfirmed) .log("Received empty response from bookie, reattempting reading next bookie"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java index 8503739c1b4..02959b1bc9a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/SyncCallbackUtils.java @@ -198,7 +198,7 @@ public void addLacComplete(int rc, LedgerHandle lh, Object ctx) { if (rc != BKException.Code.OK) { log.warn().attr("error", BKException.getMessage(rc)).log("LastAddConfirmedUpdate failed"); } else { - log.debug().attr("ledgerId", lh.getId()).log("Callback LAC Updated"); + log.debug().attr("ledgerId", () -> lh.getId()).log("Callback LAC Updated"); } } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java index 27303de0075..729f03d0aaf 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TryReadLastConfirmedOp.java @@ -80,8 +80,8 @@ public void readEntryComplete(int rc, long ledgerId, long entryId, ByteBuf buffe RecoveryData recoveryData = lh.macManager.verifyDigestAndReturnLastConfirmed(buffer); log.trace() - .attr("lastAddConfirmed", recoveryData.getLastAddConfirmed()) - .attr("length", recoveryData.getLength()) + .attr("lastAddConfirmed", () -> recoveryData.getLastAddConfirmed()) + .attr("length", () -> recoveryData.getLength()) .attr("bookieIndex", bookieIndex) .attr("ledgerId", ledgerId) .log("Received lastAddConfirmed"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java index bbb036f3e69..da1406f2c69 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/WeightedRandomSelectionImpl.java @@ -114,8 +114,8 @@ public int compare(WeightedObject o1, WeightedObject o2) { log.debug() .attr("weightedProbability", weightedProbability) - .attr("key", e.getKey()) - .attr("value", e.getValue()) + .attr("key", () -> e.getKey()) + .attr("value", () -> e.getValue()) .log("Capping the probability"); } @@ -131,10 +131,10 @@ public int compare(WeightedObject o1, WeightedObject o2) { tmpCumulativeMap.put(key, e.getKey()); log.debug() - .attr("key", e.getKey()) - .attr("value", e.getValue()) + .attr("key", () -> e.getKey()) + .attr("value", () -> e.getValue()) .attr("assignedKey", key) - .attr("assignedValue", e.getValue()) + .attr("assignedValue", () -> e.getValue()) .log("Assigned weight"); key += e.getValue(); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java index 1cccad34804..716df58f8df 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java @@ -887,7 +887,7 @@ public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(List ensembleList.size()) .attr("writeQuorumSize", writeQuorumSize) .log("ensembleSize is not a multiple of writeQuorumSize"); @@ -1013,8 +1013,8 @@ public boolean areAckedBookiesAdheringToPlacementPolicy(Set ackedBooki log.debug() .attr("areAckedBookiesAdheringToPlacementPolicy", areAckedBookiesAdheringToPlacementPolicy) - .attr("size", ackedBookies.size()) - .attr("size", zonesOfAckedBookies.size()) + .attr("size", () -> ackedBookies.size()) + .attr("size", () -> zonesOfAckedBookies.size()) .attr("minNumZonesPerWriteQuorumForThisEnsemble", minNumZonesPerWriteQuorumForThisEnsemble) .log("areAckedBookiesAdheringToPlacementPolicy"); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java index 3a2d53a06d6..95cd056fca2 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java @@ -129,7 +129,7 @@ private void handleMetadata(Versioned result, Throwable exceptio if (null != listenerSet) { log.debug() .attr("ledgerId", ledgerId) - .attr("listenerCount", listenerSet.size()) + .attr("listenerCount", () -> listenerSet.size()) .log("Removed ledger metadata listener set as ledger is deleted"); // notify `null` as indicator that a ledger is deleted // make this behavior consistent with `NodeDeleted` watched event. @@ -261,8 +261,8 @@ public void process(WatchedEvent event) { break; default: log.debug() - .attr("eventType", event.getType()) - .attr("path", event.getPath()) + .attr("eventType", () -> event.getType()) + .attr("path", () -> event.getPath()) .log("Received event"); break; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java index 482b0520a57..c22a6ff6b78 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java @@ -248,7 +248,7 @@ private void handleMetadata(Versioned metadata, Throwable except if (null != listenerSet) { log.debug() .attr("ledgerId", ledgerId) - .attr("metadata", metadata.getValue()) + .attr("metadata", () -> metadata.getValue()) .log("Ledger metadata is changed"); scheduler.submit(() -> { synchronized (listenerSet) { @@ -265,7 +265,7 @@ private void handleMetadata(Versioned metadata, Throwable except if (null != listenerSet) { log.debug() .attr("ledgerId", ledgerId) - .attr("listenerCount", listenerSet.size()) + .attr("listenerCount", () -> listenerSet.size()) .log("Removed ledger metadata listener set as ledger is deleted"); } } else { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java index a0722f6c857..81c2363c1c8 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java @@ -438,7 +438,7 @@ public void add(Node node) { } } } - log.debug().attr("topology", this.toString()).log("NetworkTopology became"); + log.debug().attr("topology", () -> this.toString()).log("NetworkTopology became"); } finally { netlock.writeLock().unlock(); } @@ -510,7 +510,7 @@ public void remove(Node node) { depthOfAllLeaves = -1; } } - log.debug().attr("topology", this.toString()).log("NetworkTopology became"); + log.debug().attr("topology", () -> this.toString()).log("NetworkTopology became"); } finally { netlock.writeLock().unlock(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java index b1427b09371..403813be6e6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieProtoEncoding.java @@ -510,7 +510,7 @@ public RequestEncoder(ExtensionRegistry extensionRegistry) { public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { log.trace() .attr("msg", msg) - .attr("channel", ctx.channel()) + .attr("channel", () -> ctx.channel()) .log("Encode request to channel"); if (msg instanceof ByteBuf || msg instanceof ByteBufList) { ctx.write(msg, promise); @@ -547,7 +547,7 @@ public static class RequestDecoder extends ChannelInboundHandlerAdapter { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.trace() .attr("msg", msg) - .attr("channel", ctx.channel()) + .attr("channel", () -> ctx.channel()) .log("Received request from channel to decode"); try { if (!(msg instanceof ByteBuf)) { @@ -596,7 +596,7 @@ public static class ResponseEncoder extends ChannelOutboundHandlerAdapter { public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { log.trace() .attr("msg", msg) - .attr("channel", ctx.channel()) + .attr("channel", () -> ctx.channel()) .log("Encode response to channel"); if (msg instanceof ByteBuf) { @@ -640,7 +640,7 @@ public static class ResponseDecoder extends ChannelInboundHandlerAdapter { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.trace() .attr("msg", msg) - .attr("channel", ctx.channel()) + .attr("channel", () -> ctx.channel()) .log("Received response from channel to decode"); try { if (!(msg instanceof ByteBuf)) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java index 1688a04a85a..762f7220b43 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieRequestProcessor.java @@ -464,8 +464,8 @@ private void processAddRequestV3(final BookkeeperProtocol.Request r, final Booki try { threadPool.executeOrdered(r.getAddRequest().getLedgerId(), write); } catch (RejectedExecutionException e) { - log.debug().attr("ledgerId", r.getAddRequest().getLedgerId()) - .attr("entryId", r.getAddRequest().getEntryId()) + log.debug().attr("ledgerId", () -> r.getAddRequest().getLedgerId()) + .attr("entryId", () -> r.getAddRequest().getEntryId()) .log("Failed to process request to add entry. Too many pending requests"); getRequestStats().getAddEntryRejectedCounter().inc(); BookkeeperProtocol.AddResponse.Builder addResponse = BookkeeperProtocol.AddResponse.newBuilder() @@ -499,7 +499,7 @@ private void processForceLedgerRequestV3(final BookkeeperProtocol.Request r, try { threadPool.executeOrdered(r.getForceLedgerRequest().getLedgerId(), forceLedger); } catch (RejectedExecutionException e) { - log.debug().attr("ledgerId", r.getForceLedgerRequest().getLedgerId()) + log.debug().attr("ledgerId", () -> r.getForceLedgerRequest().getLedgerId()) .log("Failed to process request to force ledger. Too many pending requests"); BookkeeperProtocol.ForceLedgerResponse.Builder forceLedgerResponse = BookkeeperProtocol.ForceLedgerResponse.newBuilder() @@ -551,8 +551,8 @@ private void processReadRequestV3(final BookkeeperProtocol.Request r, final Book try { threadPool.executeOrdered(r.getReadRequest().getLedgerId(), read); } catch (RejectedExecutionException e) { - log.debug().attr("ledgerId", r.getReadRequest().getLedgerId()) - .attr("entryId", r.getReadRequest().getEntryId()) + log.debug().attr("ledgerId", () -> r.getReadRequest().getLedgerId()) + .attr("entryId", () -> r.getReadRequest().getEntryId()) .log("Failed to process request to read entry. Too many pending requests"); getRequestStats().getReadEntryRejectedCounter().inc(); BookkeeperProtocol.ReadResponse.Builder readResponse = BookkeeperProtocol.ReadResponse.newBuilder() diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java index daf233a60ee..30727a8f9e8 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java @@ -175,7 +175,7 @@ public BookieRequestProcessor getBookieRequestProcessor() { */ @VisibleForTesting public void suspendProcessing() { - log.debug().attr("port", conf.getBookiePort()).log("Suspending bookie server"); + log.debug().attr("port", () -> conf.getBookiePort()).log("Suspending bookie server"); nettyServer.suspendProcessing(); } @@ -184,7 +184,7 @@ public void suspendProcessing() { */ @VisibleForTesting public void resumeProcessing() { - log.debug().attr("port", conf.getBookiePort()).log("Resuming bookie server"); + log.debug().attr("port", () -> conf.getBookiePort()).log("Resuming bookie server"); nettyServer.resumeProcessing(); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java index 014065cf051..67c82dda977 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/LongPollReadEntryProcessorV3.java @@ -166,7 +166,7 @@ private ReadResponse getLongPollReadResponse() { // successfully registered watcher to lac updates log.trace() .attr("previousLAC", previousLAC) - .attr("timeout", readRequest.getTimeOut()) + .attr("timeout", () -> readRequest.getTimeOut()) .log("Waiting For LAC Update"); synchronized (this) { expirationTimerTask = requestTimer.newTimeout(timeout -> { @@ -197,7 +197,7 @@ public void update(LastAddConfirmedUpdateNotification newLACNotification) { if (newLACNotification.getLastAddConfirmed() != Long.MAX_VALUE && !lastAddConfirmedUpdateTime.isPresent()) { lastAddConfirmedUpdateTime = Optional.of(newLACNotification.getTimestamp()); } - log.trace().attr("lastAddConfirmed", newLACNotification.getLastAddConfirmed()) + log.trace().attr("lastAddConfirmed", () -> newLACNotification.getLastAddConfirmed()) .attr("request", request).log("Last Add Confirmed Advanced"); scheduleDeferredRead(false); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java index bbbf730ecd9..b6526417c7e 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PacketProcessorBase.java @@ -125,15 +125,11 @@ protected void sendResponse(int rc, Object response, OpStatsLogger statsLogger) } if (channel.isActive()) { - final ChannelPromise promise = channel.newPromise(); - - log.debug(e -> - promise.addListener(future -> { - if (!future.isSuccess()) { - e.exception(future.cause()).log("Netty channel write exception"); - } - }) - ); + final ChannelPromise promise = channel.newPromise().addListener(future -> { + if (!future.isSuccess()) { + log.debug().exception(future.cause()).log("Netty channel write exception"); + } + }); channel.writeAndFlush(response, promise); } else { if (response instanceof BookieProtocol.Response) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java index fed67ffae72..175b3228188 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/PerChannelBookieClient.java @@ -1543,8 +1543,8 @@ private void readV3Response(final Response response) { if (null == completionValue) { // Unexpected response, so log it. The txnId should have been present. - log.debug().attr("operationType", header.getOperation()) - .attr("txnId", header.getTxnId()) + log.debug().attr("operationType", () -> header.getOperation()) + .attr("txnId", () -> header.getTxnId()) .log("Unexpected response received from bookie"); } else { long orderingKey = completionValue.ledgerId; @@ -1748,8 +1748,8 @@ class ConnectionFutureListener implements ChannelFutureListener { @Override public void operationComplete(ChannelFuture future) { log.debug() - .attr("success", future.isSuccess()) - .attr("channel", future.channel()) + .attr("success", () -> future.isSuccess()) + .attr("channel", () -> future.channel()) .log("Channel connected"); int rc; Queue> oldPendingOps; @@ -1801,7 +1801,7 @@ public void operationComplete(ChannelFuture future) { } else if (future.isSuccess() && state == ConnectionState.CONNECTED) { log.debug() .attr("existingChannel", channel) - .attr("newChannel", future.channel()) + .attr("newChannel", () -> future.channel()) .log("Already connected with another channel, so close the new channel"); closeChannel(future.channel()); return; // pendingOps should have been completed when other channel connected diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java index 25c8bf3aa3a..29cd159788b 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessor.java @@ -59,7 +59,8 @@ public static ReadEntryProcessor create(ReadRequest request, protected void processPacket() { log.debug().attr("request", request).log("Received new read request"); if (!requestHandler.ctx().channel().isOpen()) { - log.debug().attr("channel", requestHandler.ctx().channel()).log("Dropping read request for closed channel"); + log.debug().attr("channel", () -> requestHandler.ctx().channel()) + .log("Dropping read request for closed channel"); requestProcessor.onReadRequestFinish(); recycle(); return; @@ -83,7 +84,8 @@ protected void processPacket() { } } data = readData(); - log.debug().attr("refCount", data.refCnt()).log("Read entry"); + final ReferenceCounted dataRef = data; + log.debug().attr("refCount", () -> dataRef.refCnt()).log("Read entry"); if (fenceResult != null) { handleReadResultForFenceRead(fenceResult, data, startTimeNanos); return; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java index 7f26c8aca48..118d5a66da6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ReadEntryProcessorV3.java @@ -275,7 +275,8 @@ public void run() { requestProcessor.getRequestStats().getReadEntrySchedulingDelayStats().registerSuccessfulEvent( MathUtils.elapsedNanos(enqueueNanos), TimeUnit.NANOSECONDS); if (!requestHandler.ctx().channel().isOpen()) { - log.debug().attr("channel", requestHandler.ctx().channel()).log("Dropping read request for closed channel"); + log.debug().attr("channel", () -> requestHandler.ctx().channel()) + .log("Dropping read request for closed channel"); requestProcessor.onReadRequestFinish(); return; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java index e79901ccbeb..992d9d7f891 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java @@ -594,7 +594,7 @@ private boolean isLastSegmentOpenAndMissingBookies(LedgerHandle lh) throws BKExc if (!available.contains(b)) { log.debug() .attr("bookie", b) - .attr("ledgerId", lh.getId()) + .attr("ledgerId", () -> lh.getId()) .attr("ensemble", finalEnsemble) .log("Bookie is missing from the list of Available Bookies"); return true; diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java index c2dd854f443..6ead9991dfc 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/SaslServerState.java @@ -201,7 +201,7 @@ private void handlePasswordCallback(PasswordCallback pc) { } private void handleRealmCallback(RealmCallback rc) { - log.debug().attr("realm", rc.getDefaultText()).log("client supplied realm"); + log.debug().attr("realm", () -> rc.getDefaultText()).log("client supplied realm"); rc.setText(rc.getDefaultText()); } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java index c49e2dd2478..9cd2fa1ad45 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/sasl/TGTRefreshThread.java @@ -63,8 +63,8 @@ private synchronized KerberosTicket getTGT() { for (KerberosTicket ticket : tickets) { KerberosPrincipal server = ticket.getServer(); if (server.getName().equals("krbtgt/" + server.getRealm() + "@" + server.getRealm())) { - log.debug().attr("clientPrincipal", ticket.getClient().getName()).log("Client principal"); - log.debug().attr("serverPrincipal", ticket.getServer().getName()).log("Server principal"); + log.debug().attr("clientPrincipal", () -> ticket.getClient().getName()).log("Client principal"); + log.debug().attr("serverPrincipal", () -> ticket.getServer().getName()).log("Server principal"); return ticket; } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java index c2fa091cdb7..9923d64254d 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLastLogMarkService.java @@ -81,9 +81,9 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { } for (Journal journal : journals) { LogMark lastLogMark = journal.getLastLogMark().getCurMark(); - log.debug().attr("journalId", lastLogMark.getLogFileId()) - .attr("journalIdHex", Long.toHexString(lastLogMark.getLogFileId())) - .attr("position", lastLogMark.getLogFileOffset()) + log.debug().attr("journalId", () -> lastLogMark.getLogFileId()) + .attr("journalIdHex", () -> Long.toHexString(lastLogMark.getLogFileId())) + .attr("position", () -> lastLogMark.getLogFileOffset()) .log("LastLogMark"); output.put("LastLogMark: Journal Id - " + lastLogMark.getLogFileId() + "(" + Long.toHexString(lastLogMark.getLogFileId()) + ".txn)", diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java index f8b7023d9a2..b1b8a976eaf 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/LostBookieRecoveryDelayService.java @@ -84,7 +84,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { int delaySeconds = bka.getLostBookieRecoveryDelay(); response.setCode(HttpServer.StatusCode.OK); response.setBody("lostBookieRecoveryDelay value: " + delaySeconds); - log.debug().attr("body", response.getBody()).log("response body"); + log.debug().attr("body", () -> response.getBody()).log("response body"); return response; } catch (Exception e) { // may get noNode exception diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java index 9589f49eefe..65799a574ed 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/RecoveryBookieService.java @@ -90,7 +90,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { try { requestJsonBody = JsonUtil.fromJson(requestBody, RecoveryRequestJsonBody.class); - log.debug().attr("bookieSrc", requestJsonBody.bookieSrc.get(0)) + log.debug().attr("bookieSrc", () -> requestJsonBody.bookieSrc.get(0)) .attr("deleteCookie", requestJsonBody.deleteCookie) .log("recovery request"); } catch (JsonUtil.ParseJsonException e) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java index 86ff8a34826..92965e42436 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/TriggerAuditService.java @@ -64,7 +64,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setCode(HttpServer.StatusCode.OK); response.setBody("Success trigger audit."); - log.debug().attr("body", response.getBody()).log("response body"); + log.debug().attr("body", () -> response.getBody()).log("response body"); return response; } else { response.setCode(HttpServer.StatusCode.NOT_FOUND); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java index f8887eb7a58..336f98fc97f 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/WhoIsAuditorService.java @@ -73,7 +73,7 @@ public HttpServiceResponse handle(HttpServiceRequest request) throws Exception { response.setCode(HttpServer.StatusCode.OK); response.setBody("Auditor: " + bookieId); - log.debug().attr("body", response.getBody()).log("response body"); + log.debug().attr("body", () -> response.getBody()).log("response body"); return response; } else { response.setCode(HttpServer.StatusCode.NOT_FOUND); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java index 77e425ede29..bdb4664c5ee 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tls/TLSContextFactory.java @@ -76,7 +76,8 @@ public static Provider getProvider() { Provider provider = Security.getProvider(BC) != null ? Security.getProvider(BC) : Security.getProvider(BC_FIPS); - log.debug().attr("provider", provider.getName()).log("Already instantiated Bouncy Castle provider"); + log.debug().attr("provider", () -> provider.getName()) + .log("Already instantiated Bouncy Castle provider"); return provider; } @@ -112,7 +113,7 @@ public static Provider getBCProviderFromClassPath() throws Exception { Provider provider = (Provider) clazz.getDeclaredConstructor().newInstance(); Security.addProvider(provider); log.debug() - .attr("provider", provider.getName()) + .attr("provider", () -> provider.getName()) .log("Found and Instantiated Bouncy Castle provider in classpath"); return provider; } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java index 03a2d54a509..5d7860d68cd 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToDBStorageCommand.java @@ -84,7 +84,7 @@ private boolean handle(ServerConfiguration conf) throws Exception { int convertedLedgers = 0; for (long ledgerId : interleavedStorage.getActiveLedgersInRange(0, Long.MAX_VALUE)) { - log.debug().attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); + log.debug().attr("ledgerId", () -> ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); LedgerCache.LedgerIndexMetadata fi = interleavedStorage.readLedgerIndexMetadata(ledgerId); diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java index 3c403cf3efa..96b03b6e6a6 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ConvertToInterleavedStorageCommand.java @@ -127,7 +127,7 @@ public void start() { int convertedLedgers = 0; for (long ledgerId : dbStorage.getActiveLedgersInRange(0, Long.MAX_VALUE)) { - log.debug().attr("ledgerId", ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); + log.debug().attr("ledgerId", () -> ledgerIdFormatter.formatLedgerId(ledgerId)).log("Converting ledger"); interleavedStorage.setMasterKey(ledgerId, dbStorage.readMasterKey(ledgerId)); if (dbStorage.isFenced(ledgerId)) { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java index eee35f5eb7a..806bf907715 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/zookeeper/ZooKeeperWatcherBase.java @@ -113,8 +113,8 @@ public void process(WatchedEvent event) { // If event type is NONE, this is a connection status change if (event.getType() != EventType.None) { log.debug() - .attr("eventType", event.getType()) - .attr("path", event.getPath()) + .attr("eventType", () -> event.getType()) + .attr("path", () -> event.getPath()) .log("Received event from ZooKeeper server"); getEventCounter(event.getType()).inc(); // notify the child watchers @@ -122,7 +122,7 @@ public void process(WatchedEvent event) { return; } getStateCounter(event.getState()).inc(); - log.debug().attr("state", event.getState()).log("Received state from ZooKeeper server"); + log.debug().attr("state", () -> event.getState()).log("Received state from ZooKeeper server"); // TODO: Needs to handle AuthFailed, SaslAuthenticated events // {@link https://github.com/apache/bookkeeper/issues/284} switch (event.getState()) { diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java index 2a7a15ca253..923b10a88dd 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java @@ -197,10 +197,10 @@ public void testAddFailsWithReadOnlyBookie() throws Exception { assertLogWithMdc("ledger_add_entry", "No writable ledger dirs below diskUsageThreshold"); assertLogWithMdc("ledger_add_entry", "All ledger directories are non writable and no reserved space"); - assertLogWithMdc("ledger_add_entry", "Error writing entry:0 to ledger:0"); - assertLogWithMdc("ledger_add_entry", "Add for failed on bookie"); - assertLogWithMdc("ledger_add_entry", "Failed to find 1 bookies"); - assertLogWithMdc("ledger_add_entry", "Closing ledger 0 due to NotEnoughBookiesException"); + assertLogWithMdc("ledger_add_entry", "Error writing entry to ledger"); + assertLogWithMdc("ledger_add_entry", "Operation failed on bookie"); + assertLogWithMdc("ledger_add_entry", "Failed to find bookies"); + assertLogWithMdc("ledger_add_entry", "Closing ledger"); } @Test @@ -215,7 +215,7 @@ public void testAddFailsDuplicateEntry() throws Exception { // expected, pass } - assertLogWithMdc("ledger_add_duplicate_entry", "Trying to re-add duplicate entryid:0"); + assertLogWithMdc("ledger_add_duplicate_entry", "Trying to re-add duplicate entryId"); assertLogWithMdc("ledger_add_duplicate_entry", "Write of ledger entry to quorum failed"); } @@ -229,7 +229,7 @@ public void testReadEntryBeyondLac() throws Exception { } catch (BKException.BKReadException e) { // pass } - assertLogWithMdc("ledger_read_entry", "ReadEntries exception on ledgerId:0 firstEntry:100 lastEntry:100"); + assertLogWithMdc("ledger_read_entry", "ReadEntries exception"); } @Test @@ -246,7 +246,7 @@ public void testReadFromDeletedLedger() throws Exception { } catch (BKException.BKReadException e) { // pass } - assertLogWithMdc("ledger_read_entry", "ReadEntries exception on ledgerId:0 firstEntry:100 lastEntry:100"); + assertLogWithMdc("ledger_read_entry", "ReadEntries exception"); } } diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/ReadEntryProcessorTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/ReadEntryProcessorTest.java index 2cdf744f24b..bd308c6b3f6 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/ReadEntryProcessorTest.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/proto/ReadEntryProcessorTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.RETURNS_SELF; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -78,6 +79,7 @@ public void setup() throws IOException, BookieException { when(requestProcessor.getWaitTimeoutOnBackpressureMillis()).thenReturn(-1L); when(requestProcessor.getRequestStats()).thenReturn(new RequestStats(NullStatsLogger.INSTANCE)); when(channel.voidPromise()).thenReturn(mock(ChannelPromise.class)); + when(channel.newPromise()).thenReturn(mock(ChannelPromise.class, RETURNS_SELF)); when(channel.writeAndFlush(any())).thenReturn(mock(ChannelPromise.class)); EventLoop eventLoop = mock(EventLoop.class); diff --git a/pom.xml b/pom.xml index 3de84676b52..d18f145ed76 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ 9.9.3 3.3.0 2.0.12 - 0.9.7 + 0.9.8 2.0 4.6.0 2.43.0 From 211c522315c2d46be6d1ab3f4db17b03483eb88e Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Sat, 25 Apr 2026 09:17:45 -0700 Subject: [PATCH 4/5] Restore ' entries written to ledger ' message format The slog conversion of SimpleTestCommand turned the original LOG.info("{} entries written to ledger {}", numEntries, ledgerId) into a structured form that lost the substring TestCLI and TestBookieShellCluster's test001_SimpleTest assert on ("100 entries written to ledger"). The default log4j2 PatternLayout in the bookkeeper image prints %m only, so the structured attrs are not visible to the integration tests that inspect command stdout. Use logf() to bake the values into the message so it again matches the integration-test expectations. The progress-line log on line 118 similarly drops a non-descriptive single-letter "i" attr in favor of the formatted ' entries written'. --- .../tools/cli/commands/client/SimpleTestCommand.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java index 236d7319b0d..e6ca67b44aa 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/SimpleTestCommand.java @@ -115,16 +115,13 @@ protected void run(BookKeeper bk, Flags flags) throws Exception { wh.append(data); if (TimeUnit.SECONDS.convert(System.nanoTime() - lastReport, TimeUnit.NANOSECONDS) > 1) { - log.info().attr("i", i).log("entries written"); + log.info().logf("%d entries written", i); lastReport = System.nanoTime(); } } lastEntryId = wh.getLastAddPushed(); - log.info() - .attr("numEntries", flags.numEntries) - .attr("ledgerId", ledgerId) - .attr("lastEntryId", lastEntryId) - .log("Entries written to ledger"); + log.info().logf("%d entries written to ledger %d (lastEntryId %d)", + flags.numEntries, ledgerId, lastEntryId); if (lastEntryId != flags.numEntries - 1) { throw new IllegalStateException("Last entry id doesn't match the expected value"); } From e9b63bf892167da74b4d32fc6bc345ef3b18c8ae Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Sat, 25 Apr 2026 18:40:21 -0700 Subject: [PATCH 5/5] Restore 'LastLogMark : Journal' message format in lastmark CLI Same regression as SimpleTestCommand: the slog conversion lost the verbatim message text 'LastLogMark : Journal Id - (.txn), Pos - ' that the integration test BkCtlTest.showLastMark asserts on. Default log4j2 PatternLayout prints %m only, so structured attrs are not visible to integration tests that inspect command stdout. Use logf() to bake the values into the message. --- .../tools/cli/commands/bookie/LastMarkCommand.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java index 9025eb56d19..f14544de032 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/LastMarkCommand.java @@ -65,11 +65,10 @@ public boolean apply(ServerConfiguration conf, CliFlags flags) { for (int idx = 0; idx < journalDirs.length; idx++) { Journal journal = new Journal(idx, journalDirs[idx], conf, dirsManager); LogMark lastLogMark = journal.getLastLogMark().getCurMark(); - log.info() - .attr("logFileId", lastLogMark.getLogFileId()) - .attr("logFile", Long.toHexString(lastLogMark.getLogFileId()) + ".txn") - .attr("logFileOffset", lastLogMark.getLogFileOffset()) - .log("LastLogMark"); + log.info().logf("LastLogMark : Journal Id - %d(%s.txn), Pos - %d", + lastLogMark.getLogFileId(), + Long.toHexString(lastLogMark.getLogFileId()), + lastLogMark.getLogFileOffset()); } return true; } catch (IOException e) {